1use deno_core::Extension;
2use deno_fs::{FileSystemRc, sync::MaybeArc};
3
4trait ExtensionTrait<A> {
5 fn init(options: A) -> Extension;
6
7 fn for_warmup(mut ext: Extension) -> Extension {
8 ext.js_files = ::std::borrow::Cow::Borrowed(&[]);
9 ext.esm_files = ::std::borrow::Cow::Borrowed(&[]);
10 ext.esm_entry_point = ::std::option::Option::None;
11
12 ext
13 }
14
15 fn build(options: A, is_snapshot: bool) -> Extension {
16 let ext: Extension = Self::init(options);
17 if is_snapshot { Self::for_warmup(ext) } else { ext }
18 }
19}
20
21mod cache;
22mod cron;
23mod crypto;
24mod fetch;
25mod ffi;
26mod fs;
27mod http;
28mod io;
29mod kv;
30mod napi;
31mod node;
32mod node_crypto;
33mod node_sqlite;
34mod promise_manager;
35mod rari;
36mod react;
37mod rsc_modules;
38mod rsc_renderer;
39mod runtime;
40mod server_functions;
41mod web;
42mod webgpu;
43mod webidl;
44mod websocket;
45mod webstorage;
46
47#[derive(Clone)]
48pub struct ExtensionOptions {
49 pub web: web::WebOptions,
50 pub io_pipes: Option<deno_io::Stdio>,
51 pub cache: Option<()>,
52 pub filesystem: FileSystemRc,
53 pub crypto_seed: Option<u64>,
54 pub node_resolver: std::sync::Arc<node::resolvers::Resolver>,
55 pub broadcast_channel: deno_web::InMemoryBroadcastChannel,
56 pub webstorage_origin_storage_dir: Option<std::path::PathBuf>,
57 pub kv_store: kv::KvStore,
58}
59
60impl Default for ExtensionOptions {
61 fn default() -> Self {
62 Self {
63 web: web::WebOptions::default(),
64 io_pipes: Some(deno_io::Stdio::default()),
65 filesystem: MaybeArc::new(deno_fs::RealFs),
66 cache: Some(()),
67 crypto_seed: None,
68 node_resolver: std::sync::Arc::new(node::resolvers::Resolver::default()),
69 broadcast_channel: deno_web::InMemoryBroadcastChannel::default(),
70 webstorage_origin_storage_dir: None,
71 kv_store: kv::KvStore::default(),
72 }
73 }
74}
75
76pub(crate) fn extensions(options: &ExtensionOptions, is_snapshot: bool) -> Vec<Extension> {
77 let mut extensions = Vec::new();
78
79 extensions.extend(rari::extensions(is_snapshot));
80 extensions.extend(promise_manager::extensions(is_snapshot));
81 extensions.extend(rsc_modules::extensions(is_snapshot));
82 extensions.extend(server_functions::extensions(is_snapshot));
83 extensions.extend(react::extensions(is_snapshot));
84 extensions.extend(rsc_renderer::extensions(is_snapshot));
85 extensions.extend(webidl::extensions(is_snapshot));
86 extensions.extend(web::extensions(options.web.clone(), is_snapshot));
87 extensions.extend(cache::extensions(options.cache, is_snapshot));
88 extensions.extend(crypto::extensions(options.crypto_seed, is_snapshot));
89 extensions.extend(fs::extensions(options.filesystem.clone(), is_snapshot));
90 extensions.extend(io::extensions(options.io_pipes.clone(), is_snapshot));
91 extensions
92 .extend(webstorage::extensions(options.webstorage_origin_storage_dir.clone(), is_snapshot));
93 extensions.extend(websocket::extensions(options.web.clone(), is_snapshot));
94 extensions.extend(http::extensions((), is_snapshot));
95 extensions.extend(fetch::extensions(is_snapshot, None));
96 extensions.extend(ffi::extensions(is_snapshot));
97 extensions.extend(kv::extensions(options.kv_store.clone(), is_snapshot));
98 extensions.extend(webgpu::extensions(is_snapshot));
99 extensions.extend(cron::extensions(is_snapshot));
100 extensions.extend(napi::extensions(is_snapshot));
101 extensions.extend(node_crypto::extensions(is_snapshot));
102 extensions.extend(node_sqlite::extensions(is_snapshot));
103 extensions.extend(node::extensions(options.node_resolver.clone(), is_snapshot));
104 extensions.push(deno_bundle_runtime::deno_bundle_runtime::init(None));
105 extensions.extend(runtime::extensions(options, None, is_snapshot));
106
107 extensions
108}