Implement megaphone conditional standard_donate with local device createdAt

This commit is contained in:
ayumi-signal
2026-01-15 09:40:22 -08:00
committed by GitHub
parent 5528cd37c0
commit 1cfda1f210
16 changed files with 452 additions and 19 deletions

View File

@@ -27,41 +27,45 @@ export async function onDeviceNameChangeSync(
const { confirm } = event;
const maybeQueueAndThenConfirm = async () => {
await maybeQueueDeviceNameFetch();
await maybeQueueDeviceInfoFetch();
confirm();
};
drop(maybeQueueAndThenConfirm());
}
export async function maybeQueueDeviceNameFetch(): Promise<void> {
export async function maybeQueueDeviceInfoFetch(): Promise<void> {
if (deviceNameFetchQueue.size >= 1) {
log.info('maybeQueueDeviceNameFetch: skipping; fetch already queued');
log.info('maybeQueueDeviceInfoFetch: skipping; fetch already queued');
}
try {
await deviceNameFetchQueue.add(fetchAndUpdateDeviceName);
await deviceNameFetchQueue.add(fetchAndUpdateDeviceInfo);
} catch (e) {
log.error(
'maybeQueueDeviceNameFetch: error when fetching device name',
'maybeQueueDeviceInfoFetch: error when fetching device name',
toLogFormat(e)
);
}
}
async function fetchAndUpdateDeviceName() {
async function fetchAndUpdateDeviceInfo() {
const { devices } = await getDevices();
const localDeviceId = parseIntOrThrow(
itemStorage.user.getDeviceId(),
'fetchAndUpdateDeviceName: localDeviceId'
'fetchAndUpdateDeviceInfo: localDeviceId'
);
const ourDevice = devices.find(device => device.id === localDeviceId);
strictAssert(ourDevice, 'ourDevice must be returned from devices endpoint');
const newNameEncrypted = ourDevice.name;
await maybeUpdateDeviceCreatedAt(
ourDevice.createdAtCiphertext,
localDeviceId
);
const newNameEncrypted = ourDevice.name;
if (!newNameEncrypted) {
log.error('fetchAndUpdateDeviceName: device had empty name');
log.error('fetchAndUpdateDeviceInfo: device had empty name');
return;
}
@@ -71,20 +75,49 @@ async function fetchAndUpdateDeviceName() {
} catch (e) {
const deviceNameWasEncrypted = itemStorage.user.getDeviceNameEncrypted();
log.error(
`fetchAndUpdateDeviceName: failed to decrypt device name. Was encrypted local state: ${deviceNameWasEncrypted}`
`fetchAndUpdateDeviceInfo: failed to decrypt device name. Was encrypted local state: ${deviceNameWasEncrypted}`
);
return;
}
const existingName = itemStorage.user.getDeviceName();
if (newName === existingName) {
log.info('fetchAndUpdateDeviceName: new name matches existing name');
log.info('fetchAndUpdateDeviceInfo: new name matches existing name');
return;
}
await itemStorage.user.setDeviceName(newName);
window.Whisper.events.emit('deviceNameChanged');
log.info(
'fetchAndUpdateDeviceName: successfully updated new device name locally'
'fetchAndUpdateDeviceInfo: successfully updated new device name locally'
);
}
async function maybeUpdateDeviceCreatedAt(
createdAtCiphertext: string,
deviceId: number
): Promise<void> {
const existingCreatedAt = itemStorage.user.getDeviceCreatedAt();
if (existingCreatedAt) {
return;
}
const createdAtEncrypted = createdAtCiphertext;
let createdAt: number | undefined;
try {
createdAt = await accountManager.decryptDeviceCreatedAt(
createdAtEncrypted,
deviceId
);
} catch (e) {
log.error(
'maybeUpdateDeviceCreatedAt: failed to decrypt device createdAt',
toLogFormat(e)
);
}
if (createdAt) {
await itemStorage.user.setDeviceCreatedAt(createdAt);
log.info('maybeUpdateDeviceCreatedAt: saved createdAt');
}
}