Skip to content

Commit 90b7862

Browse files
committed
feat: add 'from' property to EventStagingStore and update event handling logic
1 parent 22ba93f commit 90b7862

File tree

4 files changed

+16
-3
lines changed

4 files changed

+16
-3
lines changed

packages/core/src/models/event.model.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export interface EventStore<E = Pdu> extends PersistentEventBase<E> {
3939

4040
export interface EventStagingStore extends PersistentEventBase {
4141
roomId: string;
42+
from: 'join' | 'transaction';
4243
}
4344

4445
export interface FetchedEvents {

packages/federation-sdk/src/repositories/event-staging.repository.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export class EventStagingRepository {
1717
eventId: EventID,
1818
origin: string,
1919
event: Pdu,
20+
from: 'join' | 'transaction' = 'transaction',
2021
): Promise<UpdateResult> {
2122
// We use an upsert here to handle the case where we see the same event
2223
// from the same server multiple times.
@@ -32,6 +33,7 @@ export class EventStagingRepository {
3233
},
3334
$set: {
3435
event,
36+
from,
3537
},
3638
},
3739
{

packages/federation-sdk/src/services/room.service.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import { EventEmitterService } from './event-emitter.service';
4040
import { EventFetcherService } from './event-fetcher.service';
4141
import { InviteService } from './invite.service';
4242
import { StateService, UnknownRoomError } from './state.service';
43+
import { EventStagingRepository } from '../repositories/event-staging.repository';
4344

4445
@singleton()
4546
export class RoomService {
@@ -54,6 +55,7 @@ export class RoomService {
5455
private readonly inviteService: InviteService,
5556
private readonly eventEmitterService: EventEmitterService,
5657
private readonly eventFetcherService: EventFetcherService,
58+
private readonly eventStagingRepository: EventStagingRepository,
5759
) {}
5860

5961
private validatePowerLevelChange(
@@ -929,6 +931,12 @@ export class RoomService {
929931
'processing state at event',
930932
);
931933
await stateService._resolveStateAtEvent(missingEvent);
934+
void this.eventStagingRepository.create(
935+
missingEvent.eventId,
936+
residentServer,
937+
missingEvent.event,
938+
'join',
939+
);
932940
}
933941

934942
// if partial, join event will also be partial
@@ -979,9 +987,9 @@ export class RoomService {
979987
});
980988

981989
// try to persist the join event now, should succeed with state in place
982-
await this.eventService.processIncomingPDUs(
990+
void this.eventService.processIncomingPDUs(
983991
residentServer || joinEventFinal.origin,
984-
[joinEventFinal.event],
992+
[...state, joinEventFinal.event],
985993
);
986994

987995
return joinEventFinal.eventId;

packages/federation-sdk/src/services/staging-area.service.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,9 @@ export class StagingAreaService {
8484

8585
try {
8686
await this.processDependencyStage(event);
87-
await this.processAuthorizationStage(event);
87+
if ('from' in event && event.from !== 'join') {
88+
await this.processAuthorizationStage(event);
89+
}
8890
await this.stateService.handlePdu(await toEventBase(event.event));
8991
await this.processNotificationStage(event);
9092

0 commit comments

Comments
 (0)