diff --git a/packages/bun-usockets/src/bsd.c b/packages/bun-usockets/src/bsd.c index bee84866b337..f4ab71d5d198 100644 --- a/packages/bun-usockets/src/bsd.c +++ b/packages/bun-usockets/src/bsd.c @@ -265,44 +265,6 @@ int bsd_udp_setup_sendbuf(struct udp_sendbuf *buf, size_t bufsize, void** payloa #endif } -// this one is needed for knowing the destination addr of udp packet -// an udp socket can only bind to one port, and that port never changes -// this function returns ONLY the IP address, not any port -int bsd_udp_packet_buffer_local_ip(struct udp_recvbuf *msgvec, int index, char *ip) { -#if defined(_WIN32) || defined(__APPLE__) - return 0; // not supported -#else - struct msghdr *mh = &((struct mmsghdr *) msgvec)[index].msg_hdr; - for (struct cmsghdr *cmsg = CMSG_FIRSTHDR(mh); cmsg != NULL; cmsg = CMSG_NXTHDR(mh, cmsg)) { - // ipv6 or ipv4 - if (cmsg->cmsg_level == IPPROTO_IP) { -#if defined(IP_PKTINFO) - if (cmsg->cmsg_type == IP_PKTINFO) { - struct in_pktinfo *pi = (struct in_pktinfo *) CMSG_DATA(cmsg); - memcpy(ip, &pi->ipi_addr, 4); - return 4; - } -#endif -#if defined(IP_RECVDSTADDR) - if (cmsg->cmsg_type == IP_RECVDSTADDR) { - memcpy(ip, (struct in_addr *) CMSG_DATA(cmsg), 4); - return 4; - } -#endif - } - - if (cmsg->cmsg_level == IPPROTO_IPV6 && cmsg->cmsg_type == IPV6_PKTINFO) { - struct in6_pktinfo *pi6 = (struct in6_pktinfo *) CMSG_DATA(cmsg); - memcpy(ip, &pi6->ipi6_addr, 16); - return 16; - } - } - - return 0; // no length - -#endif -} - char *bsd_udp_packet_buffer_peer(struct udp_recvbuf *msgvec, int index) { #if defined(_WIN32) return (char *)&msgvec->addr[index]; diff --git a/packages/bun-usockets/src/context.c b/packages/bun-usockets/src/context.c index 68b4216266b3..20e0eef08537 100644 --- a/packages/bun-usockets/src/context.c +++ b/packages/bun-usockets/src/context.c @@ -167,10 +167,6 @@ void us_socket_group_close_all(struct us_socket_group_t *group) { us_socket_group_close_all_ex(group, 1); } -unsigned short us_socket_group_timestamp(struct us_socket_group_t *group) { - return group->timestamp; -} - __attribute__((always_inline)) struct us_loop_t *us_socket_group_loop(struct us_socket_group_t *group) { return group->loop; } @@ -179,10 +175,6 @@ __attribute__((always_inline)) void *us_socket_group_ext(struct us_socket_group_ return group->ext; } -struct us_socket_group_t *us_socket_group_next(struct us_socket_group_t *group) { - return group->next; -} - /* ── Link / unlink ──────────────────────────────────────────────────────── */ static inline int us_internal_group_is_empty(struct us_socket_group_t *group) { @@ -468,10 +460,6 @@ void us_listen_socket_close(struct us_listen_socket_t *ls) { /* We cannot immediately free a listen socket as we can be inside an accept loop */ } -__attribute__((always_inline)) void *us_listen_socket_ext(struct us_listen_socket_t *ls) { - return ls + 1; -} - struct us_listen_socket_t *us_socket_group_head_listen_socket(struct us_socket_group_t *group) { return group->head_listen_sockets; } @@ -480,14 +468,6 @@ struct us_listen_socket_t *us_listen_socket_next(struct us_listen_socket_t *ls) return ls->next; } -LIBUS_SOCKET_DESCRIPTOR us_listen_socket_get_fd(struct us_listen_socket_t *ls) { - return us_poll_fd(&ls->s.p); -} - -int us_listen_socket_port(struct us_listen_socket_t *ls) { - return us_socket_local_port(&ls->s); -} - struct us_socket_group_t *us_listen_socket_group(struct us_listen_socket_t *ls) { return ls->accept_group; } diff --git a/packages/bun-usockets/src/crypto/openssl.c b/packages/bun-usockets/src/crypto/openssl.c index 91e7d3f78727..19ee4b28c90c 100644 --- a/packages/bun-usockets/src/crypto/openssl.c +++ b/packages/bun-usockets/src/crypto/openssl.c @@ -128,7 +128,6 @@ enum { /* SNI tree leaf — stored as the void* user in sni_tree.cpp. */ struct sni_node_t { SSL_CTX *ctx; - void *user; }; static _Atomic long ssl_ctx_live = 0; @@ -2957,9 +2956,8 @@ int us_listen_socket_add_server_name(struct us_listen_socket_t *ls, struct sni_node_t *node = us_malloc(sizeof(struct sni_node_t)); node->ctx = ctx; - node->user = user; SSL_CTX_up_ref(ctx); - /* Stash userdata on the SSL_CTX too so per-socket lookup via + /* Stash userdata on the SSL_CTX so per-socket lookup via * SSL_get_SSL_CTX works regardless of which ctx the SNI cb selected. */ us_ex_idx_ensure(); SSL_CTX_set_ex_data(ctx, us_sni_ex_idx, user); @@ -2980,13 +2978,6 @@ void us_listen_socket_remove_server_name(struct us_listen_socket_t *ls, sni_node_destructor(node); } -void *us_listen_socket_find_server_name_userdata(struct us_listen_socket_t *ls, - const char *hostname_pattern) { - if (!ls->sni) return NULL; - struct sni_node_t *node = (struct sni_node_t *)sni_find(ls->sni, hostname_pattern); - return node ? node->user : NULL; -} - /* Returns the SSL_CTX registered for `hostname_pattern` via * us_listen_socket_add_server_name, or NULL. Owned - the caller must release * the reference. The on_server_name resolvers return owned references (the diff --git a/packages/bun-usockets/src/eventing/epoll_kqueue.c b/packages/bun-usockets/src/eventing/epoll_kqueue.c index 90c655d88185..d8ff5fd3bff8 100644 --- a/packages/bun-usockets/src/eventing/epoll_kqueue.c +++ b/packages/bun-usockets/src/eventing/epoll_kqueue.c @@ -75,10 +75,6 @@ void us_poll_free(struct us_poll_t *p, struct us_loop_t *loop) { us_free(p); } -__attribute__((always_inline)) void *us_poll_ext(struct us_poll_t *p) { - return p + 1; -} - /* Todo: why have us_poll_create AND us_poll_init!? libuv legacy! */ void us_poll_init(struct us_poll_t *p, LIBUS_SOCKET_DESCRIPTOR fd, int poll_type) { p->state.fd = fd; diff --git a/packages/bun-usockets/src/internal/networking/bsd.h b/packages/bun-usockets/src/internal/networking/bsd.h index 239d0979d754..ba58bb5f5135 100644 --- a/packages/bun-usockets/src/internal/networking/bsd.h +++ b/packages/bun-usockets/src/internal/networking/bsd.h @@ -166,7 +166,6 @@ int bsd_udp_setup_sendbuf(struct udp_sendbuf *buf, size_t bufsize, void** payloa int bsd_udp_packet_buffer_payload_length(struct udp_recvbuf *msgvec, int index); char *bsd_udp_packet_buffer_payload(struct udp_recvbuf *msgvec, int index); char *bsd_udp_packet_buffer_peer(struct udp_recvbuf *msgvec, int index); -int bsd_udp_packet_buffer_local_ip(struct udp_recvbuf *msgvec, int index, char *ip); int bsd_udp_packet_buffer_truncated(struct udp_recvbuf *msgvec, int index); // int bsd_udp_packet_buffer_ecn(struct udp_recvbuf *msgvec, int index); diff --git a/packages/bun-usockets/src/libusockets.h b/packages/bun-usockets/src/libusockets.h index cf62e75eee44..5876a83b35a9 100644 --- a/packages/bun-usockets/src/libusockets.h +++ b/packages/bun-usockets/src/libusockets.h @@ -196,9 +196,6 @@ int us_udp_packet_buffer_payload_length(struct us_udp_packet_buffer_t *buf, int * 0 otherwise. Backed by MSG_TRUNC in msg_hdr.msg_flags on POSIX. */ int us_udp_packet_buffer_truncated(struct us_udp_packet_buffer_t *buf, int index); -/* Copies out local (received destination) ip (4 or 16 bytes) of received packet */ -int us_udp_packet_buffer_local_ip(struct us_udp_packet_buffer_t *buf, int index, char *ip); - /* Get the bound port in host byte order */ int us_udp_socket_bound_port(struct us_udp_socket_t *s); @@ -357,10 +354,8 @@ void us_socket_group_close_all_ex(us_socket_group_r group, int also_listeners) n * (see close_all_ex). */ int us_loop_close_all_groups(us_loop_r loop) nonnull_fn_decl; -unsigned short us_socket_group_timestamp(us_socket_group_r group) nonnull_fn_decl; struct us_loop_t *us_socket_group_loop(us_socket_group_r group) nonnull_fn_decl __attribute((returns_nonnull)); void *us_socket_group_ext(us_socket_group_r group) nonnull_fn_decl; -struct us_socket_group_t *us_socket_group_next(us_socket_group_r group) nonnull_fn_decl; /* Move an open socket between groups / kinds, optionally resizing its ext. * Replaces us_socket_context_adopt_socket + us_create_child_socket_context. @@ -404,8 +399,6 @@ int us_listen_socket_add_server_name(struct us_listen_socket_t *ls, __attribute__((nonnull(1, 2, 3))); void us_listen_socket_remove_server_name(struct us_listen_socket_t *ls, const char *hostname_pattern) nonnull_fn_decl; -void *us_listen_socket_find_server_name_userdata(struct us_listen_socket_t *ls, - const char *hostname_pattern) nonnull_fn_decl; /* Returns an owned reference; the caller must release it. */ struct ssl_ctx_st *us_listen_socket_find_server_name_ctx(struct us_listen_socket_t *ls, const char *hostname_pattern) nonnull_fn_decl; @@ -467,7 +460,6 @@ int us_connecting_socket_get_error(struct us_connecting_socket_t *c) nonnull_fn_ * returns the same getaddrinfo code, not an errno (the two namespaces overlap). */ int us_connecting_socket_get_dns_error(struct us_connecting_socket_t *c) nonnull_fn_decl; void *us_connecting_socket_get_native_handle(struct us_connecting_socket_t *c) nonnull_fn_decl; -struct us_loop_t *us_connecting_socket_get_loop(struct us_connecting_socket_t *c) nonnull_fn_decl; struct us_socket_group_t *us_connecting_socket_group(struct us_connecting_socket_t *c) nonnull_fn_decl; unsigned char us_connecting_socket_kind(struct us_connecting_socket_t *c) nonnull_fn_decl; @@ -594,9 +586,6 @@ void us_wakeup_loop(us_loop_r loop) nonnull_fn_decl; /* Hook up timers in existing loop */ void us_loop_integrate(us_loop_r loop) nonnull_fn_decl; -/* Returns the loop iteration number */ -long long us_loop_iteration_number(us_loop_r loop) nonnull_fn_decl; - /* Public interfaces for polls */ /* A fallthrough poll does not keep the loop running, it falls through */ @@ -618,9 +607,6 @@ void us_poll_stop(us_poll_r p, struct us_loop_t *loop) nonnull_fn_decl; /* Return what events we are polling for */ int us_poll_events(us_poll_r p) nonnull_fn_decl; -/* Returns the user data extension of this poll */ -void *us_poll_ext(us_poll_r p) nonnull_fn_decl; - /* Get associated socket descriptor from a poll */ LIBUS_SOCKET_DESCRIPTOR us_poll_fd(us_poll_r p) nonnull_fn_decl; @@ -674,7 +660,6 @@ void us_socket_shutdown(us_socket_r s) nonnull_fn_decl; void us_socket_shutdown_read(us_socket_r s) nonnull_fn_decl; int us_socket_is_shut_down(us_socket_r s) nonnull_fn_decl; int us_socket_is_closed(us_socket_r s) nonnull_fn_decl; -int us_socket_is_tls(us_socket_r s) nonnull_fn_decl; int us_socket_is_ssl_handshake_finished(us_socket_r s) nonnull_fn_decl; int us_socket_ssl_handshake_callback_has_fired(us_socket_r s) nonnull_fn_decl; /* TLS ciphertext bytes already sealed for this socket and reported as @@ -690,12 +675,8 @@ int us_socket_remote_port(us_socket_r s) nonnull_fn_decl; void us_socket_remote_address(us_socket_r s, char *nonnull_arg buf, int *nonnull_arg length) nonnull_fn_decl; void us_socket_local_address(us_socket_r s, char *nonnull_arg buf, int *nonnull_arg length) nonnull_fn_decl; -struct us_socket_t *us_socket_detach(us_socket_r s) nonnull_fn_decl; int us_socket_ipc_write_fd(us_socket_r s, const char *data, int length, int fd) nonnull_fn_decl; void us_socket_sendfile_needs_more(us_socket_r s) nonnull_fn_decl; -void *us_listen_socket_ext(struct us_listen_socket_t *ls) nonnull_fn_decl; -LIBUS_SOCKET_DESCRIPTOR us_listen_socket_get_fd(struct us_listen_socket_t *ls) nonnull_fn_decl; -int us_listen_socket_port(struct us_listen_socket_t *ls) nonnull_fn_decl; struct us_socket_group_t *us_listen_socket_group(struct us_listen_socket_t *ls) nonnull_fn_decl; /* Walk a group's live listeners. The list is the source of truth — anything * that caches us_listen_socket_t* across event-loop ticks (e.g. a std::vector @@ -705,10 +686,8 @@ struct us_listen_socket_t *us_listen_socket_next(struct us_listen_socket_t *ls) LIBUS_SOCKET_DESCRIPTOR us_socket_get_fd(us_socket_r s) nonnull_fn_decl; /* Bun extras */ -struct us_socket_t *us_socket_pair(us_socket_group_r group, unsigned char kind, int socket_ext_size, LIBUS_SOCKET_DESCRIPTOR *fds) nonnull_fn_decl; struct us_socket_t *us_socket_from_fd(us_socket_group_r group, unsigned char kind, struct ssl_ctx_st *ssl_ctx, int socket_ext_size, LIBUS_SOCKET_DESCRIPTOR fd, int ipc) __attribute__((nonnull(1))); /* ssl_ctx nullable */ -struct us_socket_t *us_socket_open(struct us_socket_t *s, int is_client, char *ip, int ip_length); int us_raw_root_certs(struct us_cert_string_t **out); unsigned int us_get_remote_address_info(char *buf, us_socket_r s, const char **dest, int *port, int *is_ipv6); unsigned int us_get_local_address_info(char *buf, us_socket_r s, const char **dest, int *port, int *is_ipv6); diff --git a/packages/bun-usockets/src/loop.c b/packages/bun-usockets/src/loop.c index 7df70af56ea2..9bac73400a7d 100644 --- a/packages/bun-usockets/src/loop.c +++ b/packages/bun-usockets/src/loop.c @@ -414,10 +414,6 @@ void sweep_timer_cb(struct us_internal_callback_t *cb) { } #endif -__attribute__((always_inline)) long long us_loop_iteration_number(struct us_loop_t *loop) { - return loop->data.iteration_nr; -} - /* These may have somewhat different meaning depending on the underlying event library */ void us_internal_loop_pre(struct us_loop_t *loop) { loop->data.iteration_nr++; diff --git a/packages/bun-usockets/src/node_quic_shim.c b/packages/bun-usockets/src/node_quic_shim.c index 05de1583669a..62d202f3f18b 100644 --- a/packages/bun-usockets/src/node_quic_shim.c +++ b/packages/bun-usockets/src/node_quic_shim.c @@ -526,7 +526,6 @@ lsquic_engine_t *us_nq_engine_new(int is_server, int is_http, const struct sockaddr *us_nq_spec_dest(const struct lsquic_out_spec *s) { return s->dest_sa; } const struct sockaddr *us_nq_spec_local(const struct lsquic_out_spec *s) { return s->local_sa; } -void *us_nq_spec_peer_ctx(const struct lsquic_out_spec *s) { return s->peer_ctx; } const struct iovec *us_nq_spec_iov(const struct lsquic_out_spec *s, size_t *n) { *n = s->iovlen; return s->iov; diff --git a/packages/bun-usockets/src/quic.c b/packages/bun-usockets/src/quic.c index 8926c7cfbd8a..06e2ebd4a356 100644 --- a/packages/bun-usockets/src/quic.c +++ b/packages/bun-usockets/src/quic.c @@ -78,7 +78,6 @@ struct us_quic_socket_context_s { * the peer until idle timeout). */ struct us_quic_socket_s *conns; - void (*on_open)(us_quic_socket_t *); void (*on_hsk_done)(us_quic_socket_t *, int); void (*on_goaway)(us_quic_socket_t *); void (*on_close)(us_quic_socket_t *); @@ -522,7 +521,6 @@ static lsquic_conn_ctx_t *us_quic_on_new_conn(void *if_ctx, lsquic_conn_t *conn) us_internal_enable_sweep_timer(ctx->loop); qs->next = ctx->conns; ctx->conns = qs; - if (ctx->on_open) ctx->on_open(qs); return (lsquic_conn_ctx_t *) qs; } @@ -922,7 +920,6 @@ int us_quic_listen_socket_local_address(us_quic_listen_socket_t *ls, char *buf, #define DEF_CB(name, sig) \ void us_quic_socket_context_##name(us_quic_socket_context_t *ctx, sig) { ctx->name = cb; } -DEF_CB(on_open, void (*cb)(us_quic_socket_t *)) DEF_CB(on_hsk_done, void (*cb)(us_quic_socket_t *, int)) DEF_CB(on_goaway, void (*cb)(us_quic_socket_t *)) DEF_CB(on_close, void (*cb)(us_quic_socket_t *)) @@ -1022,15 +1019,6 @@ void us_quic_stream_shutdown(us_quic_stream_t *s) { if (s->stream) lsquic_stream_shutdown(s->stream, 1); } -/* lsquic_stream_write buffers until a full packet or shutdown; force the - * partial buffer into a packet so the peer sees streamed bytes promptly. */ -void us_quic_stream_flush(us_quic_stream_t *s) { - if (s->stream) { - lsquic_stream_flush(s->stream); - s->ctx->pending_write_bytes++; - } -} - void us_quic_stream_shutdown_read(us_quic_stream_t *s) { if (s->stream) lsquic_stream_shutdown(s->stream, 0); } @@ -1053,10 +1041,6 @@ void us_quic_stream_reset(us_quic_stream_t *s) { if (s->stream) lsquic_stream_maybe_reset(s->stream, 0x10C, 1); } -int us_quic_stream_has_unacked(us_quic_stream_t *s) { - return s->stream ? lsquic_stream_has_unacked_data(s->stream) : 0; -} - void *us_quic_stream_ext(us_quic_stream_t *s) { return s + 1; } us_quic_socket_t *us_quic_stream_socket(us_quic_stream_t *s) { @@ -1076,7 +1060,6 @@ const struct us_quic_header_t *us_quic_stream_header(us_quic_stream_t *s, unsign } void *us_quic_socket_ext(us_quic_socket_t *s) { return s + 1; } -us_quic_socket_context_t *us_quic_socket_context(us_quic_socket_t *s) { return s->ctx; } void us_quic_socket_remote_address(us_quic_socket_t *s, char *buf, int *len, int *port, int *is_ipv6) { const struct sockaddr *local, *peer; @@ -1097,8 +1080,6 @@ void us_quic_socket_remote_address(us_quic_socket_t *s, char *buf, int *len, int } } -void us_quic_socket_close(us_quic_socket_t *s) { if (s->conn) lsquic_conn_close(s->conn); } - /* ───── client ───── * * lsquic only installs its own SSL_CTX_set_custom_verify when ea_get_ssl_ctx @@ -1332,13 +1313,12 @@ struct us_quic_pending_connect_s { int port; int reject_unauthorized; struct addrinfo_request *ai_req; - void *user; }; int us_quic_socket_context_connect( us_quic_socket_context_t *ctx, const char *host, int port, const char *sni, int reject_unauthorized, us_quic_socket_t **out_qs, - struct us_quic_pending_connect_s **out_pending, void *user) + struct us_quic_pending_connect_s **out_pending) { *out_qs = NULL; *out_pending = NULL; @@ -1375,15 +1355,10 @@ int us_quic_socket_context_connect( pc->port = port; pc->reject_unauthorized = reject_unauthorized; pc->ai_req = ai_req; - pc->user = user; *out_pending = pc; return 0; } -void *us_quic_pending_connect_user(struct us_quic_pending_connect_s *pc) { - return pc->user; -} - struct addrinfo_request *us_quic_pending_connect_addrinfo( struct us_quic_pending_connect_s *pc) { return pc->ai_req; } diff --git a/packages/bun-usockets/src/quic.h b/packages/bun-usockets/src/quic.h index d64c230b6941..629d136b2b74 100644 --- a/packages/bun-usockets/src/quic.h +++ b/packages/bun-usockets/src/quic.h @@ -88,9 +88,8 @@ struct addrinfo_request; int us_quic_socket_context_connect( us_quic_socket_context_t *ctx, const char *host, int port, const char *sni, int reject_unauthorized, us_quic_socket_t **out_qs, - struct us_quic_pending_connect_s **out_pending, void *user); + struct us_quic_pending_connect_s **out_pending); -void *us_quic_pending_connect_user(struct us_quic_pending_connect_s *pc); struct addrinfo_request *us_quic_pending_connect_addrinfo( struct us_quic_pending_connect_s *pc); us_quic_socket_t *us_quic_pending_connect_resolved( @@ -105,8 +104,6 @@ unsigned us_quic_socket_streams_avail(us_quic_socket_t *s); int us_quic_socket_status(us_quic_socket_t *s, char *buf, unsigned int len); /* Connection-level callbacks */ -void us_quic_socket_context_on_open(us_quic_socket_context_t *ctx, - void (*on_open)(us_quic_socket_t *)); /* Fires once the TLS handshake completes (client only). ok=0 means the * handshake failed; on_close follows shortly. */ void us_quic_socket_context_on_hsk_done(us_quic_socket_context_t *ctx, @@ -140,11 +137,9 @@ int us_quic_stream_send_headers(us_quic_stream_t *s, * header block follows separately. */ int us_quic_stream_send_informational(us_quic_stream_t *s, const char *status3); void us_quic_stream_shutdown(us_quic_stream_t *s); -void us_quic_stream_flush(us_quic_stream_t *s); void us_quic_stream_shutdown_read(us_quic_stream_t *s); void us_quic_stream_close(us_quic_stream_t *s); void us_quic_stream_reset(us_quic_stream_t *s); -int us_quic_stream_has_unacked(us_quic_stream_t *s); void *us_quic_stream_ext(us_quic_stream_t *s); us_quic_socket_t *us_quic_stream_socket(us_quic_stream_t *s); @@ -163,9 +158,7 @@ const struct us_quic_header_t *us_quic_stream_header(us_quic_stream_t *s, unsign /* Connection accessors */ void *us_quic_socket_ext(us_quic_socket_t *s); -us_quic_socket_context_t *us_quic_socket_context(us_quic_socket_t *s); void us_quic_socket_remote_address(us_quic_socket_t *s, char *buf, int *len, int *port, int *is_ipv6); -void us_quic_socket_close(us_quic_socket_t *s); #ifdef __cplusplus } diff --git a/packages/bun-usockets/src/socket.c b/packages/bun-usockets/src/socket.c index b731ca98a373..348a891cedcf 100644 --- a/packages/bun-usockets/src/socket.c +++ b/packages/bun-usockets/src/socket.c @@ -89,10 +89,6 @@ void us_socket_set_ssl_raw_tap(struct us_socket_t *s, int enabled) { s->ssl_raw_tap = !!enabled; } -__attribute__((always_inline)) int us_socket_is_tls(struct us_socket_t *s) { - return s->ssl != NULL; -} - struct us_socket_group_t *us_connecting_socket_group(struct us_connecting_socket_t *c) { return c->group; } @@ -356,59 +352,6 @@ __attribute__((always_inline)) struct us_socket_t *us_socket_close(struct us_soc return us_internal_socket_close_raw(s, code, reason); } -// This function is the same as us_socket_close but: -// - does not emit on_close event -// - does not close -struct us_socket_t *us_socket_detach(struct us_socket_t *s) { - if (!us_socket_is_closed(s)) { - struct us_loop_t *loop = s->group->loop; - - if (s->flags.low_prio_state == 1) { - /* Unlink this socket from the low-priority queue */ - if (!s->prev) loop->data.low_prio_head = s->next; - else s->prev->next = s->next; - - if (s->next) s->next->prev = s->prev; - - s->prev = 0; - s->next = 0; - s->flags.low_prio_state = 0; - s->group->low_prio_count--; - /* Mirror the else branch: if this was the last thing keeping the - * group linked, drop it from the loop now rather than waiting for - * the next link/unlink to notice. */ - us_internal_group_maybe_unlink(s->group); - } else { - us_internal_socket_group_unlink_socket(s->group, s); - } - us_poll_stop((struct us_poll_t *) s, loop); - - us_internal_ssl_detach(s); - - /* Link this socket to the close-list and let it be deleted after this iteration */ - s->next = loop->data.closed_head; - loop->data.closed_head = s; - - /* Mark the socket as closed */ - s->flags.is_closed = 1; - - return s; - } - return s; -} - -struct us_socket_t *us_socket_pair(struct us_socket_group_t *group, unsigned char kind, int socket_ext_size, LIBUS_SOCKET_DESCRIPTOR *fds) { -#if defined(LIBUS_USE_LIBUV) || defined(WIN32) - return 0; -#else - if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds) != 0) { - return 0; - } - - return us_socket_from_fd(group, kind, NULL, socket_ext_size, fds[0], 0); -#endif -} - /* Re-arm writable for a backpressured write without resuming the read side of * a paused socket: us_poll_change sets absolute flags, so including READABLE * unconditionally would silently undo us_socket_pause mid-backpressure and @@ -756,13 +699,6 @@ int us_connecting_socket_get_dns_error(struct us_connecting_socket_t *c) { return c->error_is_dns ? c->error : 0; } -struct us_socket_t *us_socket_open(struct us_socket_t *s, int is_client, char *ip, int ip_length) { - if (s->ssl) { - return us_internal_ssl_on_open(s, is_client, ip, ip_length); - } - return us_dispatch_open(s, is_client, ip, ip_length); -} - unsigned int us_get_remote_address_info(char *buf, struct us_socket_t *s, const char **dest, int *port, int *is_ipv6) { // This function is manual inlining + modification of @@ -855,10 +791,6 @@ void us_socket_unref(struct us_socket_t *s) { // do nothing if not using libuv } -struct us_loop_t *us_connecting_socket_get_loop(struct us_connecting_socket_t *c) { - return c->loop; -} - void us_socket_pause(struct us_socket_t *s) { if (s->flags.is_paused) return; // closed cannot be paused because it is already closed diff --git a/packages/bun-usockets/src/udp.c b/packages/bun-usockets/src/udp.c index 17b8ddaf7175..f8c18d160b21 100644 --- a/packages/bun-usockets/src/udp.c +++ b/packages/bun-usockets/src/udp.c @@ -24,10 +24,6 @@ // return bsd_udp_packet_buffer_ecn((struct udp_recvbuf *)buf, index); // } -int us_udp_packet_buffer_local_ip(struct us_udp_packet_buffer_t *buf, int index, char *ip) { - return bsd_udp_packet_buffer_local_ip((struct udp_recvbuf *)buf, index, ip); -} - char *us_udp_packet_buffer_peer(struct us_udp_packet_buffer_t *buf, int index) { return bsd_udp_packet_buffer_peer((struct udp_recvbuf *)buf, index); } diff --git a/src/bun_core/env_var.rs b/src/bun_core/env_var.rs index eb14e27b6a99..71b91e24627f 100644 --- a/src/bun_core/env_var.rs +++ b/src/bun_core/env_var.rs @@ -255,7 +255,6 @@ pub mod feature_flag { new_feature_flag!(pub BUN_FEATURE_FLAG_DISABLE_STANDALONE_MADVISE, "BUN_FEATURE_FLAG_DISABLE_STANDALONE_MADVISE", {}); new_feature_flag!(pub BUN_DISABLE_TRANSPILED_SOURCE_CODE_PREVIEW, "BUN_DISABLE_TRANSPILED_SOURCE_CODE_PREVIEW", {}); new_feature_flag!(pub BUN_FEATURE_FLAG_DISABLE_UV_FS_COPYFILE, "BUN_FEATURE_FLAG_DISABLE_UV_FS_COPYFILE", {}); - new_feature_flag!(pub BUN_DUMP_STATE_ON_CRASH, "BUN_DUMP_STATE_ON_CRASH", {}); new_feature_flag!(pub BUN_ENABLE_EXPERIMENTAL_SHELL_BUILTINS, "BUN_ENABLE_EXPERIMENTAL_SHELL_BUILTINS", {}); new_feature_flag!(pub BUN_FEATURE_FLAG_EXPERIMENTAL_BAKE, "BUN_FEATURE_FLAG_EXPERIMENTAL_BAKE", {}); // Offer "h2" in the fetch() TLS ALPN list and speak HTTP/2 when the diff --git a/src/http/h3_client/ClientContext.rs b/src/http/h3_client/ClientContext.rs index 0023813d30fe..33b2823d43de 100644 --- a/src/http/h3_client/ClientContext.rs +++ b/src/http/h3_client/ClientContext.rs @@ -2,7 +2,7 @@ //! client engine and the live-session registry. Never freed — the engine //! lives for the process, same as the HTTP thread itself. -use core::ffi::{c_uint, c_void}; +use core::ffi::c_uint; use core::ptr::NonNull; use core::sync::atomic::Ordering; @@ -139,9 +139,7 @@ impl ClientContext { self.sessions.push(session); session_mut(session).enqueue(client); - let result = - self.qctx_mut() - .connect(host_z, port, host_z, reject, session.cast::()); + let result = self.qctx_mut().connect(host_z, port, host_z, reject); match result { ConnectResult::Socket(qs) => { session_mut(session).qsocket = NonNull::new(qs); diff --git a/src/jsc/bindings/ErrorStackTrace.cpp b/src/jsc/bindings/ErrorStackTrace.cpp index 7afd14d4b236..3b6dae9a0121 100644 --- a/src/jsc/bindings/ErrorStackTrace.cpp +++ b/src/jsc/bindings/ErrorStackTrace.cpp @@ -325,15 +325,6 @@ JSC::JSString* JSCStackFrame::functionName() return jsString(this->m_vm, m_functionName); } -JSC::JSString* JSCStackFrame::typeName() -{ - if (!m_typeName) { - m_typeName = retrieveTypeName(); - } - - return jsString(this->m_vm, m_typeName); -} - JSCStackFrame::SourcePositions* JSCStackFrame::getSourcePositions() { if (SourcePositionsState::NotCalculated == m_sourcePositionsState) { @@ -407,12 +398,6 @@ ALWAYS_INLINE String JSCStackFrame::retrieveFunctionName() return emptyString(); } -ALWAYS_INLINE String JSCStackFrame::retrieveTypeName() -{ - JSC::JSObject* calleeObject = uncheckedDowncast(m_callee); - return calleeObject->className(); -} - // General flow here is based on JSC's appendSourceToError (ErrorInstance.cpp) bool JSCStackFrame::calculateSourcePositions() { diff --git a/src/jsc/bindings/ErrorStackTrace.h b/src/jsc/bindings/ErrorStackTrace.h index 17c9dc6822ea..d186288116f8 100644 --- a/src/jsc/bindings/ErrorStackTrace.h +++ b/src/jsc/bindings/ErrorStackTrace.h @@ -58,7 +58,6 @@ class JSCStackFrame { // Lazy-initialized WTF::String m_sourceURL; WTF::String m_functionName; - WTF::String m_typeName; // m_wasmFunctionIndexOrName has meaning only when m_isWasmFrame is set JSC::Wasm::IndexOrName m_wasmFunctionIndexOrName; @@ -87,7 +86,6 @@ class JSCStackFrame { intptr_t sourceID() const; JSC::JSString* sourceURL(); JSC::JSString* functionName(); - JSC::JSString* typeName(); bool isFunctionOrEval() const { return m_isFunctionOrEval; } bool isAsync() const { return m_isAsync; } @@ -154,8 +152,6 @@ class JSCStackFrame { */ ALWAYS_INLINE String retrieveFunctionName(); - ALWAYS_INLINE String retrieveTypeName(); - bool calculateSourcePositions(); }; diff --git a/src/jsc/bindings/InspectorHTTPServerAgent.cpp b/src/jsc/bindings/InspectorHTTPServerAgent.cpp index db5a0b891bbe..901ab61cb93a 100644 --- a/src/jsc/bindings/InspectorHTTPServerAgent.cpp +++ b/src/jsc/bindings/InspectorHTTPServerAgent.cpp @@ -133,46 +133,6 @@ void InspectorHTTPServerAgent::serverRoutesUpdated(int serverId, int hotReloadId this->m_frontendDispatcher->serverRoutesUpdated(serverId, hotReloadId, WTF::move(routes)); } -void InspectorHTTPServerAgent::requestWillBeSent(Ref&& request) -{ - if (!m_enabled || !m_frontendDispatcher) { - return; - } - - this->m_frontendDispatcher->requestWillBeSent(WTF::move(request)); -} -void InspectorHTTPServerAgent::responseReceived(Ref&& response) -{ - if (!m_enabled || !m_frontendDispatcher) { - return; - } - - this->m_frontendDispatcher->responseReceived(WTF::move(response)); -} -void InspectorHTTPServerAgent::bodyChunkReceived(Ref&& chunk) -{ - if (!m_enabled || !m_frontendDispatcher) { - return; - } - - this->m_frontendDispatcher->bodyChunkReceived(WTF::move(chunk)); -} -void InspectorHTTPServerAgent::requestFinished(int requestId, int serverId, double timestamp, std::optional&& opt_duration) -{ - if (!m_enabled || !m_frontendDispatcher) { - return; - } - - this->m_frontendDispatcher->requestFinished(requestId, serverId, timestamp, WTF::move(opt_duration)); -} -void InspectorHTTPServerAgent::requestHandlerException(Ref&& error) -{ - if (!m_enabled || !m_frontendDispatcher) { - return; - } - - this->m_frontendDispatcher->requestHandlerException(WTF::move(error)); -} } diff --git a/src/jsc/bindings/InspectorHTTPServerAgent.h b/src/jsc/bindings/InspectorHTTPServerAgent.h index 432a5fc87786..1cc21cef81c9 100644 --- a/src/jsc/bindings/InspectorHTTPServerAgent.h +++ b/src/jsc/bindings/InspectorHTTPServerAgent.h @@ -43,11 +43,6 @@ class InspectorHTTPServerAgent final : public InspectorAgentBase, public Inspect void serverStarted(int serverId, const String& url, double startTime, AnyServerPtr serverInstance); void serverStopped(int serverId, double timestamp); void serverRoutesUpdated(int serverId, int hotReloadId, Ref>&& routes); - void requestWillBeSent(Ref&& request); - void responseReceived(Ref&& response); - void bodyChunkReceived(Ref&& chunk); - void requestFinished(int requestId, int serverId, double timestamp, std::optional&& opt_duration); - void requestHandlerException(Ref&& error); private: WTF::HashMap m_serverIdToServerInstance; diff --git a/src/jsc/bindings/JSBuffer.cpp b/src/jsc/bindings/JSBuffer.cpp index 217d29703063..5948fca22a20 100644 --- a/src/jsc/bindings/JSBuffer.cpp +++ b/src/jsc/bindings/JSBuffer.cpp @@ -327,17 +327,6 @@ static std::optional resolveEncodingString(JSC::ThrowScope& scope, JS // Matches Node's validateOffset (lib/buffer.js), which is validateInteger and // therefore renders its range as ">= min && <= max", unlike boundsError's // ">= min and <= max". -size_t validateOffset(JSC::ThrowScope& scope, JSC::JSGlobalObject* globalObject, JSC::JSValue value, JSC::JSValue name, size_t min, size_t max) -{ - if (!value.isNumber()) [[unlikely]] - return Bun::ERR::INVALID_ARG_TYPE(scope, globalObject, name, "number"_s, value); - auto value_num = value.asNumber(); - if (std::fmod(value_num, 1.0) != 0) [[unlikely]] - return Bun::ERR::OUT_OF_RANGE(scope, globalObject, name, "an integer"_s, value); - if (value_num < min || value_num > max) [[unlikely]] - return Bun::ERR::OUT_OF_RANGE(scope, globalObject, name, makeString(">= "_s, min, " && <= "_s, max), value); - return static_cast(value_num); -} size_t validateOffset(JSC::ThrowScope& scope, JSC::JSGlobalObject* globalObject, JSC::JSValue value, WTF::ASCIILiteral name, size_t min, size_t max) { if (!value.isNumber()) [[unlikely]] @@ -2736,10 +2725,6 @@ JSC_DEFINE_HOST_FUNCTION(jsBufferConstructorFunction_copyBytesFrom, (JSGlobalObj return jsBufferConstructorFunction_copyBytesFromBody(lexicalGlobalObject, callFrame); } -extern "C" JSC_DECLARE_JIT_OPERATION_WITHOUT_WTF_INTERNAL(jsBufferConstructorAllocWithoutTypeChecks, JSUint8Array*, (JSC::JSGlobalObject * lexicalGlobalObject, void* thisValue, int size)); -extern "C" JSC_DECLARE_JIT_OPERATION_WITHOUT_WTF_INTERNAL(jsBufferConstructorAllocUnsafeWithoutTypeChecks, JSUint8Array*, (JSC::JSGlobalObject * lexicalGlobalObject, void* thisValue, int size)); -extern "C" JSC_DECLARE_JIT_OPERATION_WITHOUT_WTF_INTERNAL(jsBufferConstructorAllocUnsafeSlowWithoutTypeChecks, JSUint8Array*, (JSC::JSGlobalObject * lexicalGlobalObject, void* thisValue, int size)); - static size_t validateOffsetBigInt64(JSC::JSGlobalObject* lexicalGlobalObject, JSC::ThrowScope& scope, JSC::JSValue offsetVal, size_t byteLength) { // Node's checkBounds/boundsError validates the offset's type and @@ -2780,36 +2765,6 @@ static size_t validateOffsetBigInt64(JSC::JSGlobalObject* lexicalGlobalObject, J return truncateDoubleToUint64(offsetD); } -JSC_DEFINE_JIT_OPERATION(jsBufferConstructorAllocWithoutTypeChecks, JSUint8Array*, (JSC::JSGlobalObject * lexicalGlobalObject, void* thisValue, int byteLength)) -{ - auto& vm = JSC::getVM(lexicalGlobalObject); - IGNORE_WARNINGS_BEGIN("frame-address") - CallFrame* callFrame = DECLARE_CALL_FRAME(vm); - IGNORE_WARNINGS_END - JSC::JITOperationPrologueCallFrameTracer tracer(vm, callFrame); - return { allocBuffer(lexicalGlobalObject, byteLength) }; -} - -JSC_DEFINE_JIT_OPERATION(jsBufferConstructorAllocUnsafeWithoutTypeChecks, JSUint8Array*, (JSC::JSGlobalObject * lexicalGlobalObject, void* thisValue, int byteLength)) -{ - auto& vm = JSC::getVM(lexicalGlobalObject); - IGNORE_WARNINGS_BEGIN("frame-address") - CallFrame* callFrame = DECLARE_CALL_FRAME(vm); - IGNORE_WARNINGS_END - JSC::JITOperationPrologueCallFrameTracer tracer(vm, callFrame); - return { allocBufferUnsafe(lexicalGlobalObject, byteLength) }; -} - -JSC_DEFINE_JIT_OPERATION(jsBufferConstructorAllocUnsafeSlowWithoutTypeChecks, JSUint8Array*, (JSC::JSGlobalObject * lexicalGlobalObject, void* thisValue, int byteLength)) -{ - auto& vm = JSC::getVM(lexicalGlobalObject); - IGNORE_WARNINGS_BEGIN("frame-address") - CallFrame* callFrame = DECLARE_CALL_FRAME(vm); - IGNORE_WARNINGS_END - JSC::JITOperationPrologueCallFrameTracer tracer(vm, callFrame); - return { allocBufferUnsafe(lexicalGlobalObject, byteLength) }; -} - JSC_ANNOTATE_HOST_FUNCTION(JSBufferConstructorConstruct, JSBufferConstructor::construct); class JSBuffer : public JSC::JSNonFinalObject { diff --git a/src/jsc/bindings/JSDOMExceptionHandling.cpp b/src/jsc/bindings/JSDOMExceptionHandling.cpp index 9db6f0f283de..6c1f4b9ee821 100644 --- a/src/jsc/bindings/JSDOMExceptionHandling.cpp +++ b/src/jsc/bindings/JSDOMExceptionHandling.cpp @@ -264,11 +264,6 @@ void throwNonFiniteTypeError(JSGlobalObject& lexicalGlobalObject, JSC::ThrowScop throwTypeError(&lexicalGlobalObject, scope, "The provided value is non-finite"_s); } -JSC::EncodedJSValue rejectPromiseWithGetterTypeError(JSC::JSGlobalObject& lexicalGlobalObject, const JSC::ClassInfo* classInfo, JSC::PropertyName attributeName) -{ - return createRejectedPromiseWithTypeError(lexicalGlobalObject, JSC::makeDOMAttributeGetterTypeErrorMessage(classInfo->className, String(attributeName.uid())), RejectedPromiseWithTypeErrorCause::NativeGetter); -} - String makeThisTypeErrorMessage(ASCIILiteral interfaceName, ASCIILiteral functionName) { return makeString("Can only call "_s, interfaceName, '.', functionName, " on instances of "_s, interfaceName); diff --git a/src/jsc/bindings/JSDOMExceptionHandling.h b/src/jsc/bindings/JSDOMExceptionHandling.h index c6c7bf156a3d..47285d8ba47a 100644 --- a/src/jsc/bindings/JSDOMExceptionHandling.h +++ b/src/jsc/bindings/JSDOMExceptionHandling.h @@ -53,7 +53,6 @@ String makeThisTypeErrorMessage(ASCIILiteral interfaceName, ASCIILiteral functio WEBCORE_EXPORT JSC::EncodedJSValue throwThisTypeError(JSC::JSGlobalObject&, JSC::ThrowScope&, ASCIILiteral interfaceName, ASCIILiteral attributeName); -WEBCORE_EXPORT JSC::EncodedJSValue rejectPromiseWithGetterTypeError(JSC::JSGlobalObject&, const JSC::ClassInfo*, JSC::PropertyName attributeName); WEBCORE_EXPORT JSC::EncodedJSValue rejectPromiseWithThisTypeError(DeferredPromise&, ASCIILiteral interfaceName, ASCIILiteral operationName); WEBCORE_EXPORT JSC::EncodedJSValue rejectPromiseWithThisTypeError(JSC::JSGlobalObject&, ASCIILiteral interfaceName, ASCIILiteral operationName); diff --git a/src/jsc/bindings/ScriptExecutionContext.cpp b/src/jsc/bindings/ScriptExecutionContext.cpp index ce74d6344bdb..804812b5b123 100644 --- a/src/jsc/bindings/ScriptExecutionContext.cpp +++ b/src/jsc/bindings/ScriptExecutionContext.cpp @@ -276,18 +276,6 @@ bool ScriptExecutionContext::ensureOnContextThread(ScriptExecutionContextIdentif return true; } -bool ScriptExecutionContext::ensureOnMainThread(Function&& task) -{ - auto* context = ScriptExecutionContext::getMainThreadScriptExecutionContext(); - - if (!context) { - return false; - } - - context->postTaskConcurrently(WTF::move(task)); - return true; -} - ScriptExecutionContext* ScriptExecutionContext::getMainThreadScriptExecutionContext() { Locker locker { allScriptExecutionContextsMapLock }; @@ -344,13 +332,6 @@ void ScriptExecutionContext::markTerminating() m_isTerminating.store(true, std::memory_order_release); } -ScriptExecutionContext* executionContext(JSC::JSGlobalObject* globalObject) -{ - if (!globalObject || !globalObject->inherits()) - return nullptr; - return uncheckedDowncast(globalObject)->scriptExecutionContext(); -} - void ScriptExecutionContext::postTaskConcurrently(Function&& lambda) { Bun__VmHandle__queueTaskConcurrently(m_vmHandle, new EventLoopTask(WTF::move(lambda))); diff --git a/src/jsc/bindings/ScriptExecutionContext.h b/src/jsc/bindings/ScriptExecutionContext.h index 25e3e4fb25dc..bf982c8c54d0 100644 --- a/src/jsc/bindings/ScriptExecutionContext.h +++ b/src/jsc/bindings/ScriptExecutionContext.h @@ -106,7 +106,6 @@ class ScriptExecutionContext : public CanMakeWeakPtr, pu } WEBCORE_EXPORT static bool postTaskTo(ScriptExecutionContextIdentifier identifier, Function&& task); WEBCORE_EXPORT static bool ensureOnContextThread(ScriptExecutionContextIdentifier, Function&& task); - WEBCORE_EXPORT static bool ensureOnMainThread(Function&& task); WEBCORE_EXPORT JSC::JSGlobalObject* globalObject(); @@ -183,6 +182,4 @@ class ScriptExecutionContext : public CanMakeWeakPtr, pu #endif }; -ScriptExecutionContext* executionContext(JSC::JSGlobalObject*); - } diff --git a/src/jsc/bindings/ncrypto.cpp b/src/jsc/bindings/ncrypto.cpp index 64e867158ad7..34336eb89f07 100644 --- a/src/jsc/bindings/ncrypto.cpp +++ b/src/jsc/bindings/ncrypto.cpp @@ -480,11 +480,6 @@ bool BignumPointer::isZero() const return bn_ && BN_is_zero(bn_.get()); } -bool BignumPointer::isOne() const -{ - return bn_ && BN_is_one(bn_.get()); -} - const BIGNUM* BignumPointer::One() { return BN_value_one(); @@ -1430,34 +1425,6 @@ bool X509View::enumUsages(UsageCallback&& callback) const return true; } -bool X509View::ifRsa(KeyCallback&& callback) const -{ - if (cert_ == nullptr) return true; - OSSL3_CONST EVP_PKEY* pkey = X509_get0_pubkey(cert_); - auto id = EVP_PKEY_id(pkey); - if (id == EVP_PKEY_RSA || id == EVP_PKEY_RSA2 || id == EVP_PKEY_RSA_PSS) { - Rsa rsa(EVP_PKEY_get0_RSA(pkey)); - if (!rsa) [[unlikely]] - return true; - return callback(rsa); - } - return true; -} - -bool X509View::ifEc(KeyCallback&& callback) const -{ - if (cert_ == nullptr) return true; - OSSL3_CONST EVP_PKEY* pkey = X509_get0_pubkey(cert_); - auto id = EVP_PKEY_id(pkey); - if (id == EVP_PKEY_EC) { - Ec ec(EVP_PKEY_get0_EC_KEY(pkey)); - if (!ec) [[unlikely]] - return true; - return callback(ec); - } - return true; -} - // When adding or removing errors below, please also update the list in the API // documentation. See the "OpenSSL Error Codes" section of doc/api/errors.md // Also *please* update the respective section in doc/api/tls.md as well @@ -1591,11 +1558,6 @@ BIOPointer BIOPointer::NewFile(WTF::StringView filename, return BIOPointer(BIO_new_file(filenameUtf8.data(), modeUtf8.data())); } -BIOPointer BIOPointer::NewFp(FILE* fd, int close_flag) -{ - return BIOPointer(BIO_new_fp(fd, close_flag)); -} - BIOPointer BIOPointer::New(const BIGNUM* bn) { auto res = NewMem(); @@ -2061,54 +2023,6 @@ DataPointer hkdf(const Digest& md, return buf; } -bool checkScryptParams(uint64_t N, uint64_t r, uint64_t p, uint64_t maxmem) -{ - return EVP_PBE_scrypt(nullptr, 0, nullptr, 0, N, r, p, maxmem, nullptr, 0) == 1; -} - -DataPointer scrypt(const Buffer& pass, - const Buffer& salt, - uint64_t N, - uint64_t r, - uint64_t p, - uint64_t maxmem, - size_t length) -{ - ClearErrorOnReturn clearErrorOnReturn; - - if (pass.len > INT_MAX || salt.len > INT_MAX) { - return {}; - } - - auto dp = DataPointer::Alloc(length); - if (dp && EVP_PBE_scrypt(pass.data, pass.len, salt.data, salt.len, N, r, p, maxmem, reinterpret_cast(dp.get()), length)) { - return dp; - } - - return {}; -} - -DataPointer pbkdf2(const Digest& md, - const Buffer& pass, - const Buffer& salt, - uint32_t iterations, - size_t length) -{ - ClearErrorOnReturn clearErrorOnReturn; - - if (pass.len > INT_MAX || salt.len > INT_MAX || length > INT_MAX) { - return {}; - } - - auto dp = DataPointer::Alloc(length); - const EVP_MD* md_ptr = md; - if (dp && PKCS5_PBKDF2_HMAC(pass.data, pass.len, salt.data, salt.len, iterations, md_ptr, length, reinterpret_cast(dp.get()))) { - return dp; - } - - return {}; -} - // ============================================================================ EVPKeyPointer::PrivateKeyEncodingConfig::PrivateKeyEncodingConfig( @@ -3648,13 +3562,6 @@ bool EVPKeyCtxPointer::setRsaOaepMd(const Digest& md) return EVP_PKEY_CTX_set_rsa_oaep_md(ctx_.get(), md_ptr) > 0; } -bool EVPKeyCtxPointer::setRsaMgf1Md(const Digest& md) -{ - if (!md || !ctx_) return false; - const EVP_MD* md_ptr = md; - return EVP_PKEY_CTX_set_rsa_mgf1_md(ctx_.get(), md_ptr) > 0; -} - bool EVPKeyCtxPointer::setRsaPadding(int padding) { return setRsaPadding(ctx_.get(), padding, std::nullopt); @@ -3868,47 +3775,6 @@ using EVP_PKEY_cipher_t = int(EVP_PKEY_CTX* ctx, const unsigned char* in, size_t inlen); -template -DataPointer RSA_Cipher(const EVPKeyPointer& key, - const Rsa::CipherParams& params, - const Buffer in) -{ - if (!key) return {}; - EVPKeyCtxPointer ctx = key.newCtx(); - - if (!ctx || init(ctx.get()) <= 0 || !ctx.setRsaPadding(params.padding) || (params.digest != nullptr && (!ctx.setRsaOaepMd(params.digest) || !ctx.setRsaMgf1Md(params.digest)))) { - return {}; - } - - if (params.label.len != 0 && params.label.data != nullptr && !ctx.setRsaOaepLabel(DataPointer::Copy(params.label))) { - return {}; - } - - size_t out_len = 0; - if (cipher(ctx.get(), - nullptr, - &out_len, - reinterpret_cast(in.data), - in.len) - <= 0) { - return {}; - } - - auto buf = DataPointer::Alloc(out_len); - if (!buf) return {}; - - if (cipher(ctx.get(), - static_cast(buf.get()), - &out_len, - static_cast(in.data), - in.len) - <= 0) { - return {}; - } - - return buf.resize(out_len); -} - template DataPointer CipherImpl(const EVPKeyPointer& key, const Rsa::CipherParams& params, @@ -4052,22 +3918,6 @@ bool Rsa::setPrivateKey(BignumPointer&& d, return true; } -DataPointer Rsa::encrypt(const EVPKeyPointer& key, - const Rsa::CipherParams& params, - const Buffer in) -{ - if (!key) return {}; - return RSA_Cipher(key, params, in); -} - -DataPointer Rsa::decrypt(const EVPKeyPointer& key, - const Rsa::CipherParams& params, - const Buffer in) -{ - if (!key) return {}; - return RSA_Cipher(key, params, in); -} - DataPointer Cipher::encrypt(const EVPKeyPointer& key, const CipherParams& params, const Buffer in) @@ -4101,78 +3951,6 @@ DataPointer Cipher::recover(const EVPKeyPointer& key, key, params, in); } -namespace { -struct CipherCallbackContext { - Cipher::CipherNameCallback cb; - void operator()(WTF::StringView name) { cb(name); } -}; - -#if OPENSSL_VERSION_MAJOR >= 3 -template -void array_push_back(const TypeName* evp_ref, - const char* from, - const char* to, - void* arg) -{ - if (from == nullptr) return; - - const TypeName* real_instance = getbyname(from); - if (!real_instance) return; - - const char* real_name = getname(real_instance); - if (!real_name) return; - - // EVP_*_fetch() does not support alias names, so we need to pass it the - // real/original algorithm name. - // We use EVP_*_fetch() as a filter here because it will only return an - // instance if the algorithm is supported by the public OpenSSL APIs (some - // algorithms are used internally by OpenSSL and are also passed to this - // callback). - TypeName* fetched = fetch_type(nullptr, real_name, nullptr); - if (fetched == nullptr) return; - - free_type(fetched); - auto& cb = *(static_cast(arg)); - cb(from); -} -#else -template -void array_push_back(const TypeName* evp_ref, - const char* from, - const char* to, - void* arg) -{ - if (!from) return; - auto fromView = WTF::StringView::fromLatin1(from); - auto& cb = *(static_cast(arg)); - cb(fromView); -} -#endif -} // namespace - -void Cipher::ForEach(Cipher::CipherNameCallback&& callback) -{ - ClearErrorOnReturn clearErrorOnReturn; - CipherCallbackContext context; - context.cb = WTF::move(callback); - - EVP_CIPHER_do_all_sorted( -#if OPENSSL_VERSION_MAJOR >= 3 - array_push_back, -#else - array_push_back, -#endif - &context); -} - // ============================================================================ Ec::Ec() diff --git a/src/jsc/bindings/ncrypto.h b/src/jsc/bindings/ncrypto.h index 3b9224fa24a5..55d7ab64941c 100644 --- a/src/jsc/bindings/ncrypto.h +++ b/src/jsc/bindings/ncrypto.h @@ -332,12 +332,6 @@ class Cipher final { static const Cipher FromNid(int nid); static const Cipher FromCtx(const CipherCtxPointer& ctx); - using CipherNameCallback = WTF::Function; - - // Iterates the known ciphers if the underlying implementation - // is able to do so. - static void ForEach(CipherNameCallback&& callback); - // Utilities to get various ciphers by type. If the underlying // implementation does not support the requested cipher, then // the result will be an empty Cipher object whose bool operator @@ -452,13 +446,6 @@ class Rsa final { using CipherParams = Cipher::CipherParams; - static DataPointer encrypt(const EVPKeyPointer& key, - const CipherParams& params, - const Buffer in); - static DataPointer decrypt(const EVPKeyPointer& key, - const CipherParams& params, - const Buffer in); - private: OSSL3_CONST RSA* rsa_; }; @@ -579,7 +566,6 @@ class BIOPointer final { static BIOPointer New(const void* data, size_t len); static BIOPointer New(const BIGNUM* bn); static BIOPointer NewFile(WTF::StringView filename, WTF::StringView mode); - static BIOPointer NewFp(FILE* fd, int flags); template static BIOPointer New(const Buffer& buf) @@ -651,7 +637,6 @@ class BignumPointer final { BIGNUM* release(); bool isZero() const; - bool isOne() const; bool setWord(unsigned long w); // NOLINT(runtime/int) // std::nullopt when the value does not fit in a single BN_ULONG, which @@ -789,7 +774,6 @@ class EVPKeyCtxPointer final { bool setEcParameters(int curve, int encoding); bool setRsaOaepMd(const Digest& md); - bool setRsaMgf1Md(const Digest& md); bool setRsaPadding(int padding); bool setRsaKeygenPubExp(BignumPointer&& e); bool setRsaKeygenBits(int bits); @@ -1134,11 +1118,6 @@ class X509View final { using UsageCallback = WTF::Function)>; bool enumUsages(UsageCallback&& callback) const; - template - using KeyCallback = WTF::Function; - bool ifRsa(KeyCallback&& callback) const; - bool ifEc(KeyCallback&& callback) const; - private: const X509* cert_ = nullptr; }; @@ -1432,22 +1411,6 @@ DataPointer hkdf(const Digest& md, const Buffer& salt, size_t length); -bool checkScryptParams(uint64_t N, uint64_t r, uint64_t p, uint64_t maxmem); - -DataPointer scrypt(const Buffer& pass, - const Buffer& salt, - uint64_t N, - uint64_t r, - uint64_t p, - uint64_t maxmem, - size_t length); - -DataPointer pbkdf2(const Digest& md, - const Buffer& pass, - const Buffer& salt, - uint32_t iterations, - size_t length); - // ============================================================================ // Version metadata #define NCRYPTO_VERSION "0.0.1" diff --git a/src/jsc/bindings/node/crypto/CryptoUtil.cpp b/src/jsc/bindings/node/crypto/CryptoUtil.cpp index 951df2c46d25..1d9d3619d022 100644 --- a/src/jsc/bindings/node/crypto/CryptoUtil.cpp +++ b/src/jsc/bindings/node/crypto/CryptoUtil.cpp @@ -3,7 +3,6 @@ #include #include "ErrorCode.h" #include "ncrypto.h" -#include "BunString.h" #include "JSBuffer.h" #include "JSDOMConvertEnumeration.h" #include "JSBufferEncodingType.h" @@ -208,163 +207,6 @@ WebCore::BufferEncodingType getEncodingDefaultBuffer(JSGlobalObject* globalObjec return parseEnumerationFromView(encodingString).value_or(BufferEncodingType::buffer); } -std::optional keyFromString(JSGlobalObject* lexicalGlobalObject, JSC::ThrowScope& scope, const WTF::StringView& keyView, JSValue passphraseValue) -{ - ncrypto::EVPKeyPointer::PrivateKeyEncodingConfig config; - config.format = ncrypto::EVPKeyPointer::PKFormatType::PEM; - - config.passphrase = passphraseFromBufferSource(lexicalGlobalObject, scope, passphraseValue); - RETURN_IF_EXCEPTION(scope, std::nullopt); - - UTF8View keyUtf8(keyView); - - auto keySpan = keyUtf8.span(); - - ncrypto::Buffer ncryptoBuf { - .data = reinterpret_cast(keySpan.data()), - .len = keySpan.size(), - }; - ncrypto::ClearErrorOnReturn clearErrorOnReturn; - - auto res = ncrypto::EVPKeyPointer::TryParsePrivateKey(config, ncryptoBuf); - if (res) { - ncrypto::EVPKeyPointer keyPtr(WTF::move(res.value)); - return keyPtr; - } - - if (res.error.value() == ncrypto::EVPKeyPointer::PKParseError::NEED_PASSPHRASE) { - Bun::ERR::MISSING_PASSPHRASE(scope, lexicalGlobalObject, "Passphrase required for encrypted key"_s); - return std::nullopt; - } - - throwCryptoError(lexicalGlobalObject, scope, res.openssl_error.value_or(0), "Failed to read private key"_s); - return std::nullopt; -} - -ncrypto::EVPKeyPointer::PKFormatType parseKeyFormat(JSC::JSGlobalObject* globalObject, JSValue formatValue, WTF::ASCIILiteral optionName, std::optional defaultFormat) -{ - auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); - - if (formatValue.isUndefined() && defaultFormat) { - return defaultFormat.value(); - } - - if (!formatValue.isString()) { - Bun::ERR::INVALID_ARG_VALUE(scope, globalObject, optionName, formatValue); - return {}; - } - - WTF::String formatStr = formatValue.toWTFString(globalObject); - RETURN_IF_EXCEPTION(scope, {}); - - if (formatStr == "pem"_s) { - return ncrypto::EVPKeyPointer::PKFormatType::PEM; - } - - if (formatStr == "der"_s) { - return ncrypto::EVPKeyPointer::PKFormatType::DER; - } - - if (formatStr == "jwk"_s) { - return ncrypto::EVPKeyPointer::PKFormatType::JWK; - } - - if (formatStr == "raw-public"_s) { - return ncrypto::EVPKeyPointer::PKFormatType::RawPublic; - } - - if (formatStr == "raw-private"_s) { - return ncrypto::EVPKeyPointer::PKFormatType::RawPrivate; - } - - if (formatStr == "raw-seed"_s) { - return ncrypto::EVPKeyPointer::PKFormatType::RawSeed; - } - - Bun::ERR::INVALID_ARG_VALUE(scope, globalObject, optionName, formatValue); - return {}; -} - -std::optional parseKeyType(JSC::JSGlobalObject* globalObject, JSValue typeValue, bool required, WTF::StringView keyType, std::optional isPublic, WTF::ASCIILiteral optionName) -{ - auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); - - if (typeValue.isUndefined() && !required) { - return std::nullopt; - } - - if (!typeValue.isString()) { - Bun::ERR::INVALID_ARG_VALUE(scope, globalObject, optionName, typeValue); - return std::nullopt; - } - - WTF::String typeStr = typeValue.toWTFString(globalObject); - RETURN_IF_EXCEPTION(scope, std::nullopt); - - if (typeStr == "pkcs1"_s) { - if (keyType && keyType != "rsa"_s) { - Bun::ERR::CRYPTO_INCOMPATIBLE_KEY_OPTIONS(scope, globalObject, "pkcs1"_s, "can only be used for RSA keys"_s); - return std::nullopt; - } - return ncrypto::EVPKeyPointer::PKEncodingType::PKCS1; - } else if (typeStr == "spki"_s && isPublic != false) { - return ncrypto::EVPKeyPointer::PKEncodingType::SPKI; - } else if (typeStr == "pkcs8"_s && isPublic != true) { - return ncrypto::EVPKeyPointer::PKEncodingType::PKCS8; - } else if (typeStr == "sec1"_s && isPublic != true) { - if (keyType && keyType != "ec"_s) { - Bun::ERR::CRYPTO_INCOMPATIBLE_KEY_OPTIONS(scope, globalObject, "sec1"_s, "can only be used for EC keys"_s); - return std::nullopt; - } - return ncrypto::EVPKeyPointer::PKEncodingType::SEC1; - } - - Bun::ERR::INVALID_ARG_VALUE(scope, globalObject, optionName, typeValue); - return std::nullopt; -} - -std::optional passphraseFromBufferSource(JSC::JSGlobalObject* globalObject, ThrowScope& scope, JSValue input) -{ - if (input.isUndefinedOrNull()) { - return std::nullopt; - } - - if (input.isString()) { - WTF::String passphraseStr = input.toWTFString(globalObject); - RETURN_IF_EXCEPTION(scope, std::nullopt); - - UTF8View utf8(passphraseStr); - - auto span = utf8.span(); - if (auto ptr = ncrypto::DataPointer::Alloc(span.size())) { - memcpy(ptr.get(), span.data(), span.size()); - return WTF::move(ptr); - } - - throwOutOfMemoryError(globalObject, scope); - return std::nullopt; - } - - if (auto* array = dynamicDowncast(input)) { - if (array->isDetached()) { - throwTypeError(globalObject, scope, "passphrase must not be detached"_s); - return std::nullopt; - } - - auto length = array->byteLength(); - if (auto ptr = ncrypto::DataPointer::Alloc(length)) { - memcpy(ptr.get(), array->vector(), length); - return WTF::move(ptr); - } - - throwOutOfMemoryError(globalObject, scope); - return std::nullopt; - } - - throwTypeError(globalObject, scope, "passphrase must be a Buffer or string"_s); - return std::nullopt; -} - JSValue createCryptoError(JSC::JSGlobalObject* globalObject, ThrowScope& scope, uint32_t err, const char* message) { JSC::VM& vm = globalObject->vm(); @@ -1095,23 +937,9 @@ ByteSource& ByteSource::operator=(ByteSource&& other) noexcept return *this; } -ByteSource ByteSource::fromBIO(const ncrypto::BIOPointer& bio) -{ - ASSERT(bio); - BUF_MEM* bptr = bio; - auto out = ncrypto::DataPointer::Alloc(bptr->length); - memcpy(out.get(), bptr->data, bptr->length); - return ByteSource::allocated(out.release()); -} - ByteSource ByteSource::allocated(void* data, size_t size) { return ByteSource(data, data, size); } -ByteSource ByteSource::foreign(const void* data, size_t size) -{ - return ByteSource(data, nullptr, size); -} - } diff --git a/src/jsc/bindings/node/crypto/CryptoUtil.h b/src/jsc/bindings/node/crypto/CryptoUtil.h index b70ce9223f76..191392d8eb83 100644 --- a/src/jsc/bindings/node/crypto/CryptoUtil.h +++ b/src/jsc/bindings/node/crypto/CryptoUtil.h @@ -48,11 +48,7 @@ EncodedJSValue encode(JSGlobalObject* lexicalGlobalObject, ThrowScope& scope, st // void CheckThrow(JSC::JSGlobalObject* globalObject, SignBase::Error error); JSC::JSValue unsignedBigIntToBuffer(JSC::JSGlobalObject* lexicalGlobalObject, JSC::ThrowScope& scope, JSValue bigIntValue, ASCIILiteral name); WebCore::BufferEncodingType getEncodingDefaultBuffer(JSGlobalObject* globalObject, ThrowScope& scope, JSValue encodingValue); -std::optional keyFromString(JSGlobalObject* lexicalGlobalObject, JSC::ThrowScope& scope, const WTF::StringView& keyView, JSValue passphraseValue); -ncrypto::EVPKeyPointer::PKFormatType parseKeyFormat(JSC::JSGlobalObject* globalObject, JSValue formatValue, WTF::ASCIILiteral optionName, std::optional defaultFormat = std::nullopt); -std::optional parseKeyType(JSC::JSGlobalObject* globalObject, JSValue typeValue, bool required, WTF::StringView keyType, std::optional isPublic, WTF::ASCIILiteral optionName); bool isArrayBufferOrView(JSValue value); -std::optional passphraseFromBufferSource(JSC::JSGlobalObject* globalObject, JSC::ThrowScope& scope, JSValue input); JSValue createCryptoError(JSC::JSGlobalObject* globalObject, ThrowScope& scope, uint32_t err, const char* message); void throwCryptoError(JSC::JSGlobalObject* globalObject, JSC::ThrowScope& scope, uint32_t err, const char* message = nullptr); std::optional getIntOption(JSC::JSGlobalObject* globalObject, JSC::ThrowScope&, JSValue options, WTF::ASCIILiteral name); @@ -119,10 +115,6 @@ class ByteSource final { return allocated(buffer.data, buffer.len); } - static ByteSource foreign(const void* data, size_t size); - - static ByteSource fromBIO(const ncrypto::BIOPointer& bio); - private: const void* data_ = nullptr; void* allocated_data_ = nullptr; diff --git a/src/jsc/bindings/node/http/llhttp/api.c b/src/jsc/bindings/node/http/llhttp/api.c index d76494678034..5df2a19d17f8 100644 --- a/src/jsc/bindings/node/http/llhttp/api.c +++ b/src/jsc/bindings/node/http/llhttp/api.c @@ -39,106 +39,11 @@ void llhttp_init(llhttp_t* parser, llhttp_type_t type, parser->settings = (void*)settings; } -#if defined(__wasm__) - -extern int wasm_on_message_begin(llhttp_t* p); -extern int wasm_on_url(llhttp_t* p, const char* at, size_t length); -extern int wasm_on_status(llhttp_t* p, const char* at, size_t length); -extern int wasm_on_header_field(llhttp_t* p, const char* at, size_t length); -extern int wasm_on_header_value(llhttp_t* p, const char* at, size_t length); -extern int wasm_on_headers_complete(llhttp_t* p, int status_code, - uint8_t upgrade, int should_keep_alive); -extern int wasm_on_body(llhttp_t* p, const char* at, size_t length); -extern int wasm_on_message_complete(llhttp_t* p); - -static int wasm_on_headers_complete_wrap(llhttp_t* p) -{ - return wasm_on_headers_complete(p, p->status_code, p->upgrade, - llhttp_should_keep_alive(p)); -} - -const llhttp_settings_t wasm_settings = { - .on_message_begin = wasm_on_message_begin, - .on_url = wasm_on_url, - .on_status = wasm_on_status, - .on_header_field = wasm_on_header_field, - .on_header_value = wasm_on_header_value, - .on_headers_complete = wasm_on_headers_complete_wrap, - .on_body = wasm_on_body, - .on_message_complete = wasm_on_message_complete, -}; - -llhttp_t* llhttp_alloc(llhttp_type_t type) -{ - llhttp_t* parser = malloc(sizeof(llhttp_t)); - llhttp_init(parser, type, &wasm_settings); - return parser; -} - -void llhttp_free(llhttp_t* parser) -{ - free(parser); -} - -#endif // defined(__wasm__) - -/* Some getters required to get stuff from the parser */ - -uint8_t llhttp_get_type(llhttp_t* parser) -{ - return parser->type; -} - -uint8_t llhttp_get_http_major(llhttp_t* parser) -{ - return parser->http_major; -} - -uint8_t llhttp_get_http_minor(llhttp_t* parser) -{ - return parser->http_minor; -} - -uint8_t llhttp_get_method(llhttp_t* parser) -{ - return parser->method; -} - -int llhttp_get_status_code(llhttp_t* parser) -{ - return parser->status_code; -} - -uint8_t llhttp_get_upgrade(llhttp_t* parser) -{ - return parser->upgrade; -} - -void llhttp_reset(llhttp_t* parser) -{ - llhttp_type_t type = parser->type; - const llhttp_settings_t* settings = parser->settings; - void* data = parser->data; - uint16_t lenient_flags = parser->lenient_flags; - - llhttp__internal_init(parser); - - parser->type = type; - parser->settings = (void*)settings; - parser->data = data; - parser->lenient_flags = lenient_flags; -} - llhttp_errno_t llhttp_execute(llhttp_t* parser, const char* data, size_t len) { return llhttp__internal_execute(parser, data, data + len); } -void llhttp_settings_init(llhttp_settings_t* settings) -{ - memset(settings, 0, sizeof(*settings)); -} - llhttp_errno_t llhttp_finish(llhttp_t* parser) { int err; @@ -192,11 +97,6 @@ void llhttp_resume_after_upgrade(llhttp_t* parser) parser->error = 0; } -llhttp_errno_t llhttp_get_errno(const llhttp_t* parser) -{ - return parser->error; -} - const char* llhttp_get_error_reason(const llhttp_t* parser) { return parser->reason; @@ -225,32 +125,6 @@ const char* llhttp_errno_name(llhttp_errno_t err) #undef HTTP_ERRNO_GEN } -const char* llhttp_method_name(llhttp_method_t method) -{ -#define HTTP_METHOD_GEN(NUM, NAME, STRING) \ - case HTTP_##NAME: \ - return #STRING; - switch (method) { - HTTP_ALL_METHOD_MAP(HTTP_METHOD_GEN) - default: - abort(); - } -#undef HTTP_METHOD_GEN -} - -const char* llhttp_status_name(llhttp_status_t status) -{ -#define HTTP_STATUS_GEN(NUM, NAME, STRING) \ - case HTTP_STATUS_##NAME: \ - return #STRING; - switch (status) { - HTTP_STATUS_MAP(HTTP_STATUS_GEN) - default: - abort(); - } -#undef HTTP_STATUS_GEN -} - void llhttp_set_lenient_headers(llhttp_t* parser, int enabled) { if (enabled) { @@ -517,17 +391,3 @@ int llhttp__on_reset(llhttp_t* s, const char* p, const char* endp) CALLBACK_MAYBE(s, on_reset); return err; } - -/* Private */ - -void llhttp__debug(llhttp_t* s, const char* p, const char* endp, - const char* msg) -{ - if (p == endp) { - fprintf(stderr, "p=%p type=%d flags=%02x next=null debug=%s\n", s, s->type, - s->flags, msg); - } else { - fprintf(stderr, "p=%p type=%d flags=%02x next=%02x debug=%s\n", s, - s->type, s->flags, *p, msg); - } -} diff --git a/src/jsc/bindings/node/http/llhttp/llhttp.h b/src/jsc/bindings/node/http/llhttp/llhttp.h index 3e43f26cb1c1..6cce718c3e60 100644 --- a/src/jsc/bindings/node/http/llhttp/llhttp.h +++ b/src/jsc/bindings/node/http/llhttp/llhttp.h @@ -617,40 +617,6 @@ LLHTTP_EXPORT void llhttp_init(llhttp_t* parser, llhttp_type_t type, const llhttp_settings_t* settings); -LLHTTP_EXPORT -llhttp_t* llhttp_alloc(llhttp_type_t type); - -LLHTTP_EXPORT -void llhttp_free(llhttp_t* parser); - -LLHTTP_EXPORT -uint8_t llhttp_get_type(llhttp_t* parser); - -LLHTTP_EXPORT -uint8_t llhttp_get_http_major(llhttp_t* parser); - -LLHTTP_EXPORT -uint8_t llhttp_get_http_minor(llhttp_t* parser); - -LLHTTP_EXPORT -uint8_t llhttp_get_method(llhttp_t* parser); - -LLHTTP_EXPORT -int llhttp_get_status_code(llhttp_t* parser); - -LLHTTP_EXPORT -uint8_t llhttp_get_upgrade(llhttp_t* parser); - -/* Reset an already initialized parser back to the start state, preserving the - * existing parser type, callback settings, user data, and lenient flags. - */ -LLHTTP_EXPORT -void llhttp_reset(llhttp_t* parser); - -/* Initialize the settings object */ -LLHTTP_EXPORT -void llhttp_settings_init(llhttp_settings_t* settings); - /* Parse full or partial request/response, invoking user callbacks along the * way. * @@ -718,10 +684,6 @@ void llhttp_resume(llhttp_t* parser); LLHTTP_EXPORT void llhttp_resume_after_upgrade(llhttp_t* parser); -/* Returns the latest return error */ -LLHTTP_EXPORT -llhttp_errno_t llhttp_get_errno(const llhttp_t* parser); - /* Returns the verbal explanation of the latest returned error. * * Note: User callback should set error reason when returning the error. See @@ -750,14 +712,6 @@ const char* llhttp_get_error_pos(const llhttp_t* parser); LLHTTP_EXPORT const char* llhttp_errno_name(llhttp_errno_t err); -/* Returns textual name of HTTP method */ -LLHTTP_EXPORT -const char* llhttp_method_name(llhttp_method_t method); - -/* Returns textual name of HTTP status */ -LLHTTP_EXPORT -const char* llhttp_status_name(llhttp_status_t status); - /* Enables/disables lenient header value parsing (disabled by default). * * Lenient parsing disables header value token checks, extending llhttp's diff --git a/src/jsc/bindings/webcore/EventEmitter.cpp b/src/jsc/bindings/webcore/EventEmitter.cpp index 1151d79b38d0..05777ff8a039 100644 --- a/src/jsc/bindings/webcore/EventEmitter.cpp +++ b/src/jsc/bindings/webcore/EventEmitter.cpp @@ -4,7 +4,6 @@ #include "DOMWrapperWorld.h" #include "EventNames.h" -#include "JSErrorHandler.h" #include "JSEventListener.h" #include #include diff --git a/src/jsc/bindings/webcore/EventTarget.cpp b/src/jsc/bindings/webcore/EventTarget.cpp index 70ade8b81fc2..bcdd66df682d 100644 --- a/src/jsc/bindings/webcore/EventTarget.cpp +++ b/src/jsc/bindings/webcore/EventTarget.cpp @@ -42,7 +42,6 @@ // #include "HTMLBodyElement.h" // #include "HTMLHtmlElement.h" // #include "InspectorInstrumentation.h" -#include "JSErrorHandler.h" #include "JSEventListener.h" // #include "Logging.h" // #include "Quirks.h" @@ -180,7 +179,6 @@ void EventTarget::setAttributeEventListener(const AtomString& eventType, JSC::JS addEventListener(eventType, JSMaybeErrorEventListener::create(*asObject(listener), jsEventTarget, true, isolatedWorld), {}); } -template void EventTarget::setAttributeEventListener(const AtomString& eventType, JSC::JSValue listener, JSC::JSObject& jsEventTarget); template void EventTarget::setAttributeEventListener(const AtomString& eventType, JSC::JSValue listener, JSC::JSObject& jsEventTarget); JSEventListener* EventTarget::attributeEventListener(const AtomString& eventType, DOMWrapperWorld& isolatedWorld) diff --git a/src/jsc/bindings/webcore/JSAbortAlgorithm.cpp b/src/jsc/bindings/webcore/JSAbortAlgorithm.cpp index 7bb5a1222ae1..deb865ea3767 100644 --- a/src/jsc/bindings/webcore/JSAbortAlgorithm.cpp +++ b/src/jsc/bindings/webcore/JSAbortAlgorithm.cpp @@ -91,12 +91,4 @@ void JSAbortAlgorithm::visitJSFunction(JSC::SlotVisitor& visitor) m_data->visitJSFunction(visitor); } -JSC::JSValue toJS(AbortAlgorithm& impl) -{ - if (!static_cast(impl).callbackData()) - return jsNull(); - - return static_cast(impl).callbackData()->callback(); -} - } // namespace WebCore diff --git a/src/jsc/bindings/webcore/JSAbortAlgorithm.h b/src/jsc/bindings/webcore/JSAbortAlgorithm.h index b95ecf8d9965..2fa6333d1a50 100644 --- a/src/jsc/bindings/webcore/JSAbortAlgorithm.h +++ b/src/jsc/bindings/webcore/JSAbortAlgorithm.h @@ -37,7 +37,6 @@ class JSAbortAlgorithm final : public AbortAlgorithm { ScriptExecutionContext* scriptExecutionContext() const { return ContextDestructionObserver::scriptExecutionContext(); } ~JSAbortAlgorithm() final; - JSCallbackData* callbackData() { return m_data; } // Functions CallbackResult handleEvent(JSValue) override; @@ -51,7 +50,4 @@ class JSAbortAlgorithm final : public AbortAlgorithm { JSCallbackData* m_data; }; -JSC::JSValue toJS(AbortAlgorithm&); -inline JSC::JSValue toJS(AbortAlgorithm* impl) { return impl ? toJS(*impl) : JSC::jsNull(); } - } // namespace WebCore diff --git a/src/jsc/bindings/webcore/JSDOMAttribute.h b/src/jsc/bindings/webcore/JSDOMAttribute.h index 054eb5b25fb3..c9be673aa419 100644 --- a/src/jsc/bindings/webcore/JSDOMAttribute.h +++ b/src/jsc/bindings/webcore/JSDOMAttribute.h @@ -91,8 +91,6 @@ class IDLAttribute { if (!thisObject) [[unlikely]] { if constexpr (shouldThrow == CastedThisErrorBehavior::Throw) return JSC::throwVMDOMAttributeGetterTypeError(&lexicalGlobalObject, throwScope, JSClass::info(), attributeName); - else if constexpr (shouldThrow == CastedThisErrorBehavior::RejectPromise) - RELEASE_AND_RETURN(throwScope, rejectPromiseWithGetterTypeError(lexicalGlobalObject, JSClass::info(), attributeName)); else return JSC::JSValue::encode(JSC::jsUndefined()); } diff --git a/src/jsc/bindings/webcore/JSErrorHandler.cpp b/src/jsc/bindings/webcore/JSErrorHandler.cpp deleted file mode 100644 index e7571a185aae..000000000000 --- a/src/jsc/bindings/webcore/JSErrorHandler.cpp +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (C) 2010 Google Inc. All rights reserved. - * Copyright (C) 2013-2018 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "config.h" -#include "JSErrorHandler.h" - -// #include "Document.h" -#include "ErrorEvent.h" -#include "Event.h" -#include "JSDOMConvertNumbers.h" -#include "JSDOMConvertStrings.h" -#include "JSEvent.h" -#include -#include - -namespace WebCore { -using namespace JSC; - -inline JSErrorHandler::JSErrorHandler(JSObject& listener, JSObject& wrapper, bool isAttribute, DOMWrapperWorld& world) - : JSEventListener(&listener, &wrapper, isAttribute, CreatedFromMarkup::No, world) -{ -} - -Ref JSErrorHandler::create(JSC::JSObject& listener, JSC::JSObject& wrapper, bool isAttribute, DOMWrapperWorld& world) -{ - return adoptRef(*new JSErrorHandler(listener, wrapper, isAttribute, world)); -} - -JSErrorHandler::~JSErrorHandler() = default; - -void JSErrorHandler::handleEvent(ScriptExecutionContext& scriptExecutionContext, Event& event) -{ - if (!is(event)) - return JSEventListener::handleEvent(scriptExecutionContext, event); - - VM& vm = scriptExecutionContext.vm(); - JSLockHolder lock(vm); - - JSObject* jsFunction = this->ensureJSFunction(scriptExecutionContext); - if (!jsFunction) - return; - - auto* isolatedWorld = this->isolatedWorld(); - if (!isolatedWorld) [[unlikely]] - return; - - auto* globalObject = toJSDOMGlobalObject(scriptExecutionContext, *isolatedWorld); - if (!globalObject) - return; - - auto callData = getCallData(jsFunction); - if (callData.type != CallData::Type::None) { - Ref protectedThis(*this); - - RefPtr savedEvent; - // auto* jsFunctionWindow = dynamicDowncast( jsFunction->globalObject()); - // if (jsFunctionWindow) { - // savedEvent = jsFunctionWindow->currentEvent(); - - // // window.event should not be set when the target is inside a shadow tree, as per the DOM specification. - // if (!event.currentTargetIsInShadowTree()) - // jsFunctionWindow->setCurrentEvent(&event); - // } - - auto& errorEvent = downcast(event); - - MarkedArgumentBuffer args; - args.append(toJS(*globalObject, errorEvent.message())); - args.append(toJS(*globalObject, errorEvent.filename())); - args.append(toJS(errorEvent.lineno())); - args.append(toJS(errorEvent.colno())); - args.append(errorEvent.error(*globalObject)); - ASSERT(!args.hasOverflowed()); - - // JSExecState::instrumentFunction(&scriptExecutionContext, callData); - - NakedPtr exception; - JSValue returnValue = JSC::profiledCall(globalObject, JSC::ProfilingReason::Other, jsFunction, callData, globalObject, args, exception); - - // InspectorInstrumentation::didCallFunction(&scriptExecutionContext); - - // if (jsFunctionWindow) - // jsFunctionWindow->setCurrentEvent(savedEvent.get()); - - if (exception) - reportException(globalObject, exception); - else { - if (returnValue.isTrue()) - event.preventDefault(); - } - } -} - -} // namespace WebCore diff --git a/src/jsc/bindings/webcore/JSErrorHandler.h b/src/jsc/bindings/webcore/JSErrorHandler.h deleted file mode 100644 index d32c55a86106..000000000000 --- a/src/jsc/bindings/webcore/JSErrorHandler.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2010 Google Inc. All rights reserved. - * Copyright (C) 2017 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#pragma once - -#include "JSEventListener.h" - -namespace WebCore { - -class JSErrorHandler final : public JSEventListener { -public: - static Ref create(JSC::JSObject& listener, JSC::JSObject& wrapper, bool isAttribute, DOMWrapperWorld&); - virtual ~JSErrorHandler(); - -private: - JSErrorHandler(JSC::JSObject& listener, JSC::JSObject& wrapper, bool isAttribute, DOMWrapperWorld&); - void handleEvent(ScriptExecutionContext&, Event&) final; -}; - -} // namespace WebCore diff --git a/src/jsc/bindings/webcore/JSPerformanceObserverCallback.cpp b/src/jsc/bindings/webcore/JSPerformanceObserverCallback.cpp index db1050173bfa..a1e115e48585 100644 --- a/src/jsc/bindings/webcore/JSPerformanceObserverCallback.cpp +++ b/src/jsc/bindings/webcore/JSPerformanceObserverCallback.cpp @@ -92,12 +92,4 @@ void JSPerformanceObserverCallback::visitJSFunction(JSC::SlotVisitor& visitor) m_data->visitJSFunction(visitor); } -JSC::JSValue toJS(PerformanceObserverCallback& impl) -{ - if (!static_cast(impl).callbackData()) - return jsNull(); - - return static_cast(impl).callbackData()->callback(); -} - } // namespace WebCore diff --git a/src/jsc/bindings/webcore/JSPerformanceObserverCallback.h b/src/jsc/bindings/webcore/JSPerformanceObserverCallback.h index 457605ef0729..f5a6ba8ae841 100644 --- a/src/jsc/bindings/webcore/JSPerformanceObserverCallback.h +++ b/src/jsc/bindings/webcore/JSPerformanceObserverCallback.h @@ -37,7 +37,6 @@ class JSPerformanceObserverCallback final : public PerformanceObserverCallback { ScriptExecutionContext* scriptExecutionContext() const { return ContextDestructionObserver::scriptExecutionContext(); } ~JSPerformanceObserverCallback() final; - JSCallbackData* callbackData() { return m_data; } // Functions CallbackResult handleEvent(typename IDLInterface::ParameterType thisObject, typename IDLInterface::ParameterType entries, typename IDLInterface::ParameterType observer) override; @@ -54,7 +53,4 @@ class JSPerformanceObserverCallback final : public PerformanceObserverCallback { JSCallbackData* m_data; }; -JSC::JSValue toJS(PerformanceObserverCallback&); -inline JSC::JSValue toJS(PerformanceObserverCallback* impl) { return impl ? toJS(*impl) : JSC::jsNull(); } - } // namespace WebCore diff --git a/src/jsc/bindings/webcore/PerformanceResourceTiming.cpp b/src/jsc/bindings/webcore/PerformanceResourceTiming.cpp index 582e3c018fc4..805ecac86930 100644 --- a/src/jsc/bindings/webcore/PerformanceResourceTiming.cpp +++ b/src/jsc/bindings/webcore/PerformanceResourceTiming.cpp @@ -69,39 +69,6 @@ size_t PerformanceResourceTiming::memoryCost() const return size; } -static double entryStartTime(MonotonicTime timeOrigin, const ResourceTiming& resourceTiming) -{ - if (resourceTiming.networkLoadMetrics().failsTAOCheck - || !resourceTiming.networkLoadMetrics().redirectCount) - return fetchStart(timeOrigin, resourceTiming); - - if (resourceTiming.networkLoadMetrics().redirectStart) - return networkLoadTimeToDOMHighResTimeStamp(timeOrigin, resourceTiming.networkLoadMetrics().redirectStart); - - return networkLoadTimeToDOMHighResTimeStamp(timeOrigin, resourceTiming.resourceLoadTiming().startTime()); -} - -static double entryEndTime(MonotonicTime timeOrigin, const ResourceTiming& resourceTiming) -{ - if (resourceTiming.networkLoadMetrics().responseEnd) - return networkLoadTimeToDOMHighResTimeStamp(timeOrigin, resourceTiming.networkLoadMetrics().responseEnd); - - return networkLoadTimeToDOMHighResTimeStamp(timeOrigin, resourceTiming.resourceLoadTiming().endTime()); -} - -Ref PerformanceResourceTiming::create(MonotonicTime timeOrigin, ResourceTiming&& resourceTiming) -{ - return adoptRef(*new PerformanceResourceTiming(timeOrigin, WTF::move(resourceTiming))); -} - -PerformanceResourceTiming::PerformanceResourceTiming(MonotonicTime timeOrigin, ResourceTiming&& resourceTiming) - : PerformanceEntry(resourceTiming.url().string(), entryStartTime(timeOrigin, resourceTiming), entryEndTime(timeOrigin, resourceTiming)) - , m_timeOrigin(timeOrigin) - , m_resourceTiming(WTF::move(resourceTiming)) - , m_serverTiming(m_resourceTiming.populateServerTiming()) -{ -} - PerformanceResourceTiming::~PerformanceResourceTiming() = default; const String& PerformanceResourceTiming::nextHopProtocol() const diff --git a/src/jsc/bindings/webcore/PerformanceResourceTiming.h b/src/jsc/bindings/webcore/PerformanceResourceTiming.h index fdaef3675d9d..652cd1636a8e 100644 --- a/src/jsc/bindings/webcore/PerformanceResourceTiming.h +++ b/src/jsc/bindings/webcore/PerformanceResourceTiming.h @@ -44,8 +44,6 @@ class ResourceTiming; class PerformanceResourceTiming : public PerformanceEntry { public: - static Ref create(MonotonicTime timeOrigin, ResourceTiming&&); - const String& initiatorType() const { return m_resourceTiming.initiatorType(); } const String& nextHopProtocol() const; @@ -73,7 +71,6 @@ class PerformanceResourceTiming : public PerformanceEntry { ASCIILiteral entryType() const override { return "resource"_s; } protected: - PerformanceResourceTiming(MonotonicTime timeOrigin, ResourceTiming&&); ~PerformanceResourceTiming(); bool isLoadedFromServiceWorker() const { return m_resourceTiming.isLoadedFromServiceWorker(); } diff --git a/src/jsc/bindings/webcore/ResourceTiming.cpp b/src/jsc/bindings/webcore/ResourceTiming.cpp index 7957457c5a1d..5de122b48e68 100644 --- a/src/jsc/bindings/webcore/ResourceTiming.cpp +++ b/src/jsc/bindings/webcore/ResourceTiming.cpp @@ -26,7 +26,6 @@ #include "config.h" #include "ResourceTiming.h" -#include "PerformanceServerTiming.h" #include "ResourceLoadTiming.h" #include "NetworkLoadMetrics.h" @@ -46,15 +45,4 @@ ResourceTiming::ResourceTiming(const URL& url, const String& initiatorType, cons { } -Vector> ResourceTiming::populateServerTiming() const -{ - // To increase privacy, this additional check was proposed at https://github.com/w3c/resource-timing/issues/342 . - if (!m_isSameOriginRequest) - return {}; - - return WTF::map(m_serverTiming, [](auto& entry) { - return PerformanceServerTiming::create(String(entry.name), entry.duration, String(entry.description)); - }); -} - } // namespace WebCore diff --git a/src/jsc/bindings/webcore/ResourceTiming.h b/src/jsc/bindings/webcore/ResourceTiming.h index 2181522572e8..bbe1decc8f8d 100644 --- a/src/jsc/bindings/webcore/ResourceTiming.h +++ b/src/jsc/bindings/webcore/ResourceTiming.h @@ -50,7 +50,6 @@ class ResourceTiming { const ResourceLoadTiming& resourceLoadTiming() const { return m_resourceLoadTiming; } const NetworkLoadMetrics& networkLoadMetrics() const { return m_networkLoadMetrics; } NetworkLoadMetrics& networkLoadMetrics() { return m_networkLoadMetrics; } - Vector> populateServerTiming() const; bool isSameOriginRequest() const { return m_isSameOriginRequest; } void overrideInitiatorType(const String& type) { m_initiatorType = type; } diff --git a/src/lsquic_sys/lib.rs b/src/lsquic_sys/lib.rs index 11894e7021cb..edb48c0018c2 100644 --- a/src/lsquic_sys/lib.rs +++ b/src/lsquic_sys/lib.rs @@ -210,7 +210,6 @@ unsafe extern "C" { ) -> *mut lsquic_engine; pub fn us_nq_spec_dest(s: *const lsquic_out_spec) -> *const sockaddr; pub fn us_nq_spec_local(s: *const lsquic_out_spec) -> *const sockaddr; - pub fn us_nq_spec_peer_ctx(s: *const lsquic_out_spec) -> *mut c_void; pub fn us_nq_spec_iov(s: *const lsquic_out_spec, n: *mut usize) -> *const iovec; pub fn us_nq_spec_stride() -> usize; pub fn us_nq_stream_reset(s: *mut lsquic_stream, code: u64); diff --git a/src/runtime/node/node_fs.rs b/src/runtime/node/node_fs.rs index 75e13e84411a..36a96965873e 100644 --- a/src/runtime/node/node_fs.rs +++ b/src/runtime/node/node_fs.rs @@ -1398,7 +1398,7 @@ mod _async_tasks { /// This task is used by `AsyncCpTask/fs.promises.cp` to copy a single file. /// When clonefile cannot be used, this task is started once per file. - pub struct CpSingleTask { + pub(crate) struct CpSingleTask { /// BACKREF — the parent `NewAsyncCpTask` is `Box::leak`'d and outlives every /// subtask via the `subtask_count` refcount (see `on_subtask_done`). Stored /// as `ParentRef` (constructed from the `*mut` with `Box::leak` provenance) @@ -2249,7 +2249,7 @@ mod _async_tasks { } } - pub enum ResultListEntryValue { + pub(crate) enum ResultListEntryValue { WithFileTypes(Vec), Buffers(Vec), Files(Vec), @@ -2283,7 +2283,7 @@ mod _async_tasks { } } - pub struct ResultListEntry { + pub(crate) struct ResultListEntry { pub(crate) next: bun_threading::Link, // INTRUSIVE: UnboundedQueue link pub value: ResultListEntryValue, } @@ -2577,7 +2577,7 @@ mod _async_tasks { /// /// Rust can't switch on a generic `T` inside `write_results`, so the /// per-type `ResultListEntryValue` wrapping lives on this trait. - pub trait IntoResultListEntry: Sized { + pub(crate) trait IntoResultListEntry: Sized { fn into_variant(v: Vec) -> ResultListEntryValue; } impl IntoResultListEntry for Dirent { @@ -2618,9 +2618,8 @@ mod _async_tasks { } } // mod _async_tasks pub use _async_tasks::{ - AsyncCpTask, AsyncFSTask, AsyncReaddirRecursiveTask, CpSingleTask, FsArgument, FsReturn, - IntoResultListEntry, NewAsyncCpTask, ResultListEntry, ResultListEntryValue, ShellAsyncCpTask, - UVFSRequest, async_, + AsyncCpTask, AsyncFSTask, AsyncReaddirRecursiveTask, FsArgument, FsReturn, NewAsyncCpTask, + ShellAsyncCpTask, UVFSRequest, async_, }; // ────────────────────────────────────────────────────────────────────────── diff --git a/src/uws_sys/ListenSocket.rs b/src/uws_sys/ListenSocket.rs index b888dd162907..a5868e38e146 100644 --- a/src/uws_sys/ListenSocket.rs +++ b/src/uws_sys/ListenSocket.rs @@ -1,8 +1,6 @@ use core::ffi::{c_char, c_int, c_void}; -use bun_core::Fd; - -use crate::{LIBUS_SOCKET_DESCRIPTOR, SocketGroup, SslCtx, us_socket_t}; +use crate::{SocketGroup, SslCtx, us_socket_t}; bun_opaque::opaque_ffi! { /// Opaque FFI handle for a uSockets listen socket. @@ -42,30 +40,16 @@ impl ListenSocket { unsafe { &mut *us_listen_socket_group(self) } } - pub fn fd(&mut self) -> Fd { - let raw = us_listen_socket_get_fd(self); - // SOCKET → kind=system (mask bit 63); `from_native` would store the - // raw bits verbatim and mis-tag `INVALID_SOCKET` (~0) as kind=uv. - #[cfg(windows)] - { - Fd::from_system(raw as *mut core::ffi::c_void) - } - #[cfg(not(windows))] - { - Fd::from_native(raw) - } - } - /// `ssl_ctx` is `SSL_CTX_up_ref`'d for the SNI node; the listener drops /// that ref on close / `remove_server_name`. `user` is the per-domain handle - /// `find_server_name_userdata` recovers (uWS uses an `HttpRouter*`; Bun.listen + /// `us_socket_server_name_userdata` recovers (uWS uses an `HttpRouter*`; Bun.listen /// passes null). /// /// `ssl_ctx` is taken as a raw `*mut SslCtx` (not `&mut SslCtx`) because /// `SSL_CTX` is a refcounted shared object — C `SSL_CTX_up_ref`s it and /// stores the pointer past this call, so the caller cannot legitimately /// hold exclusive `&mut` access. `user` is likewise raw `*mut` because the - /// C side stores it and `find_server_name_userdata` later hands it back as + /// C side stores it and `us_socket_server_name_userdata` later hands it back as /// a mutable pointer; accepting `&U` and const-casting would make that /// round-trip UB. pub fn add_server_name( @@ -101,7 +85,6 @@ impl ListenSocket { unsafe extern "C" { safe fn us_listen_socket_close(ls: &mut ListenSocket); safe fn us_listen_socket_group(ls: &mut ListenSocket) -> *mut SocketGroup; - safe fn us_listen_socket_get_fd(ls: &mut ListenSocket) -> LIBUS_SOCKET_DESCRIPTOR; fn us_listen_socket_add_server_name( ls: *mut ListenSocket, hostname: *const c_char, diff --git a/src/uws_sys/SocketGroup.rs b/src/uws_sys/SocketGroup.rs index 2dfe607e99a1..b064525ed5b9 100644 --- a/src/uws_sys/SocketGroup.rs +++ b/src/uws_sys/SocketGroup.rs @@ -284,16 +284,6 @@ impl SocketGroup { ) } } - - pub fn pair( - &mut self, - kind: SocketKind, - ext_size: c_int, - fds: &mut [LIBUS_SOCKET_DESCRIPTOR; 2], - ) -> *mut us_socket_t { - // SAFETY: forwarding to C; `fds` is a valid 2-element array. - unsafe { us_socket_pair(self, kind as u8, ext_size, fds.as_mut_ptr().cast()) } - } } unsafe extern "C" { @@ -361,10 +351,4 @@ unsafe extern "C" { fd: LIBUS_SOCKET_DESCRIPTOR, ipc: c_int, ) -> *mut us_socket_t; - fn us_socket_pair( - group: *mut SocketGroup, - kind: u8, - ext_size: c_int, - fds: *mut [LIBUS_SOCKET_DESCRIPTOR; 2], - ) -> *mut us_socket_t; } diff --git a/src/uws_sys/quic/Context.rs b/src/uws_sys/quic/Context.rs index 880c6091783a..cc452e5ab26d 100644 --- a/src/uws_sys/quic/Context.rs +++ b/src/uws_sys/quic/Context.rs @@ -2,7 +2,7 @@ //! For the client there is exactly one of these per HTTP-thread loop and it //! lives for the process; the server creates one per `Bun.serve({http3:true})`. -use core::ffi::{CStr, c_char, c_int, c_uint, c_void}; +use core::ffi::{CStr, c_char, c_int, c_uint}; use crate::Loop; use crate::quic::{PendingConnect, Socket, Stream}; @@ -31,7 +31,6 @@ unsafe extern "C" { reject_unauthorized: c_int, out_qs: *mut *mut Socket, out_pending: *mut *mut PendingConnect, - user: *mut c_void, ) -> c_int; safe fn us_quic_socket_context_on_hsk_done( @@ -110,7 +109,6 @@ impl Context { port: u16, sni: &CStr, reject_unauthorized: bool, - user: *mut c_void, ) -> ConnectResult { let mut qs: *mut Socket = core::ptr::null_mut(); let mut pc: *mut PendingConnect = core::ptr::null_mut(); @@ -124,7 +122,6 @@ impl Context { reject_unauthorized as c_int, &raw mut qs, &raw mut pc, - user, ) }; match rc { diff --git a/src/uws_sys/quic/Socket.rs b/src/uws_sys/quic/Socket.rs index 692510ffec03..e204538bc7b8 100644 --- a/src/uws_sys/quic/Socket.rs +++ b/src/uws_sys/quic/Socket.rs @@ -18,7 +18,6 @@ unsafe extern "C" { safe fn us_quic_socket_make_stream(s: &mut Socket); safe fn us_quic_socket_streams_avail(s: &mut Socket) -> c_uint; fn us_quic_socket_status(s: *mut Socket, buf: *mut u8, len: c_uint) -> c_int; - safe fn us_quic_socket_close(s: &mut Socket); safe fn us_quic_socket_ext(s: &mut Socket) -> *mut c_void; } @@ -45,13 +44,8 @@ impl Socket { } } - #[inline] - pub fn close(&mut self) { - us_quic_socket_close(self) - } - /// `conn_ext_size` bytes of caller storage co-allocated with the socket. - /// Unset until the caller writes to it after `connect`/`on_open`; the + /// Unset until the caller writes to it after `connect`; the /// `Option>` slot pattern lets callbacks early-return on a null ext. #[inline] pub fn ext(&mut self) -> &mut Option> { diff --git a/src/uws_sys/us_socket_t.rs b/src/uws_sys/us_socket_t.rs index bcdf7377fedb..f4e971bcae56 100644 --- a/src/uws_sys/us_socket_t.rs +++ b/src/uws_sys/us_socket_t.rs @@ -41,27 +41,6 @@ pub struct UsIoVec { } impl us_socket_t { - pub fn open(&mut self, is_client: bool, ip_addr: Option<&[u8]>) { - bun_core::scoped_log!(uws, "us_socket_open({:p}, is_client: {})", self, is_client); - if let Some(ip) = ip_addr { - debug_assert!(ip.len() < MAX_I32); - unsafe { - // SAFETY: self is a live us_socket_t; ip.ptr valid for ip.len bytes - let _ = c::us_socket_open( - self, - is_client as i32, - ip.as_ptr(), - i32::try_from(ip.len().min(MAX_I32)).expect("int cast"), - ); - } - } else { - unsafe { - // SAFETY: self is a live us_socket_t - let _ = c::us_socket_open(self, is_client as i32, ptr::null(), 0); - } - } - } - pub(crate) fn pause(&mut self) { bun_core::scoped_log!(uws, "us_socket_pause({:p})", self); c::us_socket_pause(self); @@ -540,12 +519,6 @@ mod c { -> i32; pub(super) safe fn us_socket_flush(s: &mut us_socket_t); - pub(super) fn us_socket_open( - s: *mut us_socket_t, - is_client: i32, - ip: *const u8, - ip_length: i32, - ) -> *mut us_socket_t; pub(super) safe fn us_socket_pause(s: &mut us_socket_t); pub(super) safe fn us_socket_resume(s: &mut us_socket_t); pub(super) fn us_socket_close( diff --git a/test/internal/source-lints/dead-symbols-linker-sweep.test.ts b/test/internal/source-lints/dead-symbols-linker-sweep.test.ts new file mode 100644 index 000000000000..eea1242f05fe --- /dev/null +++ b/test/internal/source-lints/dead-symbols-linker-sweep.test.ts @@ -0,0 +1,181 @@ +// Guards against reintroduction of symbols removed as dead code in the +// linker-driven sweep: the debug binary was relinked with +// `--gc-sections --print-gc-sections`, every function the linker discarded was +// cross-checked for textual references across src/, packages/, scripts/ and +// freshly regenerated build/debug/codegen/ output, and the survivors were +// deleted together with their declarations and Rust-side FFI wrappers. The +// removal was validated by `cargo check` on all CI target triples plus a full +// `bun bd` build. +// +// This is a source-tree lint: it reads files from the repository and does not +// touch the built binary, so it belongs in test/internal/source-lints/ per the +// README. The symbol checks read the working tree, so a tree that still (or +// again) contains one of these definitions fails. The deleted-files check reads +// the committed tree (HEAD) instead: `git stash` round-trips can temporarily +// restore files a branch deletes (see the same note in dead-code-escapes.test.ts), +// and those strays must not fail the lint. + +import { expect, test } from "bun:test"; +import { readFileSync } from "node:fs"; +import path from "node:path"; + +const repoRoot = path.resolve(import.meta.dir, "..", "..", ".."); + +function headTree(): Set { + const r = Bun.spawnSync({ + cmd: ["git", "-C", repoRoot, "ls-tree", "-r", "--name-only", "-z", "HEAD"], + stdout: "pipe", + stderr: "pipe", + }); + if (r.exitCode !== 0) { + throw new Error(`git ls-tree HEAD failed: ${r.stderr.toString()}`); + } + return new Set(r.stdout.toString().split("\0").filter(Boolean)); +} + +function resurrected(checks: Array<[string, RegExp]>): string[] { + const cache = new Map(); + const read = (file: string) => { + let text = cache.get(file); + if (text === undefined) { + text = readFileSync(path.join(repoRoot, file), "utf8"); + cache.set(file, text); + } + return text; + }; + return checks.filter(([file, re]) => re.test(read(file))).map(([file, re]) => `${file}: ${re.source}`); +} + +test("dead node:crypto helpers (CryptoUtil, ncrypto) do not reappear", () => { + expect( + resurrected([ + // Key parsing helpers superseded by the ThrowScope-taking overloads. + ["src/jsc/bindings/node/crypto/CryptoUtil.h", /\bkeyFromString\b/], + ["src/jsc/bindings/node/crypto/CryptoUtil.h", /\bparseKeyFormat\b/], + ["src/jsc/bindings/node/crypto/CryptoUtil.h", /\bparseKeyType\b/], + ["src/jsc/bindings/node/crypto/CryptoUtil.h", /\bpassphraseFromBufferSource\b/], + ["src/jsc/bindings/node/crypto/CryptoUtil.h", /\bfromBIO\b/], + ["src/jsc/bindings/node/crypto/CryptoUtil.h", /static ByteSource foreign\b/], + // RSA raw encrypt/decrypt: the live path is Cipher::encrypt/decrypt. + ["src/jsc/bindings/ncrypto.cpp", /\bRSA_Cipher\b/], + ["src/jsc/bindings/ncrypto.cpp", /\bRsa::(encrypt|decrypt)\b/], + ["src/jsc/bindings/ncrypto.h", /\bsetRsaMgf1Md\b/], + // Cipher enumeration: node_crypto_binding.cpp calls EVP_CIPHER_do_all_sorted directly. + ["src/jsc/bindings/ncrypto.h", /\bCipherNameCallback\b/], + ["src/jsc/bindings/ncrypto.cpp", /\bCipher::ForEach\b/], + // scrypt/pbkdf2 run through the Rust bindings; these C++ wrappers had no callers. + ["src/jsc/bindings/ncrypto.h", /\bcheckScryptParams\b/], + ["src/jsc/bindings/ncrypto.h", /DataPointer scrypt\(/], + ["src/jsc/bindings/ncrypto.h", /DataPointer pbkdf2\(/], + ["src/jsc/bindings/ncrypto.h", /\bifRsa\b/], + ["src/jsc/bindings/ncrypto.h", /\bifEc\b/], + ["src/jsc/bindings/ncrypto.h", /\bisOne\b/], + ["src/jsc/bindings/ncrypto.h", /\bNewFp\b/], + ]), + ).toEqual([]); +}); + +test("dead JSC/WebCore binding helpers do not reappear", () => { + expect( + resurrected([ + // Request-level inspector notifications; the Rust callers were removed earlier. + ["src/jsc/bindings/InspectorHTTPServerAgent.h", /\brequestWillBeSent\b/], + ["src/jsc/bindings/InspectorHTTPServerAgent.h", /\bresponseReceived\b/], + ["src/jsc/bindings/InspectorHTTPServerAgent.h", /\bbodyChunkReceived\b/], + ["src/jsc/bindings/InspectorHTTPServerAgent.h", /\brequestFinished\b/], + ["src/jsc/bindings/InspectorHTTPServerAgent.h", /\brequestHandlerException\b/], + ["src/jsc/bindings/ScriptExecutionContext.h", /\bensureOnMainThread\b/], + ["src/jsc/bindings/ScriptExecutionContext.h", /^ScriptExecutionContext\* executionContext\(/m], + ["src/jsc/bindings/ErrorStackTrace.h", /\bretrieveTypeName\b/], + ["src/jsc/bindings/ErrorStackTrace.h", /\bm_typeName\b/], + // PerformanceResourceTiming is exposed as a constructor but never instantiated natively. + ["src/jsc/bindings/webcore/PerformanceResourceTiming.h", /static Ref create\(/], + ["src/jsc/bindings/webcore/ResourceTiming.h", /\bpopulateServerTiming\b/], + // Only reachable from the never-instantiated RejectPromise branch of IDLAttribute::get. + ["src/jsc/bindings/JSDOMExceptionHandling.h", /\brejectPromiseWithGetterTypeError\b/], + ["src/jsc/bindings/webcore/JSDOMAttribute.h", /\brejectPromiseWithGetterTypeError\b/], + // Nothing ever registered a JSErrorHandler attribute listener. + ["src/jsc/bindings/webcore/EventTarget.cpp", /\bJSErrorHandler\b/], + ["src/jsc/bindings/webcore/EventEmitter.cpp", /\bJSErrorHandler\b/], + // native -> JS conversions of callback interfaces; only the JS -> native direction is used. + ["src/jsc/bindings/webcore/JSAbortAlgorithm.h", /\bcallbackData\b/], + ["src/jsc/bindings/webcore/JSAbortAlgorithm.h", /toJS\(AbortAlgorithm/], + ["src/jsc/bindings/webcore/JSPerformanceObserverCallback.h", /\bcallbackData\b/], + ["src/jsc/bindings/webcore/JSPerformanceObserverCallback.h", /toJS\(PerformanceObserverCallback/], + // DOMJIT operations whose signatures were removed in #9457. + ["src/jsc/bindings/JSBuffer.cpp", /\bjsBufferConstructorAllocWithoutTypeChecks\b/], + ["src/jsc/bindings/JSBuffer.cpp", /\bjsBufferConstructorAllocUnsafeWithoutTypeChecks\b/], + ["src/jsc/bindings/JSBuffer.cpp", /\bjsBufferConstructorAllocUnsafeSlowWithoutTypeChecks\b/], + ]), + ).toEqual([]); +}); + +test("orphaned files stay deleted", () => { + const tree = headTree(); + const gone = ["src/jsc/bindings/webcore/JSErrorHandler.cpp", "src/jsc/bindings/webcore/JSErrorHandler.h"]; + expect(gone.filter(p => tree.has(p))).toEqual([]); +}); + +test("dead uSockets entry points and their Rust wrappers do not reappear", () => { + const h = "packages/bun-usockets/src/libusockets.h"; + const quic = "packages/bun-usockets/src/quic.h"; + expect( + resurrected([ + ["src/uws_sys/SocketGroup.rs", /\bus_socket_pair\b/], + ["src/uws_sys/us_socket_t.rs", /\bus_socket_open\b/], + ["src/uws_sys/ListenSocket.rs", /\bus_listen_socket_get_fd\b/], + ["src/uws_sys/quic/Socket.rs", /\bus_quic_socket_close\b/], + ["src/lsquic_sys/lib.rs", /\bus_nq_spec_peer_ctx\b/], + [h, /\bus_socket_is_tls\b/], + [h, /\bus_socket_detach\b/], + [h, /\bus_connecting_socket_get_loop\b/], + [h, /\bus_socket_pair\b/], + [h, /\bus_socket_open\b/], + [h, /\bus_listen_socket_ext\b/], + [h, /\bus_listen_socket_port\b/], + [h, /\bus_listen_socket_get_fd\b/], + [h, /\bus_socket_group_next\b/], + [h, /\bus_socket_group_timestamp\b/], + [h, /\bus_loop_iteration_number\b/], + [h, /\bus_poll_ext\b/], + [h, /\bus_listen_socket_find_server_name_userdata\b/], + [h, /\bus_udp_packet_buffer_local_ip\b/], + ["packages/bun-usockets/src/internal/networking/bsd.h", /\bbsd_udp_packet_buffer_local_ip\b/], + [quic, /\bus_quic_pending_connect_user\b/], + [quic, /\bus_quic_socket_context_on_open\b/], + [quic, /\bus_quic_stream_flush\b/], + [quic, /\bus_quic_stream_has_unacked\b/], + [quic, /\bus_quic_socket_context\b/], + [quic, /\bus_quic_socket_close\b/], + ["packages/bun-usockets/src/node_quic_shim.c", /\bus_nq_spec_peer_ctx\b/], + ]), + ).toEqual([]); +}); + +test("unused llhttp API surface does not reappear", () => { + const h = "src/jsc/bindings/node/http/llhttp/llhttp.h"; + expect( + resurrected([ + [h, /\bllhttp_alloc\b/], + [h, /\bllhttp_free\b/], + [h, /\bllhttp_get_type\b/], + [h, /\bllhttp_get_http_major\b/], + [h, /\bllhttp_get_http_minor\b/], + [h, /\bllhttp_get_method\b/], + [h, /\bllhttp_get_status_code\b/], + [h, /\bllhttp_get_upgrade\b/], + [h, /\bllhttp_reset\b/], + [h, /\bllhttp_settings_init\b/], + [h, /\bllhttp_get_errno\b/], + [h, /\bllhttp_method_name\b/], + [h, /\bllhttp_status_name\b/], + ["src/jsc/bindings/node/http/llhttp/api.c", /\bllhttp__debug\b/], + ["src/jsc/bindings/node/http/llhttp/api.c", /__wasm__/], + ]), + ).toEqual([]); +}); + +test("environment variables nothing reads any more are not re-declared", () => { + // BUN_NEEDS_PROC_SELF_WORKAROUND, MI_VERBOSE and TODIUM are removed (and pinned) by #35437. + expect(resurrected([["src/bun_core/env_var.rs", /\bBUN_DUMP_STATE_ON_CRASH\b/]])).toEqual([]); +});