├── .gitattributes ├── .gitignore ├── Dockerfile.build ├── Makefile ├── bootstrap ├── Cargo.toml ├── build.rs ├── src │ ├── fc_runtime.js │ └── main.rs └── Cargo.lock ├── s.yaml ├── README.md └── .github └── workflows └── ci.yml /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.log 2 | .cache 3 | .DS_Store 4 | *bak 5 | .history 6 | .s/ 7 | pkg/ 8 | target/ 9 | -------------------------------------------------------------------------------- /Dockerfile.build: -------------------------------------------------------------------------------- 1 | FROM python:3.7.4-stretch 2 | RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | bash -s -- -y 3 | RUN echo 'export PATH=$HOME/.cargo/bin:$PATH' >> $HOME/.bashrc 4 | CMD ["bash"] -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | build-img: 2 | docker build -t fc-rust-env -f Dockerfile.build . 3 | 4 | build: build-img 5 | docker run --rm -it -v $$(pwd):/opt/rust-demo fc-rust-env bash -c "cd /opt/rust-demo/bootstrap && /root/.cargo/bin/cargo build --release" 6 | mkdir -p pkg 7 | cp bootstrap/target/release/bootstrap pkg/ 8 | 9 | deploy: build 10 | s deploy -y -------------------------------------------------------------------------------- /bootstrap/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "bootstrap" 3 | version = "0.1.2" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | deno_core = "0.144" 8 | log = "0.4" 9 | tokio = { version = "1.20", features = ["full"] } 10 | 11 | [build-dependencies] 12 | deno_core = "0.144" 13 | 14 | [profile.release] 15 | codegen-units = 1 16 | lto = true 17 | opt-level = 'z' # Optimize for size 18 | panic = "abort" 19 | strip = "symbols" 20 | -------------------------------------------------------------------------------- /s.yaml: -------------------------------------------------------------------------------- 1 | edition: 1.0.0 2 | name: deno_demo 3 | access: default 4 | 5 | vars: 6 | region: cn-beijing 7 | service: 8 | name: deno_demo 9 | description: 'hello world by serverless devs' 10 | internetAccess: true 11 | 12 | services: 13 | helloworld: 14 | component: fc 15 | # actions: 16 | # pre-deploy: 17 | # - run: make build 18 | # path: ./ 19 | props: 20 | region: ${vars.region} 21 | service: ${vars.service} 22 | function: 23 | name: fc_deno_ops 24 | description: 'hello world by serverless devs' 25 | timeout: 30 26 | memorySize: 512 27 | runtime: custom 28 | codeUri: ./pkg 29 | customRuntimeConfig: 30 | command: 31 | - ./bootstrap 32 | -------------------------------------------------------------------------------- /bootstrap/build.rs: -------------------------------------------------------------------------------- 1 | use deno_core::JsRuntime; 2 | use deno_core::RuntimeOptions; 3 | 4 | use std::env; 5 | use std::path::PathBuf; 6 | 7 | fn main() { 8 | let fc_extension = deno_core::Extension::builder() 9 | .js(deno_core::include_js_files!( 10 | prefix "deno:fc_runtime", 11 | "src/fc_runtime.js", 12 | )) 13 | .build(); 14 | 15 | let o = PathBuf::from(env::var_os("OUT_DIR").unwrap()); 16 | let snapshot_path = o.join("FC_RUNTIME_SNAPSHOT.bin"); 17 | let options = RuntimeOptions { 18 | will_snapshot: true, 19 | extensions: vec![ 20 | // deno_webidl::init(), 21 | // deno_console::init(), 22 | // deno_url::init(), 23 | // deno_web::init(BlobStore::default(), None), 24 | // deno_timers::init::(), 25 | // deno_webgpu::init(true), 26 | fc_extension, 27 | ], 28 | ..Default::default() 29 | }; 30 | let mut isolate = JsRuntime::new(options); 31 | 32 | let snapshot = isolate.snapshot(); 33 | let snapshot_slice: &[u8] = &*snapshot; 34 | println!("Snapshot size: {}", snapshot_slice.len()); 35 | std::fs::write(&snapshot_path, snapshot_slice).unwrap(); 36 | println!("Snapshot written to: {} ", snapshot_path.display()); 37 | } 38 | -------------------------------------------------------------------------------- /bootstrap/src/fc_runtime.js: -------------------------------------------------------------------------------- 1 | // Copyright 2018-2022 the Deno authors. All rights reserved. MIT license. 2 | // This is not a real HTTP server. We read blindly one time into 'requestBuf', 3 | // then write this fixed 'responseBuf'. The point of this benchmark is to 4 | // exercise the event loop in a simple yet semi-realistic way. 5 | const requestBuf = new Uint8Array(64 * 1024); 6 | const responseBuf = new Uint8Array( 7 | "HTTP/1.1 200 OK\r\nConnection: Keep-Alive\r\nContent-Length: 12\r\n\r\nHello World\n" 8 | .split("") 9 | .map((c) => c.charCodeAt(0)), 10 | ); 11 | 12 | /** Listens on 0.0.0.0:9000, returns rid. */ 13 | function listen() { 14 | return Deno.core.opSync("op_listen"); 15 | } 16 | 17 | /** Accepts a connection, returns rid. */ 18 | function accept(serverRid) { 19 | return Deno.core.opAsync("op_accept", serverRid); 20 | } 21 | 22 | async function serve(rid) { 23 | try { 24 | while (true) { 25 | await Deno.core.read(rid, requestBuf); 26 | await Deno.core.write(rid, responseBuf); 27 | // await Deno.core.write(Deno.stdout.rid, requestBuf); 28 | } 29 | } catch (e) { 30 | if ( 31 | !e.message.includes("Broken pipe") && 32 | !e.message.includes("Connection reset by peer") 33 | ) { 34 | throw e; 35 | } 36 | } 37 | Deno.core.close(rid); 38 | } 39 | 40 | async function main() { 41 | const listenerRid = listen(); 42 | Deno.core.print(`http_bench_ops listening on http://0.0.0.0:9000\n`); 43 | 44 | while (true) { 45 | const rid = await accept(listenerRid); 46 | serve(rid); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 阿里云函数计算 Deno FC Runtime 2 | 3 | Deno + Serverless = Awesome 4 | 5 | ## 背景 6 | 7 | 两年前(2020年)我曾经写过一个项目,给阿里云的 Severless 开发了可运行 Deno 的 Custom Runtime: 8 | [deno_serverless_aliyun](https://github.com/justjavac/deno_serverless_aliyun)。 9 | 10 | 今天我重新从源码编译了 deno_core,并且把 11 | [src/fc_runtime.js](fc-custom-rust-event/bootstrap/src/fc_runtime.js) 编译为了 V8 12 | Snapshot 进一步缩短冷启动时间。 13 | 14 | **注意⚠️:本项目不是一个完整的 Deno Custom Runtime⚠️** 15 | 16 | ## 前置工具 17 | 18 | - [Serverless Devs](https://docs.serverless-devs.com/serverless-devs/install) 19 | - Docker(如果你使用 linux 系统,可以不安装 Docker) 20 | 21 | ## 配置 22 | 23 | 安装 Serverless Devs 成功后运行 24 | [`s config`](https://docs.serverless-devs.com/serverless-devs/command/config) 配置 25 | Account ID、Access Key ID、Secret Access Key、Default Region Name。 26 | 27 | 克隆(或下载)本仓库: 28 | 29 | ```shell 30 | git clone git@github.com:justjavac/deno_serverless_aliyun_minimal.git 31 | ``` 32 | 33 | ## 部署 34 | 35 | ```shell 36 | cd deno_serverless_aliyun_minimal 37 | make deploy 38 | ``` 39 | 40 | 自定义部署: 41 | 42 | 1. 使用 Rust 编译 bootstrap。 43 | 44 | ```shell 45 | cd bootstrap 46 | cargo build --release 47 | ``` 48 | 49 | 非 linux 系统使用 Docker 构建: 50 | 51 | ```shell 52 | make build 53 | ``` 54 | 55 | 2. 构建 Deno Serverless 运行环境: 56 | 57 | ```shell 58 | s build 59 | ``` 60 | 61 | 3. 部署 62 | 63 | ```shell 64 | s deploy 65 | ``` 66 | 67 | ## 测试 68 | 69 | 部署完成后我们可以测试刚才的函数。 70 | 71 | ```shell 72 | s invoke --event "Hello World" 73 | ``` 74 | 75 | 控制台输出: 76 | 77 | ```plain 78 | ... 79 | FC Invoke Result: 80 | Hello World 81 | ``` 82 | 83 | 第一次运行时函数需要冷启,会稍微有点慢。 84 | 85 | 对比之前的 Deno + JS: 86 | 87 | ```plain 88 | Duration: 9.27 ms, Billed Duration: 12 ms, Memory Size: 512 MB, Max Memory Used: 41.50 MB 89 | Duration: 1.66 ms, Billed Duration: 2 ms, Memory Size: 512 MB, Max Memory Used: 41.62 MB 90 | Duration: 1.41 ms, Billed Duration: 2 ms, Memory Size: 512 MB, Max Memory Used: 41.87 MB 91 | Duration: 1.50 ms, Billed Duration: 2 ms, Memory Size: 512 MB, Max Memory Used: 42.25 MB 92 | Duration: 1.41 ms, Billed Duration: 2 ms, Memory Size: 512 MB, Max Memory Used: 42.50 MB 93 | ``` 94 | 95 | Deno_core + V8 Snapshot 的启动时间: 96 | 97 | ```plain 98 | Duration: 1.21 ms, Billed Duration: 2 ms, Memory Size: 512 MB, Max Memory Used: 18.02 MB 99 | Duration: 0.78 ms, Billed Duration: 1 ms, Memory Size: 512 MB, Max Memory Used: 22.96 MB 100 | Duration: 0.67 ms, Billed Duration: 1 ms, Memory Size: 512 MB, Max Memory Used: 23.08 MB 101 | Duration: 0.73 ms, Billed Duration: 1 ms, Memory Size: 512 MB, Max Memory Used: 22.64 MB 102 | Duration: 0.67 ms, Billed Duration: 1 ms, Memory Size: 512 MB, Max Memory Used: 23.12 MB 103 | ``` 104 | 105 | **注意⚠️:本项目不是一个完整的 Deno Custom Runtime⚠️** 106 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | build: 7 | name: ${{ matrix.kind }} ${{ matrix.os }} 8 | runs-on: ${{ matrix.os }} 9 | strategy: 10 | matrix: 11 | os: [macOS-latest, ubuntu-latest, windows-latest] 12 | 13 | # Always run master branch builds to completion. This allows the cache to 14 | # stay mostly up-to-date in situations where a single job fails due to 15 | # e.g. a flaky test. 16 | # Don't fast-fail on tag build because publishing binaries shouldn't be 17 | # prevented if 'cargo publish' fails (which can be a false negative). 18 | fail-fast: 19 | ${{ github.event_name == 'pull_request' || (github.ref != 20 | 'refs/heads/master' && !startsWith(github.ref, 'refs/tags/')) }} 21 | 22 | env: 23 | CARGO_INCREMENTAL: 0 24 | RUST_BACKTRACE: full 25 | CARGO_TERM_COLOR: always 26 | 27 | steps: 28 | - name: Clone repository 29 | uses: actions/checkout@v3 30 | 31 | - name: Install stable toolchain 32 | uses: actions-rs/toolchain@v1 33 | with: 34 | profile: minimal 35 | toolchain: stable 36 | override: true 37 | components: rustfmt, clippy 38 | 39 | - name: Install rust 40 | uses: hecrj/setup-rust-action@v1 41 | 42 | - name: Install clippy and rustfmt 43 | run: | 44 | rustup component add clippy 45 | rustup component add rustfmt 46 | 47 | - name: Log versions 48 | run: | 49 | rustc --version 50 | cargo --version 51 | 52 | - name: Configure cargo data directory 53 | # After this point, all cargo registry and crate data is stored in 54 | # $GITHUB_WORKSPACE/.cargo_home. This allows us to cache only the files 55 | # that are needed during the build process. Additionally, this works 56 | # around a bug in the 'cache' action that causes directories outside of 57 | # the workspace dir to be saved/restored incorrectly. 58 | run: | 59 | echo "CARGO_HOME=$(pwd)/.cargo_home" >> $GITHUB_ENV 60 | 61 | - name: Cache 62 | uses: actions/cache@v2 63 | with: 64 | # Note: crates from the denoland/deno git repo always get rebuilt, 65 | # and their outputs ('deno', 'libdeno.rlib' etc.) are quite big, 66 | # so we cache only those subdirectories of target/{debug|release} that 67 | # contain the build output for crates that come from the registry. 68 | path: |- 69 | .cargo_home 70 | target/*/.* 71 | target/*/build 72 | target/*/deps 73 | key: 74 | ${{ matrix.config.os }}-${{ hashFiles('Cargo.lock') }} 75 | restore-keys: | 76 | ${{ matrix.config.os }}- 77 | 78 | - name: Run cargo fmt 79 | run: | 80 | cd bootstrap 81 | cargo fmt --all -- --check 82 | 83 | - name: Run cargo check 84 | run: | 85 | cd bootstrap 86 | cargo check --locked 87 | 88 | - name: Run cargo clippy 89 | run: | 90 | cd bootstrap 91 | cargo clippy -- -D warnings 92 | 93 | - name: Build release 94 | run: | 95 | cd bootstrap 96 | cargo build --release --locked 97 | 98 | - name: Pre-release (linux) 99 | if: startsWith(matrix.os, 'ubuntu') 100 | run: | 101 | cd bootstrap/target/release 102 | zip -r bootstrap-x86_64-unknown-linux-gnu.zip bootstrap 103 | 104 | - name: Pre-release (mac) 105 | if: startsWith(matrix.os, 'macOS') 106 | run: | 107 | cd bootstrap/target/release 108 | zip -r bootstrap-x86_64-apple-darwin.zip bootstrap 109 | 110 | - name: Pre-release (windows) 111 | if: startsWith(matrix.os, 'windows') 112 | run: | 113 | Compress-Archive -CompressionLevel Optimal -Force -Path bootstrap/target/release/bootstrap.exe -DestinationPath bootstrap/target/release/bootstrap-x86_64-pc-windows-msvc.zip 114 | 115 | - name: Release 116 | uses: softprops/action-gh-release@v1 117 | if: | 118 | startsWith(github.repository, 'justjavac') && 119 | startsWith(github.ref, 'refs/tags/') 120 | env: 121 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 122 | with: 123 | files: | 124 | bootstrap/target/release/bootstrap-x86_64-pc-windows-msvc.zip 125 | bootstrap/target/release/bootstrap-x86_64-unknown-linux-gnu.zip 126 | bootstrap/target/release/bootstrap-x86_64-apple-darwin.zip 127 | draft: true 128 | -------------------------------------------------------------------------------- /bootstrap/src/main.rs: -------------------------------------------------------------------------------- 1 | use deno_core::anyhow::Error; 2 | use deno_core::located_script_name; 3 | use deno_core::op; 4 | use deno_core::AsyncRefCell; 5 | use deno_core::AsyncResult; 6 | use deno_core::CancelHandle; 7 | use deno_core::CancelTryFuture; 8 | use deno_core::JsRuntime; 9 | use deno_core::OpState; 10 | use deno_core::RcRef; 11 | use deno_core::Resource; 12 | use deno_core::ResourceId; 13 | use deno_core::Snapshot; 14 | use deno_core::ZeroCopyBuf; 15 | use std::cell::RefCell; 16 | use std::env; 17 | use std::net::SocketAddr; 18 | use std::rc::Rc; 19 | use tokio::io::AsyncReadExt; 20 | use tokio::io::AsyncWriteExt; 21 | 22 | static CTSR_SNAPSHOT: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/FC_RUNTIME_SNAPSHOT.bin")); 23 | 24 | struct Logger; 25 | 26 | impl log::Log for Logger { 27 | fn enabled(&self, metadata: &log::Metadata) -> bool { 28 | metadata.level() <= log::max_level() 29 | } 30 | 31 | fn log(&self, record: &log::Record) { 32 | if self.enabled(record.metadata()) { 33 | println!("{} - {}", record.level(), record.args()); 34 | } 35 | } 36 | 37 | fn flush(&self) {} 38 | } 39 | 40 | // Note: a `tokio::net::TcpListener` doesn't need to be wrapped in a cell, 41 | // because it only supports one op (`accept`) which does not require a mutable 42 | // reference to the listener. 43 | struct TcpListener { 44 | inner: tokio::net::TcpListener, 45 | cancel: CancelHandle, 46 | } 47 | 48 | impl TcpListener { 49 | async fn accept(self: Rc) -> Result { 50 | let cancel = RcRef::map(&self, |r| &r.cancel); 51 | let stream = self.inner.accept().try_or_cancel(cancel).await?.0.into(); 52 | Ok(stream) 53 | } 54 | } 55 | 56 | impl Resource for TcpListener { 57 | fn close(self: Rc) { 58 | self.cancel.cancel(); 59 | } 60 | } 61 | 62 | impl TryFrom for TcpListener { 63 | type Error = std::io::Error; 64 | fn try_from(std_listener: std::net::TcpListener) -> Result { 65 | tokio::net::TcpListener::try_from(std_listener).map(|tokio_listener| Self { 66 | inner: tokio_listener, 67 | cancel: Default::default(), 68 | }) 69 | } 70 | } 71 | 72 | struct TcpStream { 73 | rd: AsyncRefCell, 74 | wr: AsyncRefCell, 75 | // When a `TcpStream` resource is closed, all pending 'read' ops are 76 | // canceled, while 'write' ops are allowed to complete. Therefore only 77 | // 'read' futures are attached to this cancel handle. 78 | cancel: CancelHandle, 79 | } 80 | 81 | impl TcpStream { 82 | async fn read(self: Rc, mut buf: ZeroCopyBuf) -> Result<(usize, ZeroCopyBuf), Error> { 83 | let mut rd = RcRef::map(&self, |r| &r.rd).borrow_mut().await; 84 | let cancel = RcRef::map(self, |r| &r.cancel); 85 | let nread = rd 86 | .read(&mut buf) 87 | .try_or_cancel(cancel) 88 | .await 89 | .map_err(Error::from)?; 90 | Ok((nread, buf)) 91 | } 92 | 93 | async fn write(self: Rc, buf: ZeroCopyBuf) -> Result { 94 | let mut wr = RcRef::map(self, |r| &r.wr).borrow_mut().await; 95 | wr.write(&buf).await.map_err(Error::from) 96 | } 97 | } 98 | 99 | impl Resource for TcpStream { 100 | fn read_return(self: Rc, buf: ZeroCopyBuf) -> AsyncResult<(usize, ZeroCopyBuf)> { 101 | Box::pin(self.read(buf)) 102 | } 103 | 104 | fn write(self: Rc, buf: ZeroCopyBuf) -> AsyncResult { 105 | Box::pin(self.write(buf)) 106 | } 107 | 108 | fn close(self: Rc) { 109 | self.cancel.cancel() 110 | } 111 | } 112 | 113 | impl From for TcpStream { 114 | fn from(s: tokio::net::TcpStream) -> Self { 115 | let (rd, wr) = s.into_split(); 116 | Self { 117 | rd: rd.into(), 118 | wr: wr.into(), 119 | cancel: Default::default(), 120 | } 121 | } 122 | } 123 | 124 | fn create_js_runtime() -> JsRuntime { 125 | let ext = deno_core::Extension::builder() 126 | .ops(vec![op_listen::decl(), op_accept::decl()]) 127 | .build(); 128 | 129 | JsRuntime::new(deno_core::RuntimeOptions { 130 | startup_snapshot: Some(Snapshot::Static(CTSR_SNAPSHOT)), 131 | extensions: vec![ext], 132 | ..Default::default() 133 | }) 134 | } 135 | 136 | #[op] 137 | fn op_listen(state: &mut OpState) -> Result { 138 | log::debug!("listen"); 139 | let addr = "0.0.0.0:9000".parse::().unwrap(); 140 | let std_listener = std::net::TcpListener::bind(&addr)?; 141 | std_listener.set_nonblocking(true)?; 142 | // std_listener.set_ttl(0).expect("could not set TTL"); 143 | let listener = TcpListener::try_from(std_listener)?; 144 | let rid = state.resource_table.add(listener); 145 | Ok(rid) 146 | } 147 | 148 | #[op] 149 | async fn op_accept(state: Rc>, rid: ResourceId) -> Result { 150 | log::debug!("accept rid={}", rid); 151 | 152 | let listener = state.borrow().resource_table.get::(rid)?; 153 | let stream = listener.accept().await?; 154 | let rid = state.borrow_mut().resource_table.add(stream); 155 | Ok(rid) 156 | } 157 | 158 | fn main() { 159 | log::set_logger(&Logger).unwrap(); 160 | log::set_max_level( 161 | env::args() 162 | .find(|a| a == "-D") 163 | .map(|_| log::LevelFilter::Debug) 164 | .unwrap_or(log::LevelFilter::Warn), 165 | ); 166 | 167 | // NOTE: `--help` arg will display V8 help and exit 168 | deno_core::v8_set_flags(env::args().collect()); 169 | 170 | let mut js_runtime = create_js_runtime(); 171 | let runtime = tokio::runtime::Builder::new_current_thread() 172 | .enable_all() 173 | .build() 174 | .unwrap(); 175 | 176 | let future = async move { 177 | js_runtime 178 | .execute_script(&located_script_name!(), "main()") 179 | .unwrap(); 180 | js_runtime.run_event_loop(false).await 181 | }; 182 | runtime.block_on(future).unwrap(); 183 | } 184 | -------------------------------------------------------------------------------- /bootstrap/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "aho-corasick" 7 | version = "0.7.18" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" 10 | dependencies = [ 11 | "memchr", 12 | ] 13 | 14 | [[package]] 15 | name = "anyhow" 16 | version = "1.0.58" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "bb07d2053ccdbe10e2af2995a2f116c1330396493dc1269f6a91d0ae82e19704" 19 | 20 | [[package]] 21 | name = "autocfg" 22 | version = "1.1.0" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 25 | 26 | [[package]] 27 | name = "base64" 28 | version = "0.11.0" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" 31 | 32 | [[package]] 33 | name = "bitflags" 34 | version = "1.3.2" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 37 | 38 | [[package]] 39 | name = "bootstrap" 40 | version = "0.1.2" 41 | dependencies = [ 42 | "deno_core", 43 | "log", 44 | "tokio", 45 | ] 46 | 47 | [[package]] 48 | name = "bytes" 49 | version = "1.2.0" 50 | source = "registry+https://github.com/rust-lang/crates.io-index" 51 | checksum = "f0b3de4a0c5e67e16066a0715723abd91edc2f9001d09c46e1dca929351e130e" 52 | 53 | [[package]] 54 | name = "cfg-if" 55 | version = "1.0.0" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 58 | 59 | [[package]] 60 | name = "convert_case" 61 | version = "0.4.0" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" 64 | 65 | [[package]] 66 | name = "deno_core" 67 | version = "0.144.0" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | checksum = "07952bcb705366ce6cf1590cb408157761ae492d135625beab23572bd2a51938" 70 | dependencies = [ 71 | "anyhow", 72 | "deno_ops", 73 | "futures", 74 | "indexmap", 75 | "libc", 76 | "log", 77 | "once_cell", 78 | "parking_lot", 79 | "pin-project", 80 | "serde", 81 | "serde_json", 82 | "serde_v8", 83 | "sourcemap", 84 | "url", 85 | "v8", 86 | ] 87 | 88 | [[package]] 89 | name = "deno_ops" 90 | version = "0.22.0" 91 | source = "registry+https://github.com/rust-lang/crates.io-index" 92 | checksum = "871f1028045a23864859a71cf901867f839dabc26ba20db7cf6cc7e854015a80" 93 | dependencies = [ 94 | "once_cell", 95 | "proc-macro-crate", 96 | "proc-macro2", 97 | "quote", 98 | "regex", 99 | "syn", 100 | ] 101 | 102 | [[package]] 103 | name = "derive_more" 104 | version = "0.99.17" 105 | source = "registry+https://github.com/rust-lang/crates.io-index" 106 | checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" 107 | dependencies = [ 108 | "convert_case", 109 | "proc-macro2", 110 | "quote", 111 | "rustc_version 0.4.0", 112 | "syn", 113 | ] 114 | 115 | [[package]] 116 | name = "either" 117 | version = "1.7.0" 118 | source = "registry+https://github.com/rust-lang/crates.io-index" 119 | checksum = "3f107b87b6afc2a64fd13cac55fe06d6c8859f12d4b14cbcdd2c67d0976781be" 120 | 121 | [[package]] 122 | name = "form_urlencoded" 123 | version = "1.0.1" 124 | source = "registry+https://github.com/rust-lang/crates.io-index" 125 | checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" 126 | dependencies = [ 127 | "matches", 128 | "percent-encoding", 129 | ] 130 | 131 | [[package]] 132 | name = "fslock" 133 | version = "0.1.8" 134 | source = "registry+https://github.com/rust-lang/crates.io-index" 135 | checksum = "57eafdd0c16f57161105ae1b98a1238f97645f2f588438b2949c99a2af9616bf" 136 | dependencies = [ 137 | "libc", 138 | "winapi", 139 | ] 140 | 141 | [[package]] 142 | name = "futures" 143 | version = "0.3.21" 144 | source = "registry+https://github.com/rust-lang/crates.io-index" 145 | checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" 146 | dependencies = [ 147 | "futures-channel", 148 | "futures-core", 149 | "futures-executor", 150 | "futures-io", 151 | "futures-sink", 152 | "futures-task", 153 | "futures-util", 154 | ] 155 | 156 | [[package]] 157 | name = "futures-channel" 158 | version = "0.3.21" 159 | source = "registry+https://github.com/rust-lang/crates.io-index" 160 | checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" 161 | dependencies = [ 162 | "futures-core", 163 | "futures-sink", 164 | ] 165 | 166 | [[package]] 167 | name = "futures-core" 168 | version = "0.3.21" 169 | source = "registry+https://github.com/rust-lang/crates.io-index" 170 | checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" 171 | 172 | [[package]] 173 | name = "futures-executor" 174 | version = "0.3.21" 175 | source = "registry+https://github.com/rust-lang/crates.io-index" 176 | checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" 177 | dependencies = [ 178 | "futures-core", 179 | "futures-task", 180 | "futures-util", 181 | ] 182 | 183 | [[package]] 184 | name = "futures-io" 185 | version = "0.3.21" 186 | source = "registry+https://github.com/rust-lang/crates.io-index" 187 | checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" 188 | 189 | [[package]] 190 | name = "futures-macro" 191 | version = "0.3.21" 192 | source = "registry+https://github.com/rust-lang/crates.io-index" 193 | checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" 194 | dependencies = [ 195 | "proc-macro2", 196 | "quote", 197 | "syn", 198 | ] 199 | 200 | [[package]] 201 | name = "futures-sink" 202 | version = "0.3.21" 203 | source = "registry+https://github.com/rust-lang/crates.io-index" 204 | checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" 205 | 206 | [[package]] 207 | name = "futures-task" 208 | version = "0.3.21" 209 | source = "registry+https://github.com/rust-lang/crates.io-index" 210 | checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" 211 | 212 | [[package]] 213 | name = "futures-util" 214 | version = "0.3.21" 215 | source = "registry+https://github.com/rust-lang/crates.io-index" 216 | checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" 217 | dependencies = [ 218 | "futures-channel", 219 | "futures-core", 220 | "futures-io", 221 | "futures-macro", 222 | "futures-sink", 223 | "futures-task", 224 | "memchr", 225 | "pin-project-lite", 226 | "pin-utils", 227 | "slab", 228 | ] 229 | 230 | [[package]] 231 | name = "hashbrown" 232 | version = "0.12.3" 233 | source = "registry+https://github.com/rust-lang/crates.io-index" 234 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 235 | 236 | [[package]] 237 | name = "hermit-abi" 238 | version = "0.1.19" 239 | source = "registry+https://github.com/rust-lang/crates.io-index" 240 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 241 | dependencies = [ 242 | "libc", 243 | ] 244 | 245 | [[package]] 246 | name = "idna" 247 | version = "0.2.3" 248 | source = "registry+https://github.com/rust-lang/crates.io-index" 249 | checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" 250 | dependencies = [ 251 | "matches", 252 | "unicode-bidi", 253 | "unicode-normalization", 254 | ] 255 | 256 | [[package]] 257 | name = "if_chain" 258 | version = "1.0.2" 259 | source = "registry+https://github.com/rust-lang/crates.io-index" 260 | checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" 261 | 262 | [[package]] 263 | name = "indexmap" 264 | version = "1.9.1" 265 | source = "registry+https://github.com/rust-lang/crates.io-index" 266 | checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" 267 | dependencies = [ 268 | "autocfg", 269 | "hashbrown", 270 | ] 271 | 272 | [[package]] 273 | name = "itoa" 274 | version = "1.0.2" 275 | source = "registry+https://github.com/rust-lang/crates.io-index" 276 | checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" 277 | 278 | [[package]] 279 | name = "lazy_static" 280 | version = "1.4.0" 281 | source = "registry+https://github.com/rust-lang/crates.io-index" 282 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 283 | 284 | [[package]] 285 | name = "libc" 286 | version = "0.2.126" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" 289 | 290 | [[package]] 291 | name = "lock_api" 292 | version = "0.4.7" 293 | source = "registry+https://github.com/rust-lang/crates.io-index" 294 | checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" 295 | dependencies = [ 296 | "autocfg", 297 | "scopeguard", 298 | ] 299 | 300 | [[package]] 301 | name = "log" 302 | version = "0.4.17" 303 | source = "registry+https://github.com/rust-lang/crates.io-index" 304 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 305 | dependencies = [ 306 | "cfg-if", 307 | ] 308 | 309 | [[package]] 310 | name = "matches" 311 | version = "0.1.9" 312 | source = "registry+https://github.com/rust-lang/crates.io-index" 313 | checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" 314 | 315 | [[package]] 316 | name = "memchr" 317 | version = "2.5.0" 318 | source = "registry+https://github.com/rust-lang/crates.io-index" 319 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 320 | 321 | [[package]] 322 | name = "mio" 323 | version = "0.8.4" 324 | source = "registry+https://github.com/rust-lang/crates.io-index" 325 | checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" 326 | dependencies = [ 327 | "libc", 328 | "log", 329 | "wasi", 330 | "windows-sys", 331 | ] 332 | 333 | [[package]] 334 | name = "num_cpus" 335 | version = "1.13.1" 336 | source = "registry+https://github.com/rust-lang/crates.io-index" 337 | checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" 338 | dependencies = [ 339 | "hermit-abi", 340 | "libc", 341 | ] 342 | 343 | [[package]] 344 | name = "once_cell" 345 | version = "1.13.0" 346 | source = "registry+https://github.com/rust-lang/crates.io-index" 347 | checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" 348 | 349 | [[package]] 350 | name = "parking_lot" 351 | version = "0.12.1" 352 | source = "registry+https://github.com/rust-lang/crates.io-index" 353 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 354 | dependencies = [ 355 | "lock_api", 356 | "parking_lot_core", 357 | ] 358 | 359 | [[package]] 360 | name = "parking_lot_core" 361 | version = "0.9.3" 362 | source = "registry+https://github.com/rust-lang/crates.io-index" 363 | checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" 364 | dependencies = [ 365 | "cfg-if", 366 | "libc", 367 | "redox_syscall", 368 | "smallvec", 369 | "windows-sys", 370 | ] 371 | 372 | [[package]] 373 | name = "percent-encoding" 374 | version = "2.1.0" 375 | source = "registry+https://github.com/rust-lang/crates.io-index" 376 | checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 377 | 378 | [[package]] 379 | name = "pin-project" 380 | version = "1.0.11" 381 | source = "registry+https://github.com/rust-lang/crates.io-index" 382 | checksum = "78203e83c48cffbe01e4a2d35d566ca4de445d79a85372fc64e378bfc812a260" 383 | dependencies = [ 384 | "pin-project-internal", 385 | ] 386 | 387 | [[package]] 388 | name = "pin-project-internal" 389 | version = "1.0.11" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | checksum = "710faf75e1b33345361201d36d04e98ac1ed8909151a017ed384700836104c74" 392 | dependencies = [ 393 | "proc-macro2", 394 | "quote", 395 | "syn", 396 | ] 397 | 398 | [[package]] 399 | name = "pin-project-lite" 400 | version = "0.2.9" 401 | source = "registry+https://github.com/rust-lang/crates.io-index" 402 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 403 | 404 | [[package]] 405 | name = "pin-utils" 406 | version = "0.1.0" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 409 | 410 | [[package]] 411 | name = "proc-macro-crate" 412 | version = "1.1.3" 413 | source = "registry+https://github.com/rust-lang/crates.io-index" 414 | checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" 415 | dependencies = [ 416 | "thiserror", 417 | "toml", 418 | ] 419 | 420 | [[package]] 421 | name = "proc-macro2" 422 | version = "1.0.42" 423 | source = "registry+https://github.com/rust-lang/crates.io-index" 424 | checksum = "c278e965f1d8cf32d6e0e96de3d3e79712178ae67986d9cf9151f51e95aac89b" 425 | dependencies = [ 426 | "unicode-ident", 427 | ] 428 | 429 | [[package]] 430 | name = "quote" 431 | version = "1.0.20" 432 | source = "registry+https://github.com/rust-lang/crates.io-index" 433 | checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" 434 | dependencies = [ 435 | "proc-macro2", 436 | ] 437 | 438 | [[package]] 439 | name = "redox_syscall" 440 | version = "0.2.16" 441 | source = "registry+https://github.com/rust-lang/crates.io-index" 442 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 443 | dependencies = [ 444 | "bitflags", 445 | ] 446 | 447 | [[package]] 448 | name = "regex" 449 | version = "1.6.0" 450 | source = "registry+https://github.com/rust-lang/crates.io-index" 451 | checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" 452 | dependencies = [ 453 | "aho-corasick", 454 | "memchr", 455 | "regex-syntax", 456 | ] 457 | 458 | [[package]] 459 | name = "regex-syntax" 460 | version = "0.6.27" 461 | source = "registry+https://github.com/rust-lang/crates.io-index" 462 | checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" 463 | 464 | [[package]] 465 | name = "rustc_version" 466 | version = "0.2.3" 467 | source = "registry+https://github.com/rust-lang/crates.io-index" 468 | checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" 469 | dependencies = [ 470 | "semver 0.9.0", 471 | ] 472 | 473 | [[package]] 474 | name = "rustc_version" 475 | version = "0.4.0" 476 | source = "registry+https://github.com/rust-lang/crates.io-index" 477 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 478 | dependencies = [ 479 | "semver 1.0.12", 480 | ] 481 | 482 | [[package]] 483 | name = "ryu" 484 | version = "1.0.10" 485 | source = "registry+https://github.com/rust-lang/crates.io-index" 486 | checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" 487 | 488 | [[package]] 489 | name = "scopeguard" 490 | version = "1.1.0" 491 | source = "registry+https://github.com/rust-lang/crates.io-index" 492 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 493 | 494 | [[package]] 495 | name = "semver" 496 | version = "0.9.0" 497 | source = "registry+https://github.com/rust-lang/crates.io-index" 498 | checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" 499 | dependencies = [ 500 | "semver-parser", 501 | ] 502 | 503 | [[package]] 504 | name = "semver" 505 | version = "1.0.12" 506 | source = "registry+https://github.com/rust-lang/crates.io-index" 507 | checksum = "a2333e6df6d6598f2b1974829f853c2b4c5f4a6e503c10af918081aa6f8564e1" 508 | 509 | [[package]] 510 | name = "semver-parser" 511 | version = "0.7.0" 512 | source = "registry+https://github.com/rust-lang/crates.io-index" 513 | checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" 514 | 515 | [[package]] 516 | name = "serde" 517 | version = "1.0.140" 518 | source = "registry+https://github.com/rust-lang/crates.io-index" 519 | checksum = "fc855a42c7967b7c369eb5860f7164ef1f6f81c20c7cc1141f2a604e18723b03" 520 | dependencies = [ 521 | "serde_derive", 522 | ] 523 | 524 | [[package]] 525 | name = "serde_derive" 526 | version = "1.0.140" 527 | source = "registry+https://github.com/rust-lang/crates.io-index" 528 | checksum = "6f2122636b9fe3b81f1cb25099fcf2d3f542cdb1d45940d56c713158884a05da" 529 | dependencies = [ 530 | "proc-macro2", 531 | "quote", 532 | "syn", 533 | ] 534 | 535 | [[package]] 536 | name = "serde_json" 537 | version = "1.0.82" 538 | source = "registry+https://github.com/rust-lang/crates.io-index" 539 | checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7" 540 | dependencies = [ 541 | "indexmap", 542 | "itoa", 543 | "ryu", 544 | "serde", 545 | ] 546 | 547 | [[package]] 548 | name = "serde_v8" 549 | version = "0.55.0" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "69110d2be1d34271c4a7ceb4171c6c12f2aafe6b8d4eb46c8d0a7e8d039154e4" 552 | dependencies = [ 553 | "bytes", 554 | "derive_more", 555 | "serde", 556 | "smallvec", 557 | "v8", 558 | ] 559 | 560 | [[package]] 561 | name = "signal-hook-registry" 562 | version = "1.4.0" 563 | source = "registry+https://github.com/rust-lang/crates.io-index" 564 | checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" 565 | dependencies = [ 566 | "libc", 567 | ] 568 | 569 | [[package]] 570 | name = "slab" 571 | version = "0.4.7" 572 | source = "registry+https://github.com/rust-lang/crates.io-index" 573 | checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" 574 | dependencies = [ 575 | "autocfg", 576 | ] 577 | 578 | [[package]] 579 | name = "smallvec" 580 | version = "1.9.0" 581 | source = "registry+https://github.com/rust-lang/crates.io-index" 582 | checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" 583 | 584 | [[package]] 585 | name = "socket2" 586 | version = "0.4.4" 587 | source = "registry+https://github.com/rust-lang/crates.io-index" 588 | checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" 589 | dependencies = [ 590 | "libc", 591 | "winapi", 592 | ] 593 | 594 | [[package]] 595 | name = "sourcemap" 596 | version = "6.0.1" 597 | source = "registry+https://github.com/rust-lang/crates.io-index" 598 | checksum = "6e031f2463ecbdd5f34c950f89f5c1e1032f22c0f8e3dc4bdb2e8b6658cf61eb" 599 | dependencies = [ 600 | "base64", 601 | "if_chain", 602 | "lazy_static", 603 | "regex", 604 | "rustc_version 0.2.3", 605 | "serde", 606 | "serde_json", 607 | "url", 608 | ] 609 | 610 | [[package]] 611 | name = "syn" 612 | version = "1.0.98" 613 | source = "registry+https://github.com/rust-lang/crates.io-index" 614 | checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" 615 | dependencies = [ 616 | "proc-macro2", 617 | "quote", 618 | "unicode-ident", 619 | ] 620 | 621 | [[package]] 622 | name = "thiserror" 623 | version = "1.0.31" 624 | source = "registry+https://github.com/rust-lang/crates.io-index" 625 | checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" 626 | dependencies = [ 627 | "thiserror-impl", 628 | ] 629 | 630 | [[package]] 631 | name = "thiserror-impl" 632 | version = "1.0.31" 633 | source = "registry+https://github.com/rust-lang/crates.io-index" 634 | checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" 635 | dependencies = [ 636 | "proc-macro2", 637 | "quote", 638 | "syn", 639 | ] 640 | 641 | [[package]] 642 | name = "tinyvec" 643 | version = "1.6.0" 644 | source = "registry+https://github.com/rust-lang/crates.io-index" 645 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 646 | dependencies = [ 647 | "tinyvec_macros", 648 | ] 649 | 650 | [[package]] 651 | name = "tinyvec_macros" 652 | version = "0.1.0" 653 | source = "registry+https://github.com/rust-lang/crates.io-index" 654 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 655 | 656 | [[package]] 657 | name = "tokio" 658 | version = "1.20.1" 659 | source = "registry+https://github.com/rust-lang/crates.io-index" 660 | checksum = "7a8325f63a7d4774dd041e363b2409ed1c5cbbd0f867795e661df066b2b0a581" 661 | dependencies = [ 662 | "autocfg", 663 | "bytes", 664 | "libc", 665 | "memchr", 666 | "mio", 667 | "num_cpus", 668 | "once_cell", 669 | "parking_lot", 670 | "pin-project-lite", 671 | "signal-hook-registry", 672 | "socket2", 673 | "tokio-macros", 674 | "winapi", 675 | ] 676 | 677 | [[package]] 678 | name = "tokio-macros" 679 | version = "1.8.0" 680 | source = "registry+https://github.com/rust-lang/crates.io-index" 681 | checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" 682 | dependencies = [ 683 | "proc-macro2", 684 | "quote", 685 | "syn", 686 | ] 687 | 688 | [[package]] 689 | name = "toml" 690 | version = "0.5.9" 691 | source = "registry+https://github.com/rust-lang/crates.io-index" 692 | checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" 693 | dependencies = [ 694 | "serde", 695 | ] 696 | 697 | [[package]] 698 | name = "unicode-bidi" 699 | version = "0.3.8" 700 | source = "registry+https://github.com/rust-lang/crates.io-index" 701 | checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" 702 | 703 | [[package]] 704 | name = "unicode-ident" 705 | version = "1.0.2" 706 | source = "registry+https://github.com/rust-lang/crates.io-index" 707 | checksum = "15c61ba63f9235225a22310255a29b806b907c9b8c964bcbd0a2c70f3f2deea7" 708 | 709 | [[package]] 710 | name = "unicode-normalization" 711 | version = "0.1.21" 712 | source = "registry+https://github.com/rust-lang/crates.io-index" 713 | checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" 714 | dependencies = [ 715 | "tinyvec", 716 | ] 717 | 718 | [[package]] 719 | name = "url" 720 | version = "2.2.2" 721 | source = "registry+https://github.com/rust-lang/crates.io-index" 722 | checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" 723 | dependencies = [ 724 | "form_urlencoded", 725 | "idna", 726 | "matches", 727 | "percent-encoding", 728 | "serde", 729 | ] 730 | 731 | [[package]] 732 | name = "v8" 733 | version = "0.47.1" 734 | source = "registry+https://github.com/rust-lang/crates.io-index" 735 | checksum = "be156dece7a023d5959a72dc0d398d6c95100ec601a2cea10d868da143e85166" 736 | dependencies = [ 737 | "bitflags", 738 | "fslock", 739 | "lazy_static", 740 | "libc", 741 | "which", 742 | ] 743 | 744 | [[package]] 745 | name = "wasi" 746 | version = "0.11.0+wasi-snapshot-preview1" 747 | source = "registry+https://github.com/rust-lang/crates.io-index" 748 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 749 | 750 | [[package]] 751 | name = "which" 752 | version = "4.2.5" 753 | source = "registry+https://github.com/rust-lang/crates.io-index" 754 | checksum = "5c4fb54e6113b6a8772ee41c3404fb0301ac79604489467e0a9ce1f3e97c24ae" 755 | dependencies = [ 756 | "either", 757 | "lazy_static", 758 | "libc", 759 | ] 760 | 761 | [[package]] 762 | name = "winapi" 763 | version = "0.3.9" 764 | source = "registry+https://github.com/rust-lang/crates.io-index" 765 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 766 | dependencies = [ 767 | "winapi-i686-pc-windows-gnu", 768 | "winapi-x86_64-pc-windows-gnu", 769 | ] 770 | 771 | [[package]] 772 | name = "winapi-i686-pc-windows-gnu" 773 | version = "0.4.0" 774 | source = "registry+https://github.com/rust-lang/crates.io-index" 775 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 776 | 777 | [[package]] 778 | name = "winapi-x86_64-pc-windows-gnu" 779 | version = "0.4.0" 780 | source = "registry+https://github.com/rust-lang/crates.io-index" 781 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 782 | 783 | [[package]] 784 | name = "windows-sys" 785 | version = "0.36.1" 786 | source = "registry+https://github.com/rust-lang/crates.io-index" 787 | checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" 788 | dependencies = [ 789 | "windows_aarch64_msvc", 790 | "windows_i686_gnu", 791 | "windows_i686_msvc", 792 | "windows_x86_64_gnu", 793 | "windows_x86_64_msvc", 794 | ] 795 | 796 | [[package]] 797 | name = "windows_aarch64_msvc" 798 | version = "0.36.1" 799 | source = "registry+https://github.com/rust-lang/crates.io-index" 800 | checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" 801 | 802 | [[package]] 803 | name = "windows_i686_gnu" 804 | version = "0.36.1" 805 | source = "registry+https://github.com/rust-lang/crates.io-index" 806 | checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" 807 | 808 | [[package]] 809 | name = "windows_i686_msvc" 810 | version = "0.36.1" 811 | source = "registry+https://github.com/rust-lang/crates.io-index" 812 | checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" 813 | 814 | [[package]] 815 | name = "windows_x86_64_gnu" 816 | version = "0.36.1" 817 | source = "registry+https://github.com/rust-lang/crates.io-index" 818 | checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" 819 | 820 | [[package]] 821 | name = "windows_x86_64_msvc" 822 | version = "0.36.1" 823 | source = "registry+https://github.com/rust-lang/crates.io-index" 824 | checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" 825 | --------------------------------------------------------------------------------