node: Support H2 connections to a local server

This commit is contained in:
Jordan Rose
2026-03-31 12:38:35 -07:00
parent f645178020
commit 3d4e950848
5 changed files with 22 additions and 4 deletions

View File

@@ -8,3 +8,5 @@ v0.91.0
- Log more details on gRPC failure
- Log backtraces on panic
- Node: Support H2 when using `localTestServer` mode for Net connections.

View File

@@ -687,7 +687,7 @@ type NativeFunctions = {
TESTING_CdsiLookupResponseConvert: (asyncRuntime: Wrapper<TokioAsyncContext>) => CancellablePromise<LookupResponse>;
TESTING_CdsiLookupErrorConvert: (errorDescription: string) => void;
TESTING_ServerMessageAck_Create: () => ServerMessageAck;
TESTING_ConnectionManager_newLocalOverride: (userAgent: string, chatPort: number, cdsiPort: number, svr2Port: number, svrBPort: number, rootCertificateDer: Uint8Array<ArrayBuffer>) => ConnectionManager;
TESTING_ConnectionManager_newLocalOverride: (userAgent: string, chatPort: number, cdsiPort: number, svr2Port: number, svrBPort: number, rootCertificateDer: Uint8Array<ArrayBuffer>, httpVersion: number) => ConnectionManager;
TESTING_ConnectionManager_isUsingProxy: (manager: Wrapper<ConnectionManager>) => number;
TESTING_CreateOTP: (username: string, secret: Uint8Array<ArrayBuffer>) => string;
TESTING_CreateOTPFromBase64: (username: string, secret: string) => string;

View File

@@ -111,6 +111,7 @@ export type NetConstructorOptions = Readonly<
TESTING_localServer_svr2Port: number;
TESTING_localServer_svrBPort: number;
TESTING_localServer_rootCertificateDer: Uint8Array<ArrayBuffer>;
TESTING_localServer_httpVersion?: 1 | 2;
}
>;
@@ -164,7 +165,8 @@ export class Net {
options.TESTING_localServer_cdsiPort,
options.TESTING_localServer_svr2Port,
options.TESTING_localServer_svrBPort,
options.TESTING_localServer_rootCertificateDer
options.TESTING_localServer_rootCertificateDer,
options.TESTING_localServer_httpVersion ?? 1
)
);
} else {

View File

@@ -12,6 +12,7 @@ use libsignal_bridge_types::net::{BuildVariant, ConnectionManager, TokioAsyncCon
use libsignal_core::E164;
use libsignal_net::cdsi::{CdsiProtocolError, LookupError, LookupResponse, LookupResponseEntry};
use libsignal_net::infra::errors::RetryLater;
use libsignal_net::infra::route::HttpVersion;
use libsignal_net::infra::ws::attested::AttestedProtocolError;
use libsignal_protocol::{Aci, Pni};
use nonzero_ext::nonzero;
@@ -150,6 +151,7 @@ fn TESTING_ConnectionManager_newLocalOverride(
svr2Port: AsType<NonZeroU16, u16>,
svrBPort: AsType<NonZeroU16, u16>,
rootCertificateDer: &[u8],
http_version: u8,
) -> ConnectionManager {
let ports = net_env::LocalhostEnvPortConfig {
chat_port: chatPort.into_inner(),
@@ -157,8 +159,13 @@ fn TESTING_ConnectionManager_newLocalOverride(
svr2_port: svr2Port.into_inner(),
svrb_port: svrBPort.into_inner(),
};
let http_version = match http_version {
1 => HttpVersion::Http1_1,
2 => HttpVersion::Http2,
_ => panic!("invalid HTTP version {http_version}"),
};
let env = net_env::localhost_test_env_with_ports(ports, rootCertificateDer);
let env = net_env::localhost_test_env_with_ports(ports, rootCertificateDer, http_version);
ConnectionManager::new_from_static_environment(
env,
userAgent.as_str(),

View File

@@ -21,6 +21,7 @@ fn localhost_test_domain_config_with_port_and_cert(
service: ServiceName,
port: NonZeroU16,
root_certificate_der: &[u8],
http_version: HttpVersion,
) -> DomainConfig {
const LOCALHOST_IP_V4: Ipv4Addr = ip_addr!(v4, "127.0.0.1");
DomainConfig {
@@ -31,7 +32,7 @@ fn localhost_test_domain_config_with_port_and_cert(
hostname: "localhost",
port,
cert: RootCertificates::FromDer(std::borrow::Cow::Owned(root_certificate_der.to_vec())),
http_version: Some(HttpVersion::Http1_1),
http_version: Some(http_version),
min_tls_version: None,
confirmation_header_name: None,
proxy: None,
@@ -80,17 +81,20 @@ const DUMMY_KEYTRANS_CONFIG: KeyTransConfig = KeyTransConfig {
pub(crate) fn localhost_test_env_with_ports(
ports: LocalhostEnvPortConfig,
root_certificate_der: &[u8],
http_version: HttpVersion,
) -> Env<'static> {
Env {
chat_domain_config: localhost_test_domain_config_with_port_and_cert(
ServiceName("chat"),
ports.chat_port,
root_certificate_der,
http_version,
),
experimental_chat_h2_domain_config: localhost_test_domain_config_with_port_and_cert(
ServiceName("chat"),
ports.chat_port,
root_certificate_der,
http_version,
),
chat_ws_config: RECOMMENDED_CHAT_WS_CONFIG,
cdsi: EnclaveEndpoint {
@@ -98,6 +102,7 @@ pub(crate) fn localhost_test_env_with_ports(
ServiceName("cdsi"),
ports.cdsi_port,
root_certificate_der,
http_version,
),
ws_config: RECOMMENDED_WS_CONFIG,
params: DUMMY_CDSI_ENDPOINT_PARAMS,
@@ -107,6 +112,7 @@ pub(crate) fn localhost_test_env_with_ports(
ServiceName("svr2"),
ports.svr2_port,
root_certificate_der,
http_version,
),
ws_config: RECOMMENDED_WS_CONFIG,
params: DUMMY_SVR2_ENDPOINT_PARAMS,
@@ -118,6 +124,7 @@ pub(crate) fn localhost_test_env_with_ports(
ServiceName("svrb"),
ports.svrb_port,
root_certificate_der,
http_version,
),
ws_config: RECOMMENDED_WS_CONFIG,
params: DUMMY_SVRB_ENDPOINT_PARAMS,