All files / packages/mutations/src/cache/peers get-foreign.ts

76.92% Statements 30/39
20% Branches 2/10
84.21% Functions 16/19
76.31% Lines 29/38

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108                                                193x 6x 6x 6x 6x 6x         193x 6x                   193x 4x 4x     4x     4x 4x     193x     193x 1x       1x               193x 1x 1x   1x 1x       193x       9x 9x           5x           4x 4x              
import type { ForeignPeer } from "~app/trpc-types";
import type { PeerId } from "~db/ids";
 
import type {
	ControllerContext,
	ControllerWith,
	SnapshotFn,
	UpdateFn,
} from "../../types";
import {
	applyUpdateFnWithRevert,
	applyWithRevert,
	getAllInputs,
	getUpdatedData,
	withRef,
} from "../utils";
 
type Controller = ControllerWith<{
	procedure: ControllerContext["trpc"]["peers"]["getForeign"];
}>;
 
type OwnPeer = Exclude<ForeignPeer, { remoteId: string }>;
 
const update =
	({ queryClient, procedure }: Controller, peerId: PeerId) =>
	(updater: UpdateFn<ForeignPeer>) =>
		withRef<ForeignPeer | undefined>((ref) => {
			queryClient.setQueryData(procedure.queryKey({ id: peerId }), (peer) => {
				ref.current = peer;
				return getUpdatedData(peer, updater);
			});
		}).current;
 
const updateOwn =
	(controller: Controller, peerId: PeerId) => (updater: UpdateFn<OwnPeer>) =>
		update(
			controller,
			peerId,
		)((peer) => {
			if ("remoteId" in peer) {
				return peer;
			}
			return updater(peer);
		}) as OwnPeer | undefined;
 
const removeOwn = ({ queryClient, procedure }: Controller, peerId: PeerId) =>
	withRef<OwnPeer | undefined>((ref) => {
		const currentPeer = queryClient.getQueryData(
			procedure.queryKey({ id: peerId }),
		);
		Iif (currentPeer && "remoteId" in currentPeer) {
			return;
		}
		ref.current = currentPeer;
		void queryClient.invalidateQueries(procedure.queryFilter({ id: peerId }));
	}).current;
 
const addOwn = ({ queryClient, procedure }: Controller, peer: OwnPeer) =>
	queryClient.setQueryData(procedure.queryKey({ id: peer.id }), peer);
 
const invalidateForeign = ({ queryClient, procedure }: Controller) => {
	const inputs = getAllInputs<"peers.getForeign">(
		queryClient,
		procedure.queryKey(),
	);
	for (const input of inputs) {
		const currentPeer = queryClient.getQueryData(procedure.queryKey(input));
		if (!currentPeer || !("publicName" in currentPeer)) {
			void queryClient.invalidateQueries(procedure.queryFilter(input));
		}
	}
};
 
export const getController = ({ queryClient, trpc }: ControllerContext) => {
	const controller = { queryClient, procedure: trpc.peers.getForeign };
	return {
		updateOwn: (peerId: PeerId, updater: UpdateFn<OwnPeer>) =>
			updateOwn(controller, peerId)(updater),
		invalidateForeign: () => invalidateForeign(controller),
	};
};
 
export const getRevertController = ({
	queryClient,
	trpc,
}: ControllerContext) => {
	const controller = { queryClient, procedure: trpc.peers.getForeign };
	return {
		updateOwn: (
			peerId: PeerId,
			updater: UpdateFn<OwnPeer>,
			revertUpdater: SnapshotFn<OwnPeer>,
		) =>
			applyUpdateFnWithRevert(
				updateOwn(controller, peerId),
				updater,
				revertUpdater,
			),
		removeOwn: (peerId: PeerId) =>
			applyWithRevert(
				() => removeOwn(controller, peerId),
				(snapshot) => {
					addOwn(controller, snapshot);
				},
			),
	};
};