Skip to content

Commit a6aa151

Browse files
committed
perf: avoid redundant device pairing writes
1 parent 8f64cd3 commit a6aa151

1 file changed

Lines changed: 26 additions & 12 deletions

File tree

src/infra/device-pairing.ts

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,22 @@ async function loadState(baseDir?: string): Promise<DevicePairingStateFile> {
154154
return state;
155155
}
156156

157-
async function persistState(state: DevicePairingStateFile, baseDir?: string) {
157+
type DevicePairingPersistTarget = "pending" | "paired" | "both";
158+
159+
async function persistState(
160+
state: DevicePairingStateFile,
161+
baseDir: string | undefined,
162+
target: DevicePairingPersistTarget,
163+
) {
158164
const { pendingPath, pairedPath } = resolvePairingPaths(baseDir, "devices");
165+
if (target === "pending") {
166+
await writeJsonAtomic(pendingPath, state.pendingById);
167+
return;
168+
}
169+
if (target === "paired") {
170+
await writeJsonAtomic(pairedPath, state.pairedByDeviceId);
171+
return;
172+
}
159173
await Promise.all([
160174
writeJsonAtomic(pendingPath, state.pendingById),
161175
writeJsonAtomic(pairedPath, state.pairedByDeviceId),
@@ -526,7 +540,7 @@ export async function requestDevicePairing(
526540
},
527541
});
528542
},
529-
persist: async () => await persistState(state, baseDir),
543+
persist: async () => await persistState(state, baseDir, "pending"),
530544
});
531545
});
532546
}
@@ -636,7 +650,7 @@ export async function approveDevicePairing(
636650
};
637651
delete state.pendingById[requestId];
638652
state.pairedByDeviceId[device.deviceId] = device;
639-
await persistState(state, baseDir);
653+
await persistState(state, baseDir, "both");
640654
return { status: "approved", requestId, device };
641655
});
642656
}
@@ -723,7 +737,7 @@ export async function approveBootstrapDevicePairing(
723737
};
724738
delete state.pendingById[requestId];
725739
state.pairedByDeviceId[device.deviceId] = device;
726-
await persistState(state, baseDir);
740+
await persistState(state, baseDir, "both");
727741
return { status: "approved", requestId, device };
728742
});
729743
}
@@ -741,7 +755,7 @@ export async function rejectDevicePairing(
741755
requestId,
742756
idKey: "deviceId",
743757
loadState: () => loadState(baseDir),
744-
persistState: (state) => persistState(state, baseDir),
758+
persistState: (state) => persistState(state, baseDir, "pending"),
745759
getId: (pending: DevicePairingPendingRequest) => pending.deviceId,
746760
});
747761
});
@@ -763,7 +777,7 @@ export async function removePairedDevice(
763777
delete state.pendingById[requestId];
764778
}
765779
}
766-
await persistState(state, baseDir);
780+
await persistState(state, baseDir, "both");
767781
return { deviceId: normalized };
768782
});
769783
}
@@ -794,7 +808,7 @@ export async function updatePairedDeviceMetadata(
794808
next.remoteIp = patch.remoteIp;
795809
}
796810
state.pairedByDeviceId[normalizedDeviceId] = next;
797-
await persistState(state, baseDir);
811+
await persistState(state, baseDir, "paired");
798812
});
799813
}
800814

@@ -862,7 +876,7 @@ export async function verifyDeviceToken(params: {
862876
device.tokens ??= {};
863877
device.tokens[role] = entry;
864878
state.pairedByDeviceId[device.deviceId] = device;
865-
await persistState(state, params.baseDir);
879+
await persistState(state, params.baseDir, "paired");
866880
return { ok: true };
867881
});
868882
}
@@ -919,7 +933,7 @@ export async function ensureDeviceToken(params: {
919933
tokens[role] = next;
920934
device.tokens = tokens;
921935
state.pairedByDeviceId[device.deviceId] = device;
922-
await persistState(state, params.baseDir);
936+
await persistState(state, params.baseDir, "paired");
923937
return next;
924938
});
925939
}
@@ -996,7 +1010,7 @@ export async function rotateDeviceToken(params: {
9961010
tokens[role] = next;
9971011
device.tokens = tokens;
9981012
state.pairedByDeviceId[device.deviceId] = device;
999-
await persistState(state, params.baseDir);
1013+
await persistState(state, params.baseDir, "paired");
10001014
return { ok: true, entry: next };
10011015
});
10021016
}
@@ -1024,7 +1038,7 @@ export async function revokeDeviceToken(params: {
10241038
tokens[role] = entry;
10251039
device.tokens = tokens;
10261040
state.pairedByDeviceId[device.deviceId] = device;
1027-
await persistState(state, params.baseDir);
1041+
await persistState(state, params.baseDir, "paired");
10281042
return entry;
10291043
});
10301044
}
@@ -1037,7 +1051,7 @@ export async function clearDevicePairing(deviceId: string, baseDir?: string): Pr
10371051
return false;
10381052
}
10391053
delete state.pairedByDeviceId[normalizedId];
1040-
await persistState(state, baseDir);
1054+
await persistState(state, baseDir, "paired");
10411055
return true;
10421056
});
10431057
}

0 commit comments

Comments
 (0)