Skip to main content

rari/runtime/ext/
mod.rs

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}