Files
Desktop/ts/LibsignalNetRemoteConfig.preload.ts
T
automated-signal e43ccdd3b7 Bump to libsignal v0.94.3
Co-authored-by: andrew-signal <andrew@signal.org>
2026-06-02 12:56:32 -07:00

92 lines
3.0 KiB
TypeScript

// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import {
type Net,
BuildVariant,
REMOTE_CONFIG_KEYS as KeysExpectedByLibsignalNet,
} from '@signalapp/libsignal-client/dist/net.js';
import { isNightly, isProduction } from './util/version.std.ts';
import { drop } from './util/drop.std.ts';
import * as RemoteConfig from './RemoteConfig.dom.ts';
import type { AddPrefix, ArrayValues } from './types/Util.std.ts';
import { createLogger } from './logging/log.std.ts';
const log = createLogger('LibsignalNetRemoteConfig');
const ENABLE_REFLECTORS_TEST_KEY = 'desktop.enableReflectorsTest';
function convertToDesktopRemoteConfigKey<
K extends ArrayValues<typeof KeysExpectedByLibsignalNet>,
>(key: K): AddPrefix<K, 'desktop.libsignalNet.'> {
return `desktop.libsignalNet.${key}`;
}
export function bindRemoteConfigToLibsignalNet(
libsignalNet: Net,
appVersion: string,
reconnect: () => Promise<void>,
options: Readonly<{ hasExplicitProxy?: boolean }> = {}
): void {
const libsignalBuildVariant = isProduction(appVersion)
? BuildVariant.Production
: BuildVariant.Beta;
const hasExplicitProxy = options.hasExplicitProxy === true;
const isReflectorProxyTestBuild = isNightly(appVersion);
const setLibsignalRemoteConfig = () => {
const remoteConfigs = KeysExpectedByLibsignalNet.reduce((output, key) => {
const value = RemoteConfig.getValue(convertToDesktopRemoteConfigKey(key));
if (value !== undefined) {
output.set(key, value);
}
return output;
}, new Map<(typeof KeysExpectedByLibsignalNet)[number], string>());
log.info(
'Setting libsignal-net remote config',
Object.fromEntries(remoteConfigs)
);
libsignalNet.setRemoteConfig(remoteConfigs, libsignalBuildVariant);
};
const setReflectorProxyTestConfig = () => {
const shouldEnable =
isReflectorProxyTestBuild &&
!hasExplicitProxy &&
RemoteConfig.isEnabled(ENABLE_REFLECTORS_TEST_KEY);
log.info('Setting libsignal-net reflector proxy test config', {
enabled: shouldEnable,
});
libsignalNet.INTERNAL_TESTING_setReflectorProxy(shouldEnable);
};
setLibsignalRemoteConfig();
if (isReflectorProxyTestBuild) {
setReflectorProxyTestConfig();
}
RemoteConfig.onChange(
KeysExpectedByLibsignalNet.map(convertToDesktopRemoteConfigKey),
() => {
setLibsignalRemoteConfig();
// When linking for the first time in mock tests we start with an empty
// remote config and fetch the latest values only when we connect the
// socket. However, new values won't be applied until we reconnect so
// we need to reconnect immediately to use remote config dependent
// features like gRPC.
if (window.SignalCI) {
log.info('Reconnecting socket after remote config change');
drop(reconnect());
}
}
);
if (isReflectorProxyTestBuild) {
RemoteConfig.onChange([ENABLE_REFLECTORS_TEST_KEY], () => {
setReflectorProxyTestConfig();
});
}
}