mirror of
https://github.com/denoland/deno.git
synced 2024-12-24 16:19:12 -05:00
refactor: merge deno_file crate into deno_web (#10914)
This refactor makes it so there's one less crate to publish on each release.
This commit is contained in:
parent
fb20a6af76
commit
6091ea098a
40 changed files with 173 additions and 268 deletions
13
Cargo.lock
generated
13
Cargo.lock
generated
|
@ -535,7 +535,6 @@ dependencies = [
|
|||
"deno_crypto",
|
||||
"deno_doc",
|
||||
"deno_fetch",
|
||||
"deno_file",
|
||||
"deno_lint",
|
||||
"deno_runtime",
|
||||
"deno_timers",
|
||||
|
@ -674,7 +673,7 @@ dependencies = [
|
|||
"bytes",
|
||||
"data-url",
|
||||
"deno_core",
|
||||
"deno_file",
|
||||
"deno_web",
|
||||
"http",
|
||||
"reqwest",
|
||||
"serde",
|
||||
|
@ -683,14 +682,6 @@ dependencies = [
|
|||
"tokio-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "deno_file"
|
||||
version = "0.7.0"
|
||||
dependencies = [
|
||||
"deno_core",
|
||||
"uuid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "deno_lint"
|
||||
version = "0.6.1"
|
||||
|
@ -722,7 +713,6 @@ dependencies = [
|
|||
"deno_core",
|
||||
"deno_crypto",
|
||||
"deno_fetch",
|
||||
"deno_file",
|
||||
"deno_timers",
|
||||
"deno_url",
|
||||
"deno_web",
|
||||
|
@ -790,6 +780,7 @@ dependencies = [
|
|||
"encoding_rs",
|
||||
"futures",
|
||||
"serde",
|
||||
"uuid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
|
@ -12,7 +12,6 @@ members = [
|
|||
"extensions/console",
|
||||
"extensions/crypto",
|
||||
"extensions/fetch",
|
||||
"extensions/file",
|
||||
"extensions/timers",
|
||||
"extensions/url",
|
||||
"extensions/web",
|
||||
|
|
|
@ -25,7 +25,6 @@ deno_console = { version = "0.8.0", path = "../extensions/console" }
|
|||
deno_core = { version = "0.89.0", path = "../core" }
|
||||
deno_crypto = { version = "0.22.0", path = "../extensions/crypto" }
|
||||
deno_fetch = { version = "0.30.0", path = "../extensions/fetch" }
|
||||
deno_file = { version = "0.7.0", path = "../extensions/file" }
|
||||
deno_timers = { version = "0.6.0", path = "../extensions/timers" }
|
||||
deno_url = { version = "0.8.0", path = "../extensions/url" }
|
||||
deno_web = { version = "0.39.0", path = "../extensions/web" }
|
||||
|
|
|
@ -59,7 +59,6 @@ fn create_compiler_snapshot(
|
|||
op_crate_libs.insert("deno.console", deno_console::get_declaration());
|
||||
op_crate_libs.insert("deno.url", deno_url::get_declaration());
|
||||
op_crate_libs.insert("deno.web", deno_web::get_declaration());
|
||||
op_crate_libs.insert("deno.file", deno_file::get_declaration());
|
||||
op_crate_libs.insert("deno.fetch", deno_fetch::get_declaration());
|
||||
op_crate_libs.insert("deno.webgpu", deno_webgpu::get_declaration());
|
||||
op_crate_libs.insert("deno.websocket", deno_websocket::get_declaration());
|
||||
|
@ -275,10 +274,6 @@ fn main() {
|
|||
"cargo:rustc-env=DENO_WEB_LIB_PATH={}",
|
||||
deno_web::get_declaration().display()
|
||||
);
|
||||
println!(
|
||||
"cargo:rustc-env=DENO_FILE_LIB_PATH={}",
|
||||
deno_file::get_declaration().display()
|
||||
);
|
||||
println!(
|
||||
"cargo:rustc-env=DENO_FETCH_LIB_PATH={}",
|
||||
deno_fetch::get_declaration().display()
|
||||
|
|
1
cli/dts/lib.deno.shared_globals.d.ts
vendored
1
cli/dts/lib.deno.shared_globals.d.ts
vendored
|
@ -6,7 +6,6 @@
|
|||
/// <reference no-default-lib="true" />
|
||||
/// <reference lib="esnext" />
|
||||
/// <reference lib="deno.console" />
|
||||
/// <reference lib="deno.file" />
|
||||
/// <reference lib="deno.url" />
|
||||
/// <reference lib="deno.web" />
|
||||
/// <reference lib="deno.fetch" />
|
||||
|
|
|
@ -19,7 +19,7 @@ use deno_core::futures;
|
|||
use deno_core::futures::future::FutureExt;
|
||||
use deno_core::ModuleSpecifier;
|
||||
use deno_runtime::deno_fetch::reqwest;
|
||||
use deno_runtime::deno_file::BlobUrlStore;
|
||||
use deno_runtime::deno_web::BlobUrlStore;
|
||||
use deno_runtime::permissions::Permissions;
|
||||
use log::debug;
|
||||
use log::info;
|
||||
|
@ -579,7 +579,7 @@ mod tests {
|
|||
use deno_core::error::get_custom_error_class;
|
||||
use deno_core::resolve_url;
|
||||
use deno_core::resolve_url_or_path;
|
||||
use deno_runtime::deno_file::Blob;
|
||||
use deno_runtime::deno_web::Blob;
|
||||
use std::rc::Rc;
|
||||
use tempfile::TempDir;
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ use deno_core::serde_json::json;
|
|||
use deno_core::url::Position;
|
||||
use deno_core::url::Url;
|
||||
use deno_core::ModuleSpecifier;
|
||||
use deno_runtime::deno_file::BlobUrlStore;
|
||||
use deno_runtime::deno_web::BlobUrlStore;
|
||||
use deno_runtime::permissions::Permissions;
|
||||
use log::error;
|
||||
use lspower::lsp;
|
||||
|
|
|
@ -330,12 +330,11 @@ fn print_cache_info(
|
|||
|
||||
pub fn get_types(unstable: bool) -> String {
|
||||
let mut types = format!(
|
||||
"{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}",
|
||||
"{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}",
|
||||
crate::tsc::DENO_NS_LIB,
|
||||
crate::tsc::DENO_CONSOLE_LIB,
|
||||
crate::tsc::DENO_URL_LIB,
|
||||
crate::tsc::DENO_WEB_LIB,
|
||||
crate::tsc::DENO_FILE_LIB,
|
||||
crate::tsc::DENO_FETCH_LIB,
|
||||
crate::tsc::DENO_WEBGPU_LIB,
|
||||
crate::tsc::DENO_WEBSOCKET_LIB,
|
||||
|
|
|
@ -16,7 +16,7 @@ use crate::source_maps::SourceMapGetter;
|
|||
use crate::specifier_handler::FetchHandler;
|
||||
use crate::version;
|
||||
use deno_runtime::deno_broadcast_channel::InMemoryBroadcastChannel;
|
||||
use deno_runtime::deno_file::BlobUrlStore;
|
||||
use deno_runtime::deno_web::BlobUrlStore;
|
||||
use deno_runtime::inspector_server::InspectorServer;
|
||||
use deno_runtime::permissions::Permissions;
|
||||
|
||||
|
|
|
@ -574,7 +574,7 @@ pub mod tests {
|
|||
use crate::file_fetcher::CacheSetting;
|
||||
use crate::http_cache::HttpCache;
|
||||
use deno_core::resolve_url_or_path;
|
||||
use deno_runtime::deno_file::BlobUrlStore;
|
||||
use deno_runtime::deno_web::BlobUrlStore;
|
||||
use tempfile::TempDir;
|
||||
|
||||
macro_rules! map (
|
||||
|
|
|
@ -23,7 +23,7 @@ use deno_core::ModuleLoader;
|
|||
use deno_core::ModuleSpecifier;
|
||||
use deno_core::OpState;
|
||||
use deno_runtime::deno_broadcast_channel::InMemoryBroadcastChannel;
|
||||
use deno_runtime::deno_file::BlobUrlStore;
|
||||
use deno_runtime::deno_web::BlobUrlStore;
|
||||
use deno_runtime::permissions::Permissions;
|
||||
use deno_runtime::permissions::PermissionsOptions;
|
||||
use deno_runtime::worker::MainWorker;
|
||||
|
|
|
@ -33,7 +33,6 @@ pub static DENO_NS_LIB: &str = include_str!("dts/lib.deno.ns.d.ts");
|
|||
pub static DENO_CONSOLE_LIB: &str = include_str!(env!("DENO_CONSOLE_LIB_PATH"));
|
||||
pub static DENO_URL_LIB: &str = include_str!(env!("DENO_URL_LIB_PATH"));
|
||||
pub static DENO_WEB_LIB: &str = include_str!(env!("DENO_WEB_LIB_PATH"));
|
||||
pub static DENO_FILE_LIB: &str = include_str!(env!("DENO_FILE_LIB_PATH"));
|
||||
pub static DENO_FETCH_LIB: &str = include_str!(env!("DENO_FETCH_LIB_PATH"));
|
||||
pub static DENO_WEBGPU_LIB: &str = include_str!(env!("DENO_WEBGPU_LIB_PATH"));
|
||||
pub static DENO_WEBSOCKET_LIB: &str =
|
||||
|
|
|
@ -3,8 +3,7 @@
|
|||
// @ts-check
|
||||
/// <reference path="../webidl/internal.d.ts" />
|
||||
/// <reference path="../web/internal.d.ts" />
|
||||
/// <reference path="../file/internal.d.ts" />
|
||||
/// <reference path="../file/lib.deno_file.d.ts" />
|
||||
/// <reference path="../web/lib.deno_web.d.ts" />
|
||||
/// <reference path="./internal.d.ts" />
|
||||
/// <reference path="./11_streams_types.d.ts" />
|
||||
/// <reference path="./lib.deno_fetch.d.ts" />
|
||||
|
|
|
@ -3,8 +3,7 @@
|
|||
// @ts-check
|
||||
/// <reference path="../webidl/internal.d.ts" />
|
||||
/// <reference path="../web/internal.d.ts" />
|
||||
/// <reference path="../file/internal.d.ts" />
|
||||
/// <reference path="../file/lib.deno_file.d.ts" />
|
||||
/// <reference path="../web/lib.deno_web.d.ts" />
|
||||
/// <reference path="./internal.d.ts" />
|
||||
/// <reference path="./11_streams_types.d.ts" />
|
||||
/// <reference path="./lib.deno_fetch.d.ts" />
|
||||
|
|
|
@ -5,8 +5,7 @@
|
|||
/// <reference path="../url/internal.d.ts" />
|
||||
/// <reference path="../url/lib.deno_url.d.ts" />
|
||||
/// <reference path="../web/internal.d.ts" />
|
||||
/// <reference path="../file/internal.d.ts" />
|
||||
/// <reference path="../file/lib.deno_file.d.ts" />
|
||||
/// <reference path="../web/lib.deno_web.d.ts" />
|
||||
/// <reference path="./internal.d.ts" />
|
||||
/// <reference path="./11_streams_types.d.ts" />
|
||||
/// <reference path="./lib.deno_fetch.d.ts" />
|
||||
|
|
|
@ -4,8 +4,7 @@
|
|||
/// <reference path="../webidl/internal.d.ts" />
|
||||
/// <reference path="../web/internal.d.ts" />
|
||||
/// <reference path="../url/internal.d.ts" />
|
||||
/// <reference path="../file/internal.d.ts" />
|
||||
/// <reference path="../file/lib.deno_file.d.ts" />
|
||||
/// <reference path="../web/lib.deno_web.d.ts" />
|
||||
/// <reference path="./internal.d.ts" />
|
||||
/// <reference path="./11_streams_types.d.ts" />
|
||||
/// <reference path="./lib.deno_fetch.d.ts" />
|
||||
|
|
|
@ -3,8 +3,7 @@
|
|||
// @ts-check
|
||||
/// <reference path="../webidl/internal.d.ts" />
|
||||
/// <reference path="../web/internal.d.ts" />
|
||||
/// <reference path="../file/internal.d.ts" />
|
||||
/// <reference path="../file/lib.deno_file.d.ts" />
|
||||
/// <reference path="../web/lib.deno_web.d.ts" />
|
||||
/// <reference path="./internal.d.ts" />
|
||||
/// <reference path="./11_streams_types.d.ts" />
|
||||
/// <reference path="./lib.deno_fetch.d.ts" />
|
||||
|
|
|
@ -4,8 +4,7 @@
|
|||
/// <reference path="../webidl/internal.d.ts" />
|
||||
/// <reference path="../web/internal.d.ts" />
|
||||
/// <reference path="../url/internal.d.ts" />
|
||||
/// <reference path="../file/internal.d.ts" />
|
||||
/// <reference path="../file/lib.deno_file.d.ts" />
|
||||
/// <reference path="../web/lib.deno_web.d.ts" />
|
||||
/// <reference path="./internal.d.ts" />
|
||||
/// <reference path="./11_streams_types.d.ts" />
|
||||
/// <reference path="./lib.deno_fetch.d.ts" />
|
||||
|
|
|
@ -17,7 +17,7 @@ path = "lib.rs"
|
|||
bytes = "1.0.1"
|
||||
data-url = "0.1.0"
|
||||
deno_core = { version = "0.89.0", path = "../../core" }
|
||||
deno_file = { version = "0.7.0", path = "../file" }
|
||||
deno_web = { version = "0.39.0", path = "../web" }
|
||||
http = "0.2.4"
|
||||
reqwest = { version = "0.11.3", default-features = false, features = ["rustls-tls", "stream", "gzip", "brotli"] }
|
||||
serde = { version = "1.0.125", features = ["derive"] }
|
||||
|
|
|
@ -25,7 +25,7 @@ use deno_core::ResourceId;
|
|||
use deno_core::ZeroCopyBuf;
|
||||
|
||||
use data_url::DataUrl;
|
||||
use deno_file::BlobUrlStore;
|
||||
use deno_web::BlobUrlStore;
|
||||
use reqwest::header::HeaderMap;
|
||||
use reqwest::header::HeaderName;
|
||||
use reqwest::header::HeaderValue;
|
||||
|
|
|
@ -1,18 +0,0 @@
|
|||
# Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
|
||||
|
||||
[package]
|
||||
name = "deno_file"
|
||||
version = "0.7.0"
|
||||
edition = "2018"
|
||||
description = "File API implementation for Deno"
|
||||
authors = ["the Deno authors"]
|
||||
license = "MIT"
|
||||
readme = "README.md"
|
||||
repository = "https://github.com/denoland/deno"
|
||||
|
||||
[lib]
|
||||
path = "lib.rs"
|
||||
|
||||
[dependencies]
|
||||
deno_core = { version = "0.89.0", path = "../../core" }
|
||||
uuid = { version = "0.8.2", features = ["v4"] }
|
|
@ -1,5 +0,0 @@
|
|||
# deno_file
|
||||
|
||||
This crate implements the File API.
|
||||
|
||||
Spec: https://w3c.github.io/FileAPI
|
18
extensions/file/internal.d.ts
vendored
18
extensions/file/internal.d.ts
vendored
|
@ -1,18 +0,0 @@
|
|||
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
|
||||
|
||||
/// <reference no-default-lib="true" />
|
||||
/// <reference lib="esnext" />
|
||||
|
||||
declare namespace globalThis {
|
||||
declare namespace __bootstrap {
|
||||
declare var file: {
|
||||
Blob: typeof Blob & {
|
||||
[globalThis.__bootstrap.file._byteSequence]: Uint8Array;
|
||||
};
|
||||
readonly _byteSequence: unique symbol;
|
||||
File: typeof File & {
|
||||
[globalThis.__bootstrap.file._byteSequence]: Uint8Array;
|
||||
};
|
||||
};
|
||||
}
|
||||
}
|
40
extensions/file/lib.deno_file.d.ts
vendored
40
extensions/file/lib.deno_file.d.ts
vendored
|
@ -1,40 +0,0 @@
|
|||
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
|
||||
|
||||
/// <reference no-default-lib="true" />
|
||||
/// <reference lib="esnext" />
|
||||
|
||||
type BlobPart = BufferSource | Blob | string;
|
||||
|
||||
interface BlobPropertyBag {
|
||||
type?: string;
|
||||
endings?: "transparent" | "native";
|
||||
}
|
||||
|
||||
/** A file-like object of immutable, raw data. Blobs represent data that isn't necessarily in a JavaScript-native format. The File interface is based on Blob, inheriting blob functionality and expanding it to support files on the user's system. */
|
||||
declare class Blob {
|
||||
constructor(blobParts?: BlobPart[], options?: BlobPropertyBag);
|
||||
|
||||
readonly size: number;
|
||||
readonly type: string;
|
||||
arrayBuffer(): Promise<ArrayBuffer>;
|
||||
slice(start?: number, end?: number, contentType?: string): Blob;
|
||||
stream(): ReadableStream<Uint8Array>;
|
||||
text(): Promise<string>;
|
||||
}
|
||||
|
||||
interface FilePropertyBag extends BlobPropertyBag {
|
||||
lastModified?: number;
|
||||
}
|
||||
|
||||
/** Provides information about files and allows JavaScript in a web page to
|
||||
* access their content. */
|
||||
declare class File extends Blob {
|
||||
constructor(
|
||||
fileBits: BlobPart[],
|
||||
fileName: string,
|
||||
options?: FilePropertyBag,
|
||||
);
|
||||
|
||||
readonly lastModified: number;
|
||||
readonly name: string;
|
||||
}
|
|
@ -1,120 +0,0 @@
|
|||
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
|
||||
|
||||
use deno_core::error::null_opbuf;
|
||||
use deno_core::error::AnyError;
|
||||
use deno_core::include_js_files;
|
||||
use deno_core::op_sync;
|
||||
use deno_core::url::Url;
|
||||
use deno_core::Extension;
|
||||
use deno_core::ModuleSpecifier;
|
||||
use deno_core::ZeroCopyBuf;
|
||||
use std::collections::HashMap;
|
||||
use std::path::PathBuf;
|
||||
use std::sync::Arc;
|
||||
use std::sync::Mutex;
|
||||
use uuid::Uuid;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct Blob {
|
||||
pub data: Vec<u8>,
|
||||
pub media_type: String,
|
||||
}
|
||||
|
||||
pub struct Location(pub Url);
|
||||
|
||||
#[derive(Debug, Default, Clone)]
|
||||
pub struct BlobUrlStore(Arc<Mutex<HashMap<Url, Blob>>>);
|
||||
|
||||
impl BlobUrlStore {
|
||||
pub fn get(&self, mut url: Url) -> Result<Option<Blob>, AnyError> {
|
||||
let blob_store = self.0.lock().unwrap();
|
||||
url.set_fragment(None);
|
||||
Ok(blob_store.get(&url).cloned())
|
||||
}
|
||||
|
||||
pub fn insert(&self, blob: Blob, maybe_location: Option<Url>) -> Url {
|
||||
let origin = if let Some(location) = maybe_location {
|
||||
location.origin().ascii_serialization()
|
||||
} else {
|
||||
"null".to_string()
|
||||
};
|
||||
let id = Uuid::new_v4();
|
||||
let url = Url::parse(&format!("blob:{}/{}", origin, id)).unwrap();
|
||||
|
||||
let mut blob_store = self.0.lock().unwrap();
|
||||
blob_store.insert(url.clone(), blob);
|
||||
|
||||
url
|
||||
}
|
||||
|
||||
pub fn remove(&self, url: &ModuleSpecifier) {
|
||||
let mut blob_store = self.0.lock().unwrap();
|
||||
blob_store.remove(&url);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn op_file_create_object_url(
|
||||
state: &mut deno_core::OpState,
|
||||
media_type: String,
|
||||
zero_copy: Option<ZeroCopyBuf>,
|
||||
) -> Result<String, AnyError> {
|
||||
let data = zero_copy.ok_or_else(null_opbuf)?;
|
||||
let blob = Blob {
|
||||
data: data.to_vec(),
|
||||
media_type,
|
||||
};
|
||||
|
||||
let maybe_location = state.try_borrow::<Location>();
|
||||
let blob_store = state.borrow::<BlobUrlStore>();
|
||||
|
||||
let url =
|
||||
blob_store.insert(blob, maybe_location.map(|location| location.0.clone()));
|
||||
|
||||
Ok(url.to_string())
|
||||
}
|
||||
|
||||
pub fn op_file_revoke_object_url(
|
||||
state: &mut deno_core::OpState,
|
||||
url: String,
|
||||
_: (),
|
||||
) -> Result<(), AnyError> {
|
||||
let url = Url::parse(&url)?;
|
||||
let blob_store = state.borrow::<BlobUrlStore>();
|
||||
blob_store.remove(&url);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn init(
|
||||
blob_url_store: BlobUrlStore,
|
||||
maybe_location: Option<Url>,
|
||||
) -> Extension {
|
||||
Extension::builder()
|
||||
.js(include_js_files!(
|
||||
prefix "deno:extensions/file",
|
||||
"01_file.js",
|
||||
"02_filereader.js",
|
||||
"03_blob_url.js",
|
||||
))
|
||||
.ops(vec![
|
||||
(
|
||||
"op_file_create_object_url",
|
||||
op_sync(op_file_create_object_url),
|
||||
),
|
||||
(
|
||||
"op_file_revoke_object_url",
|
||||
op_sync(op_file_revoke_object_url),
|
||||
),
|
||||
])
|
||||
.state(move |state| {
|
||||
state.put(blob_url_store.clone());
|
||||
if let Some(location) = maybe_location.clone() {
|
||||
state.put(Location(location));
|
||||
}
|
||||
Ok(())
|
||||
})
|
||||
.build()
|
||||
}
|
||||
|
||||
pub fn get_declaration() -> PathBuf {
|
||||
PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("lib.deno_file.d.ts")
|
||||
}
|
|
@ -7,7 +7,6 @@
|
|||
/// <reference path="../web/internal.d.ts" />
|
||||
/// <reference path="../web/lib.deno_web.d.ts" />
|
||||
/// <reference path="./internal.d.ts" />
|
||||
/// <reference path="./lib.deno_file.d.ts" />
|
||||
/// <reference lib="esnext" />
|
||||
"use strict";
|
||||
|
|
@ -7,7 +7,6 @@
|
|||
/// <reference path="../web/internal.d.ts" />
|
||||
/// <reference path="../web/lib.deno_web.d.ts" />
|
||||
/// <reference path="./internal.d.ts" />
|
||||
/// <reference path="./lib.deno_file.d.ts" />
|
||||
/// <reference lib="esnext" />
|
||||
|
||||
"use strict";
|
|
@ -9,7 +9,6 @@
|
|||
/// <reference path="../url/internal.d.ts" />
|
||||
/// <reference path="../url/lib.deno_url.d.ts" />
|
||||
/// <reference path="./internal.d.ts" />
|
||||
/// <reference path="./lib.deno_file.d.ts" />
|
||||
/// <reference lib="esnext" />
|
||||
"use strict";
|
||||
|
|
@ -18,6 +18,7 @@ base64 = "0.13.0"
|
|||
deno_core = { version = "0.89.0", path = "../../core" }
|
||||
encoding_rs = "0.8.28"
|
||||
serde = "1.0"
|
||||
uuid = { version = "0.8.2", features = ["v4"] }
|
||||
|
||||
[dev-dependencies]
|
||||
futures = "0.3.15"
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
# deno web
|
||||
|
||||
Op crate that implements Event, TextEncoder, TextDecoder.
|
||||
Op crate that implements Event, TextEncoder, TextDecoder and File API
|
||||
(https://w3c.github.io/FileAPI).
|
||||
|
||||
Testing for text encoding is done via WPT in cli/.
|
||||
|
|
10
extensions/web/internal.d.ts
vendored
10
extensions/web/internal.d.ts
vendored
|
@ -70,5 +70,15 @@ declare namespace globalThis {
|
|||
atob(data: string): string;
|
||||
btoa(data: string): string;
|
||||
};
|
||||
|
||||
declare var file: {
|
||||
Blob: typeof Blob & {
|
||||
[globalThis.__bootstrap.file._byteSequence]: Uint8Array;
|
||||
};
|
||||
readonly _byteSequence: unique symbol;
|
||||
File: typeof File & {
|
||||
[globalThis.__bootstrap.file._byteSequence]: Uint8Array;
|
||||
};
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
36
extensions/web/lib.deno_web.d.ts
vendored
36
extensions/web/lib.deno_web.d.ts
vendored
|
@ -341,3 +341,39 @@ declare var FileReader: {
|
|||
readonly EMPTY: number;
|
||||
readonly LOADING: number;
|
||||
};
|
||||
|
||||
type BlobPart = BufferSource | Blob | string;
|
||||
|
||||
interface BlobPropertyBag {
|
||||
type?: string;
|
||||
endings?: "transparent" | "native";
|
||||
}
|
||||
|
||||
/** A file-like object of immutable, raw data. Blobs represent data that isn't necessarily in a JavaScript-native format. The File interface is based on Blob, inheriting blob functionality and expanding it to support files on the user's system. */
|
||||
declare class Blob {
|
||||
constructor(blobParts?: BlobPart[], options?: BlobPropertyBag);
|
||||
|
||||
readonly size: number;
|
||||
readonly type: string;
|
||||
arrayBuffer(): Promise<ArrayBuffer>;
|
||||
slice(start?: number, end?: number, contentType?: string): Blob;
|
||||
stream(): ReadableStream<Uint8Array>;
|
||||
text(): Promise<string>;
|
||||
}
|
||||
|
||||
interface FilePropertyBag extends BlobPropertyBag {
|
||||
lastModified?: number;
|
||||
}
|
||||
|
||||
/** Provides information about files and allows JavaScript in a web page to
|
||||
* access their content. */
|
||||
declare class File extends Blob {
|
||||
constructor(
|
||||
fileBits: BlobPart[],
|
||||
fileName: string,
|
||||
options?: FilePropertyBag,
|
||||
);
|
||||
|
||||
readonly lastModified: number;
|
||||
readonly name: string;
|
||||
}
|
||||
|
|
|
@ -1,12 +1,15 @@
|
|||
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
|
||||
|
||||
use deno_core::error::bad_resource_id;
|
||||
use deno_core::error::null_opbuf;
|
||||
use deno_core::error::range_error;
|
||||
use deno_core::error::type_error;
|
||||
use deno_core::error::AnyError;
|
||||
use deno_core::include_js_files;
|
||||
use deno_core::op_sync;
|
||||
use deno_core::url::Url;
|
||||
use deno_core::Extension;
|
||||
use deno_core::ModuleSpecifier;
|
||||
use deno_core::OpState;
|
||||
use deno_core::Resource;
|
||||
use deno_core::ResourceId;
|
||||
|
@ -17,15 +20,21 @@ use encoding_rs::DecoderResult;
|
|||
use encoding_rs::Encoding;
|
||||
use serde::Deserialize;
|
||||
use serde::Serialize;
|
||||
|
||||
use std::borrow::Cow;
|
||||
use std::cell::RefCell;
|
||||
use std::collections::HashMap;
|
||||
use std::fmt;
|
||||
use std::path::PathBuf;
|
||||
use std::sync::Arc;
|
||||
use std::sync::Mutex;
|
||||
use std::usize;
|
||||
use uuid::Uuid;
|
||||
|
||||
/// Load and execute the javascript code.
|
||||
pub fn init() -> Extension {
|
||||
pub fn init(
|
||||
blob_url_store: BlobUrlStore,
|
||||
maybe_location: Option<Url>,
|
||||
) -> Extension {
|
||||
Extension::builder()
|
||||
.js(include_js_files!(
|
||||
prefix "deno:extensions/web",
|
||||
|
@ -38,6 +47,9 @@ pub fn init() -> Extension {
|
|||
"04_global_interfaces.js",
|
||||
"05_base64.js",
|
||||
"08_text_encoding.js",
|
||||
"09_file.js",
|
||||
"10_filereader.js",
|
||||
"11_blob_url.js",
|
||||
"12_location.js",
|
||||
))
|
||||
.ops(vec![
|
||||
|
@ -50,7 +62,22 @@ pub fn init() -> Extension {
|
|||
("op_encoding_new_decoder", op_sync(op_encoding_new_decoder)),
|
||||
("op_encoding_decode", op_sync(op_encoding_decode)),
|
||||
("op_encoding_encode_into", op_sync(op_encoding_encode_into)),
|
||||
(
|
||||
"op_file_create_object_url",
|
||||
op_sync(op_file_create_object_url),
|
||||
),
|
||||
(
|
||||
"op_file_revoke_object_url",
|
||||
op_sync(op_file_revoke_object_url),
|
||||
),
|
||||
])
|
||||
.state(move |state| {
|
||||
state.put(blob_url_store.clone());
|
||||
if let Some(location) = maybe_location.clone() {
|
||||
state.put(Location(location));
|
||||
}
|
||||
Ok(())
|
||||
})
|
||||
.build()
|
||||
}
|
||||
|
||||
|
@ -318,3 +345,73 @@ pub fn get_error_class_name(e: &AnyError) -> Option<&'static str> {
|
|||
.map(|_| "DOMExceptionInvalidCharacterError")
|
||||
})
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct Blob {
|
||||
pub data: Vec<u8>,
|
||||
pub media_type: String,
|
||||
}
|
||||
|
||||
pub struct Location(pub Url);
|
||||
|
||||
#[derive(Debug, Default, Clone)]
|
||||
pub struct BlobUrlStore(Arc<Mutex<HashMap<Url, Blob>>>);
|
||||
|
||||
impl BlobUrlStore {
|
||||
pub fn get(&self, mut url: Url) -> Result<Option<Blob>, AnyError> {
|
||||
let blob_store = self.0.lock().unwrap();
|
||||
url.set_fragment(None);
|
||||
Ok(blob_store.get(&url).cloned())
|
||||
}
|
||||
|
||||
pub fn insert(&self, blob: Blob, maybe_location: Option<Url>) -> Url {
|
||||
let origin = if let Some(location) = maybe_location {
|
||||
location.origin().ascii_serialization()
|
||||
} else {
|
||||
"null".to_string()
|
||||
};
|
||||
let id = Uuid::new_v4();
|
||||
let url = Url::parse(&format!("blob:{}/{}", origin, id)).unwrap();
|
||||
|
||||
let mut blob_store = self.0.lock().unwrap();
|
||||
blob_store.insert(url.clone(), blob);
|
||||
|
||||
url
|
||||
}
|
||||
|
||||
pub fn remove(&self, url: &ModuleSpecifier) {
|
||||
let mut blob_store = self.0.lock().unwrap();
|
||||
blob_store.remove(&url);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn op_file_create_object_url(
|
||||
state: &mut deno_core::OpState,
|
||||
media_type: String,
|
||||
zero_copy: Option<ZeroCopyBuf>,
|
||||
) -> Result<String, AnyError> {
|
||||
let data = zero_copy.ok_or_else(null_opbuf)?;
|
||||
let blob = Blob {
|
||||
data: data.to_vec(),
|
||||
media_type,
|
||||
};
|
||||
|
||||
let maybe_location = state.try_borrow::<Location>();
|
||||
let blob_store = state.borrow::<BlobUrlStore>();
|
||||
|
||||
let url =
|
||||
blob_store.insert(blob, maybe_location.map(|location| location.0.clone()));
|
||||
|
||||
Ok(url.to_string())
|
||||
}
|
||||
|
||||
pub fn op_file_revoke_object_url(
|
||||
state: &mut deno_core::OpState,
|
||||
url: String,
|
||||
_: (),
|
||||
) -> Result<(), AnyError> {
|
||||
let url = Url::parse(&url)?;
|
||||
let blob_store = state.borrow::<BlobUrlStore>();
|
||||
blob_store.remove(&url);
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
@ -23,7 +23,6 @@ deno_console = { version = "0.8.0", path = "../extensions/console" }
|
|||
deno_core = { version = "0.89.0", path = "../core" }
|
||||
deno_crypto = { version = "0.22.0", path = "../extensions/crypto" }
|
||||
deno_fetch = { version = "0.30.0", path = "../extensions/fetch" }
|
||||
deno_file = { version = "0.7.0", path = "../extensions/file" }
|
||||
deno_timers = { version = "0.6.0", path = "../extensions/timers" }
|
||||
deno_url = { version = "0.8.0", path = "../extensions/url" }
|
||||
deno_web = { version = "0.39.0", path = "../extensions/web" }
|
||||
|
@ -42,7 +41,6 @@ deno_console = { version = "0.8.0", path = "../extensions/console" }
|
|||
deno_core = { version = "0.89.0", path = "../core" }
|
||||
deno_crypto = { version = "0.22.0", path = "../extensions/crypto" }
|
||||
deno_fetch = { version = "0.30.0", path = "../extensions/fetch" }
|
||||
deno_file = { version = "0.7.0", path = "../extensions/file" }
|
||||
deno_timers = { version = "0.6.0", path = "../extensions/timers" }
|
||||
deno_url = { version = "0.8.0", path = "../extensions/url" }
|
||||
deno_web = { version = "0.39.0", path = "../extensions/web" }
|
||||
|
|
|
@ -41,8 +41,7 @@ fn create_runtime_snapshot(snapshot_path: &Path, files: Vec<PathBuf>) {
|
|||
deno_webidl::init(),
|
||||
deno_console::init(),
|
||||
deno_url::init(),
|
||||
deno_web::init(),
|
||||
deno_file::init(Default::default(), Default::default()),
|
||||
deno_web::init(Default::default(), Default::default()),
|
||||
deno_fetch::init::<deno_fetch::NoFetchPermissions>("".to_owned(), None),
|
||||
deno_websocket::init::<deno_websocket::NoWebSocketPermissions>(
|
||||
"".to_owned(),
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
use deno_core::error::AnyError;
|
||||
use deno_core::FsModuleLoader;
|
||||
use deno_runtime::deno_broadcast_channel::InMemoryBroadcastChannel;
|
||||
use deno_runtime::deno_file::BlobUrlStore;
|
||||
use deno_runtime::deno_web::BlobUrlStore;
|
||||
use deno_runtime::permissions::Permissions;
|
||||
use deno_runtime::worker::MainWorker;
|
||||
use deno_runtime::worker::WorkerOptions;
|
||||
|
|
|
@ -4,7 +4,6 @@ pub use deno_broadcast_channel;
|
|||
pub use deno_console;
|
||||
pub use deno_crypto;
|
||||
pub use deno_fetch;
|
||||
pub use deno_file;
|
||||
pub use deno_timers;
|
||||
pub use deno_url;
|
||||
pub use deno_web;
|
||||
|
|
|
@ -28,7 +28,7 @@ use deno_core::ModuleLoader;
|
|||
use deno_core::ModuleSpecifier;
|
||||
use deno_core::RuntimeOptions;
|
||||
use deno_core::ZeroCopyBuf;
|
||||
use deno_file::BlobUrlStore;
|
||||
use deno_web::BlobUrlStore;
|
||||
use log::debug;
|
||||
use std::cell::RefCell;
|
||||
use std::env;
|
||||
|
@ -255,11 +255,7 @@ impl WebWorker {
|
|||
deno_webidl::init(),
|
||||
deno_console::init(),
|
||||
deno_url::init(),
|
||||
deno_web::init(),
|
||||
deno_file::init(
|
||||
options.blob_url_store.clone(),
|
||||
Some(main_module.clone()),
|
||||
),
|
||||
deno_web::init(options.blob_url_store.clone(), Some(main_module.clone())),
|
||||
deno_fetch::init::<Permissions>(
|
||||
options.user_agent.clone(),
|
||||
options.ca_data.clone(),
|
||||
|
|
|
@ -23,7 +23,7 @@ use deno_core::ModuleId;
|
|||
use deno_core::ModuleLoader;
|
||||
use deno_core::ModuleSpecifier;
|
||||
use deno_core::RuntimeOptions;
|
||||
use deno_file::BlobUrlStore;
|
||||
use deno_web::BlobUrlStore;
|
||||
use log::debug;
|
||||
use std::env;
|
||||
use std::pin::Pin;
|
||||
|
@ -96,8 +96,7 @@ impl MainWorker {
|
|||
deno_webidl::init(),
|
||||
deno_console::init(),
|
||||
deno_url::init(),
|
||||
deno_web::init(),
|
||||
deno_file::init(options.blob_url_store.clone(), options.location.clone()),
|
||||
deno_web::init(options.blob_url_store.clone(), options.location.clone()),
|
||||
deno_fetch::init::<Permissions>(
|
||||
options.user_agent.clone(),
|
||||
options.ca_data.clone(),
|
||||
|
|
|
@ -34,10 +34,8 @@ between the crates, it must be done in specific order:
|
|||
first
|
||||
- `bench_util`
|
||||
- crates in `extensions/` directory
|
||||
- `deno_crypto` and `deno_webstorage` depend on `deno_web`, so the latter must
|
||||
be bumped and released first
|
||||
- `deno_fetch` depends on `deno_file`, so the latter must be bumped and
|
||||
released first
|
||||
- `deno_fetch`, `deno_crypto` and `deno_webstorage` depend on `deno_web`, so
|
||||
the latter must be bumped and released first
|
||||
- `runtime` - this crate depends on `deno_core` and all crates in `extensions/`
|
||||
directory
|
||||
|
||||
|
|
Loading…
Reference in a new issue