1pub mod io;
4pub mod ops;
5pub mod ops_tls;
6#[cfg(unix)]
7pub mod ops_unix;
8#[cfg(windows)]
9mod ops_win_pipe;
10mod quic;
11pub mod raw;
12pub mod resolve_addr;
13pub mod tcp;
14pub mod tunnel;
15#[cfg(windows)]
16pub mod win_pipe;
17
18use std::sync::Arc;
19
20use deno_core::OpState;
21use deno_features::FeatureChecker;
22use deno_tls::RootCertStoreProvider;
23use deno_tls::rustls::RootCertStore;
24pub use quic::QuicError;
25
26pub const UNSTABLE_FEATURE_NAME: &str = "net";
27
28fn check_unstable(state: &OpState, api_name: &str) {
30 state
31 .borrow::<Arc<FeatureChecker>>()
32 .check_or_exit(UNSTABLE_FEATURE_NAME, api_name);
33}
34
35#[derive(Clone)]
36pub struct DefaultTlsOptions {
37 pub root_cert_store_provider: Option<Arc<dyn RootCertStoreProvider>>,
38}
39
40impl DefaultTlsOptions {
41 pub fn root_cert_store(
42 &self,
43 ) -> Result<Option<RootCertStore>, deno_error::JsErrorBox> {
44 Ok(match &self.root_cert_store_provider {
45 Some(provider) => Some(provider.get_or_try_init()?.clone()),
46 None => None,
47 })
48 }
49}
50
51pub struct UnsafelyIgnoreCertificateErrors(pub Option<Vec<String>>);
56
57deno_core::extension!(deno_net,
58 deps = [ deno_web ],
59 ops = [
60 ops::op_net_accept_tcp,
61 ops::op_net_get_ips_from_perm_token,
62 ops::op_net_connect_tcp,
63 ops::op_net_listen_tcp,
64 ops::op_net_listen_udp,
65 ops::op_node_unstable_net_listen_udp,
66 ops::op_net_recv_udp,
67 ops::op_net_send_udp,
68 ops::op_net_join_multi_v4_udp,
69 ops::op_net_join_multi_v6_udp,
70 ops::op_net_leave_multi_v4_udp,
71 ops::op_net_leave_multi_v6_udp,
72 ops::op_net_set_multi_loopback_udp,
73 ops::op_net_set_multi_ttl_udp,
74 ops::op_net_set_broadcast_udp,
75 ops::op_net_validate_multicast,
76 ops::op_dns_resolve,
77 ops::op_net_get_system_dns_servers,
78 ops::op_set_nodelay,
79 ops::op_set_keepalive,
80 ops::op_net_listen_vsock,
81 ops::op_net_accept_vsock,
82 ops::op_net_connect_vsock,
83 ops::op_net_listen_tunnel,
84 ops::op_net_accept_tunnel,
85
86 ops_tls::op_tls_key_null,
87 ops_tls::op_tls_key_static,
88 ops_tls::op_tls_cert_resolver_create,
89 ops_tls::op_tls_cert_resolver_poll,
90 ops_tls::op_tls_cert_resolver_resolve,
91 ops_tls::op_tls_cert_resolver_resolve_error,
92 ops_tls::op_tls_start,
93 ops_tls::op_net_connect_tls,
94 ops_tls::op_net_listen_tls,
95 ops_tls::op_net_accept_tls,
96 ops_tls::op_tls_handshake,
97
98 ops_unix::op_net_accept_unix,
99 ops_unix::op_net_connect_unix,
100 ops_unix::op_net_listen_unix,
101 ops_unix::op_net_listen_unixpacket,
102 ops_unix::op_node_unstable_net_listen_unixpacket,
103 ops_unix::op_net_recv_unixpacket,
104 ops_unix::op_net_send_unixpacket,
105 ops_unix::op_net_unix_stream_from_fd,
106
107 ops_win_pipe::op_pipe_open,
108 ops_win_pipe::op_pipe_connect,
109 ops_win_pipe::op_pipe_windows_wait,
110
111 quic::op_quic_connecting_0rtt,
112 quic::op_quic_connecting_1rtt,
113 quic::op_quic_connection_accept_bi,
114 quic::op_quic_connection_accept_uni,
115 quic::op_quic_connection_close,
116 quic::op_quic_connection_closed,
117 quic::op_quic_connection_get_protocol,
118 quic::op_quic_connection_get_remote_addr,
119 quic::op_quic_connection_get_server_name,
120 quic::op_quic_connection_handshake,
121 quic::op_quic_connection_open_bi,
122 quic::op_quic_connection_open_uni,
123 quic::op_quic_connection_get_max_datagram_size,
124 quic::op_quic_connection_read_datagram,
125 quic::op_quic_connection_send_datagram,
126 quic::op_quic_endpoint_close,
127 quic::op_quic_endpoint_connect,
128 quic::op_quic_endpoint_create,
129 quic::op_quic_endpoint_get_addr,
130 quic::op_quic_endpoint_listen,
131 quic::op_quic_incoming_accept,
132 quic::op_quic_incoming_accept_0rtt,
133 quic::op_quic_incoming_ignore,
134 quic::op_quic_incoming_local_ip,
135 quic::op_quic_incoming_refuse,
136 quic::op_quic_incoming_remote_addr,
137 quic::op_quic_incoming_remote_addr_validated,
138 quic::op_quic_listener_accept,
139 quic::op_quic_listener_stop,
140 quic::op_quic_recv_stream_get_id,
141 quic::op_quic_send_stream_get_id,
142 quic::op_quic_send_stream_get_priority,
143 quic::op_quic_send_stream_set_priority,
144 quic::webtransport::op_webtransport_accept,
145 quic::webtransport::op_webtransport_connect,
146 ],
147 esm = [ "01_net.js", "02_tls.js" ],
148 lazy_loaded_esm = [ "03_quic.js" ],
149 options = {
150 root_cert_store_provider: Option<Arc<dyn RootCertStoreProvider>>,
151 unsafely_ignore_certificate_errors: Option<Vec<String>>,
152 },
153 state = |state, options| {
154 state.put(DefaultTlsOptions {
155 root_cert_store_provider: options.root_cert_store_provider,
156 });
157 state.put(UnsafelyIgnoreCertificateErrors(
158 options.unsafely_ignore_certificate_errors,
159 ));
160 },
161);
162
163#[cfg(not(unix))]
165mod ops_unix {
166 use deno_core::op2;
167
168 macro_rules! stub_op {
169 ($name:ident) => {
170 #[op2(fast)]
171 pub fn $name() -> Result<(), std::io::Error> {
172 let error_msg = format!(
173 "Operation `{:?}` not supported on non-unix platforms.",
174 stringify!($name)
175 );
176 Err(std::io::Error::new(
177 std::io::ErrorKind::Unsupported,
178 error_msg,
179 ))
180 }
181 };
182 }
183
184 stub_op!(op_net_accept_unix);
185 stub_op!(op_net_connect_unix);
186 stub_op!(op_net_listen_unix);
187 stub_op!(op_net_listen_unixpacket);
188 stub_op!(op_node_unstable_net_listen_unixpacket);
189 stub_op!(op_net_recv_unixpacket);
190 stub_op!(op_net_send_unixpacket);
191 stub_op!(op_net_unix_stream_from_fd);
192}
193
194#[cfg(not(windows))]
196mod ops_win_pipe {
197 use deno_core::op2;
198
199 use crate::ops::NetError;
200
201 #[op2(fast)]
202 #[smi]
203 pub fn op_pipe_open() -> Result<u32, NetError> {
204 Err(NetError::Io(std::io::Error::new(
205 std::io::ErrorKind::Unsupported,
206 "Windows named pipes are not supported on this platform",
207 )))
208 }
209
210 #[op2(fast)]
211 #[smi]
212 pub fn op_pipe_connect() -> Result<u32, NetError> {
213 Err(NetError::Io(std::io::Error::new(
214 std::io::ErrorKind::Unsupported,
215 "Windows named pipes are not supported on this platform",
216 )))
217 }
218
219 #[op2(fast)]
220 pub fn op_pipe_windows_wait() -> Result<(), NetError> {
221 Err(NetError::Io(std::io::Error::new(
222 std::io::ErrorKind::Unsupported,
223 "Windows named pipes are not supported on this platform",
224 )))
225 }
226}