@@ -34,6 +34,24 @@ type Event struct {
3434 Redacts string
3535}
3636
37+ // ServerRoomOpt are options that can configure ServerRooms
38+ type ServerRoomOpt func (r * ServerRoom )
39+
40+ // WithRoomID configures the room to have the given room ID
41+ func WithRoomID (roomID string ) ServerRoomOpt {
42+ return func (r * ServerRoom ) {
43+ r .RoomID = roomID
44+ }
45+ }
46+
47+ // WithImpl configures the room to have the given ServerRoomImpl.
48+ // Useful for custom rooms.
49+ func WithImpl (impl ServerRoomImpl ) ServerRoomOpt {
50+ return func (r * ServerRoom ) {
51+ r .ServerRoomImpl = impl
52+ }
53+ }
54+
3755// EXPERIMENTAL
3856// ServerRoom represents a room on this test federation server
3957type ServerRoom struct {
@@ -67,7 +85,7 @@ func NewServerRoom(roomVer gomatrixserverlib.RoomVersion, roomId string) *Server
6785 waiters : make (map [string ][]* helpers.Waiter ),
6886 waitersMu : & sync.Mutex {},
6987 }
70- room .ServerRoomImpl = & ServerRoomImplDefault {Room : room }
88+ room .ServerRoomImpl = & ServerRoomImplDefault {}
7189 return room
7290}
7391
@@ -354,58 +372,56 @@ type ServerRoomImpl interface {
354372 // ProtoEventCreator converts a Complement Event into a gomatrixserverlib proto event, ready to be signed.
355373 // This function is used in /make_x endpoints to create proto events to return to other servers.
356374 // This function is one of two used when creating events, the other being EventCreator.
357- ProtoEventCreator (ev Event ) (* gomatrixserverlib.ProtoEvent , error )
375+ ProtoEventCreator (room * ServerRoom , ev Event ) (* gomatrixserverlib.ProtoEvent , error )
358376 // EventCreator converts a proto event into a signed PDU.
359- EventCreator (s * Server , proto * gomatrixserverlib.ProtoEvent ) (gomatrixserverlib.PDU , error )
377+ EventCreator (room * ServerRoom , s * Server , proto * gomatrixserverlib.ProtoEvent ) (gomatrixserverlib.PDU , error )
360378 // PopulateFromSendJoinResponse should replace the state of this ServerRoom with the information contained
361379 // in RespSendJoin and the join event.
362- PopulateFromSendJoinResponse (joinEvent gomatrixserverlib.PDU , resp fclient.RespSendJoin )
380+ PopulateFromSendJoinResponse (room * ServerRoom , joinEvent gomatrixserverlib.PDU , resp fclient.RespSendJoin )
363381 // GenerateSendJoinResponse generates a /send_join response to send back to a server.
364- GenerateSendJoinResponse (s * Server , joinEvent gomatrixserverlib.PDU , expectPartialState , omitServersInRoom bool ) fclient.RespSendJoin
382+ GenerateSendJoinResponse (room * ServerRoom , s * Server , joinEvent gomatrixserverlib.PDU , expectPartialState , omitServersInRoom bool ) fclient.RespSendJoin
365383}
366384
367385type ServerRoomImplCustom struct {
368386 ServerRoomImplDefault
369- ProtoEventCreatorFn func (def ServerRoomImpl , ev Event ) (* gomatrixserverlib.ProtoEvent , error )
370- EventCreatorFn func (def ServerRoomImpl , s * Server , proto * gomatrixserverlib.ProtoEvent ) (gomatrixserverlib.PDU , error )
371- PopulateFromSendJoinResponseFn func (def ServerRoomImpl , joinEvent gomatrixserverlib.PDU , resp fclient.RespSendJoin )
372- GenerateSendJoinResponseFn func (def ServerRoomImpl , s * Server , joinEvent gomatrixserverlib.PDU , expectPartialState , omitServersInRoom bool ) fclient.RespSendJoin
387+ ProtoEventCreatorFn func (def ServerRoomImpl , room * ServerRoom , ev Event ) (* gomatrixserverlib.ProtoEvent , error )
388+ EventCreatorFn func (def ServerRoomImpl , room * ServerRoom , s * Server , proto * gomatrixserverlib.ProtoEvent ) (gomatrixserverlib.PDU , error )
389+ PopulateFromSendJoinResponseFn func (def ServerRoomImpl , room * ServerRoom , joinEvent gomatrixserverlib.PDU , resp fclient.RespSendJoin )
390+ GenerateSendJoinResponseFn func (def ServerRoomImpl , room * ServerRoom , s * Server , joinEvent gomatrixserverlib.PDU , expectPartialState , omitServersInRoom bool ) fclient.RespSendJoin
373391}
374392
375- func (i * ServerRoomImplCustom ) ProtoEventCreator (ev Event ) (* gomatrixserverlib.ProtoEvent , error ) {
393+ func (i * ServerRoomImplCustom ) ProtoEventCreator (room * ServerRoom , ev Event ) (* gomatrixserverlib.ProtoEvent , error ) {
376394 if i .ProtoEventCreatorFn != nil {
377- return i .ProtoEventCreatorFn (& i .ServerRoomImplDefault , ev )
395+ return i .ProtoEventCreatorFn (& i .ServerRoomImplDefault , room , ev )
378396 }
379- return i .ServerRoomImplDefault .ProtoEventCreator (ev )
397+ return i .ServerRoomImplDefault .ProtoEventCreator (room , ev )
380398}
381399
382- func (i * ServerRoomImplCustom ) EventCreator (s * Server , proto * gomatrixserverlib.ProtoEvent ) (gomatrixserverlib.PDU , error ) {
400+ func (i * ServerRoomImplCustom ) EventCreator (room * ServerRoom , s * Server , proto * gomatrixserverlib.ProtoEvent ) (gomatrixserverlib.PDU , error ) {
383401 if i .EventCreatorFn != nil {
384- return i .EventCreatorFn (& i .ServerRoomImplDefault , s , proto )
402+ return i .EventCreatorFn (& i .ServerRoomImplDefault , room , s , proto )
385403 }
386- return i .ServerRoomImplDefault .EventCreator (s , proto )
404+ return i .ServerRoomImplDefault .EventCreator (room , s , proto )
387405}
388406
389- func (i * ServerRoomImplCustom ) PopulateFromSendJoinResponse (joinEvent gomatrixserverlib.PDU , resp fclient.RespSendJoin ) {
407+ func (i * ServerRoomImplCustom ) PopulateFromSendJoinResponse (room * ServerRoom , joinEvent gomatrixserverlib.PDU , resp fclient.RespSendJoin ) {
390408 if i .PopulateFromSendJoinResponseFn != nil {
391- i .PopulateFromSendJoinResponseFn (& i .ServerRoomImplDefault , joinEvent , resp )
409+ i .PopulateFromSendJoinResponseFn (& i .ServerRoomImplDefault , room , joinEvent , resp )
392410 return
393411 }
394- i .ServerRoomImplDefault .PopulateFromSendJoinResponse (joinEvent , resp )
412+ i .ServerRoomImplDefault .PopulateFromSendJoinResponse (room , joinEvent , resp )
395413}
396414
397- func (i * ServerRoomImplCustom ) GenerateSendJoinResponse (s * Server , joinEvent gomatrixserverlib.PDU , expectPartialState , omitServersInRoom bool ) fclient.RespSendJoin {
415+ func (i * ServerRoomImplCustom ) GenerateSendJoinResponse (room * ServerRoom , s * Server , joinEvent gomatrixserverlib.PDU , expectPartialState , omitServersInRoom bool ) fclient.RespSendJoin {
398416 if i .GenerateSendJoinResponseFn != nil {
399- return i .GenerateSendJoinResponseFn (& i .ServerRoomImplDefault , s , joinEvent , expectPartialState , omitServersInRoom )
417+ return i .GenerateSendJoinResponseFn (& i .ServerRoomImplDefault , room , s , joinEvent , expectPartialState , omitServersInRoom )
400418 }
401- return i .ServerRoomImplDefault .GenerateSendJoinResponse (s , joinEvent , expectPartialState , omitServersInRoom )
419+ return i .ServerRoomImplDefault .GenerateSendJoinResponse (room , s , joinEvent , expectPartialState , omitServersInRoom )
402420}
403421
404- type ServerRoomImplDefault struct {
405- Room * ServerRoom
406- }
422+ type ServerRoomImplDefault struct {}
407423
408- func (i * ServerRoomImplDefault ) ProtoEventCreator (ev Event ) (* gomatrixserverlib.ProtoEvent , error ) {
424+ func (i * ServerRoomImplDefault ) ProtoEventCreator (room * ServerRoom , ev Event ) (* gomatrixserverlib.ProtoEvent , error ) {
409425 var prevEvents interface {}
410426 if ev .PrevEvents != nil {
411427 // We deliberately want to set the prev events.
@@ -414,14 +430,14 @@ func (i *ServerRoomImplDefault) ProtoEventCreator(ev Event) (*gomatrixserverlib.
414430 // No other prev events were supplied so we'll just
415431 // use the forward extremities of the room, which is
416432 // the usual behaviour.
417- prevEvents = i . Room .ForwardExtremities
433+ prevEvents = room .ForwardExtremities
418434 }
419435 proto := gomatrixserverlib.ProtoEvent {
420436 SenderID : ev .Sender ,
421- Depth : int64 (i . Room .Depth + 1 ), // depth starts at 1
437+ Depth : int64 (room .Depth + 1 ), // depth starts at 1
422438 Type : ev .Type ,
423439 StateKey : ev .StateKey ,
424- RoomID : i . Room .RoomID ,
440+ RoomID : room .RoomID ,
425441 PrevEvents : prevEvents ,
426442 AuthEvents : ev .AuthEvents ,
427443 Redacts : ev .Redacts ,
@@ -438,13 +454,13 @@ func (i *ServerRoomImplDefault) ProtoEventCreator(ev Event) (*gomatrixserverlib.
438454 if err != nil {
439455 return nil , fmt .Errorf ("EventCreator: failed to work out auth_events : %s" , err )
440456 }
441- proto .AuthEvents = i . Room .AuthEvents (stateNeeded )
457+ proto .AuthEvents = room .AuthEvents (stateNeeded )
442458 }
443459 return & proto , nil
444460}
445461
446- func (i * ServerRoomImplDefault ) EventCreator (s * Server , proto * gomatrixserverlib.ProtoEvent ) (gomatrixserverlib.PDU , error ) {
447- verImpl , err := gomatrixserverlib .GetRoomVersion (i . Room .Version )
462+ func (i * ServerRoomImplDefault ) EventCreator (room * ServerRoom , s * Server , proto * gomatrixserverlib.ProtoEvent ) (gomatrixserverlib.PDU , error ) {
463+ verImpl , err := gomatrixserverlib .GetRoomVersion (room .Version )
448464 if err != nil {
449465 return nil , fmt .Errorf ("EventCreator: invalid room version: %s" , err )
450466 }
@@ -456,19 +472,19 @@ func (i *ServerRoomImplDefault) EventCreator(s *Server, proto *gomatrixserverlib
456472 return signedEvent , nil
457473}
458474
459- func (i * ServerRoomImplDefault ) PopulateFromSendJoinResponse (joinEvent gomatrixserverlib.PDU , resp fclient.RespSendJoin ) {
460- stateEvents := resp .StateEvents .UntrustedEvents (i . Room .Version )
475+ func (i * ServerRoomImplDefault ) PopulateFromSendJoinResponse (room * ServerRoom , joinEvent gomatrixserverlib.PDU , resp fclient.RespSendJoin ) {
476+ stateEvents := resp .StateEvents .UntrustedEvents (room .Version )
461477 for _ , ev := range stateEvents {
462- i . Room .ReplaceCurrentState (ev )
478+ room .ReplaceCurrentState (ev )
463479 }
464- i . Room .AddEvent (joinEvent )
480+ room .AddEvent (joinEvent )
465481}
466482
467- func (i * ServerRoomImplDefault ) GenerateSendJoinResponse (s * Server , joinEvent gomatrixserverlib.PDU , expectPartialState , omitServersInRoom bool ) fclient.RespSendJoin {
483+ func (i * ServerRoomImplDefault ) GenerateSendJoinResponse (room * ServerRoom , s * Server , joinEvent gomatrixserverlib.PDU , expectPartialState , omitServersInRoom bool ) fclient.RespSendJoin {
468484 // build the state list *before* we insert the new event
469485 var stateEvents []gomatrixserverlib.PDU
470- i . Room .StateMutex .RLock ()
471- for _ , ev := range i . Room .State {
486+ room .StateMutex .RLock ()
487+ for _ , ev := range room .State {
472488 // filter out non-critical memberships if this is a partial-state join
473489 if expectPartialState {
474490 if ev .Type () == "m.room.member" && ev .StateKey () != joinEvent .StateKey () {
@@ -477,18 +493,18 @@ func (i *ServerRoomImplDefault) GenerateSendJoinResponse(s *Server, joinEvent go
477493 }
478494 stateEvents = append (stateEvents , ev )
479495 }
480- i . Room .StateMutex .RUnlock ()
496+ room .StateMutex .RUnlock ()
481497
482- authEvents := i . Room .AuthChainForEvents (stateEvents )
498+ authEvents := room .AuthChainForEvents (stateEvents )
483499
484500 // get servers in room *before* the join event
485501 serversInRoom := []string {s .serverName }
486502 if ! omitServersInRoom {
487- serversInRoom = i . Room .ServersInRoom ()
503+ serversInRoom = room .ServersInRoom ()
488504 }
489505
490506 // insert the join event into the room state
491- i . Room .AddEvent (joinEvent )
507+ room .AddEvent (joinEvent )
492508 log .Printf ("Received send-join of event %s" , joinEvent .EventID ())
493509
494510 // return state and auth chain
0 commit comments