feat(federation): deleted flag on wire profile snapshots — tombstone markers never leave the instance (dead-incarnation spec §3.3)

This commit is contained in:
Jannis Braun
2026-07-03 00:59:37 +02:00
parent 5ffc7c565e
commit 3591773a4c
7 changed files with 240 additions and 26 deletions
@@ -131,4 +131,21 @@ describe('resolveOrCreateReplicatedUser — self-homed identity guard', () => {
expect(result).not.toBeNull();
expect(result!.username).toBe('bob@orbit.ddns.net');
});
it('refuses stub creation when the wire snapshot marks the identity deleted', async () => {
const { resolveOrCreateReplicatedUser } = await import('./federation.js');
const result = resolveOrCreateReplicatedUser('remote-del', 'orbit.ddns.net', testDb, { username: null, deleted: true });
expect(result).toBeNull();
expect(testDb.select().from(schema.users).all()).toHaveLength(0);
});
it('a deleted-marked identity that already resolves locally still returns the existing row', async () => {
testDb.insert(schema.users).values({
id: 'stub-1', username: 'old@orbit.ddns.net', passwordHash: '!federation-replicated',
homeInstance: 'orbit.ddns.net', homeUserId: 'remote-del', createdAt: 1,
}).run();
const { resolveOrCreateReplicatedUser } = await import('./federation.js');
const result = resolveOrCreateReplicatedUser('remote-del', 'orbit.ddns.net', testDb, { deleted: true });
expect(result?.id).toBe('stub-1'); // historical attribution stays intact
});
});