MCPcopy Create free account
hub / github.com/daodst/chat / QueryStateAndAuthChain

Method QueryStateAndAuthChain

roomserver/internal/query/query.go:423–491  ·  view source on GitHub ↗

QueryStateAndAuthChain implements api.RoomserverInternalAPI

(
	ctx context.Context,
	request *api.QueryStateAndAuthChainRequest,
	response *api.QueryStateAndAuthChainResponse,
)

Source from the content-addressed store, hash-verified

421
422// QueryStateAndAuthChain implements api.RoomserverInternalAPI
423func (r *Queryer) QueryStateAndAuthChain(
424 ctx context.Context,
425 request *api.QueryStateAndAuthChainRequest,
426 response *api.QueryStateAndAuthChainResponse,
427) error {
428 info, err := r.DB.RoomInfo(ctx, request.RoomID)
429 if err != nil {
430 return err
431 }
432 if info == nil || info.IsStub() {
433 return nil
434 }
435 response.RoomExists = true
436 response.RoomVersion = info.RoomVersion
437
438 // handle this entirely separately to the other case so we don't have to pull out
439 // the entire current state of the room
440 // TODO: this probably means it should be a different query operation...
441 if request.OnlyFetchAuthChain {
442 var authEvents []*gomatrixserverlib.Event
443 authEvents, err = GetAuthChain(ctx, r.DB.EventsFromIDs, request.AuthEventIDs)
444 if err != nil {
445 return err
446 }
447 for _, event := range authEvents {
448 response.AuthChainEvents = append(response.AuthChainEvents, event.Headered(info.RoomVersion))
449 }
450 return nil
451 }
452
453 var stateEvents []*gomatrixserverlib.Event
454 stateEvents, rejected, err := r.loadStateAtEventIDs(ctx, info, request.PrevEventIDs)
455 if err != nil {
456 return err
457 }
458 response.IsRejected = rejected
459 response.PrevEventsExist = true
460
461 // add the auth event IDs for the current state events too
462 var authEventIDs []string
463 authEventIDs = append(authEventIDs, request.AuthEventIDs...)
464 for _, se := range stateEvents {
465 authEventIDs = append(authEventIDs, se.AuthEventIDs()...)
466 }
467 authEventIDs = util.UniqueStrings(authEventIDs) // de-dupe
468
469 authEvents, err := GetAuthChain(ctx, r.DB.EventsFromIDs, authEventIDs)
470 if err != nil {
471 return err
472 }
473
474 if request.ResolveState {
475 if stateEvents, err = gomatrixserverlib.ResolveConflicts(
476 info.RoomVersion, stateEvents, authEvents,
477 ); err != nil {
478 return err
479 }
480 }

Callers

nothing calls this directly

Calls 4

loadStateAtEventIDsMethod · 0.95
GetAuthChainFunction · 0.85
IsStubMethod · 0.80
RoomInfoMethod · 0.65

Tested by

no test coverage detected