Loading CHANGELOG.md +1 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ The format is based on [keep a changelog](http://keepachangelog.com) and this pr ### Changed - Set JS runtime custom error message as the returned payload message in RPC requests. - JS runtime match data changed to Uint8Array. - Named match creation now returns existing presences if the name mapped to an existing match. ## [3.9.0] - 2021-10-29 ### Added Loading server/pipeline_match.go +30 −9 Original line number Diff line number Diff line Loading @@ -35,8 +35,9 @@ type matchDataFilter struct { } func (p *Pipeline) matchCreate(logger *zap.Logger, session Session, envelope *rtapi.Envelope) { name := envelope.GetMatchCreate().Name var matchID uuid.UUID if name := envelope.GetMatchCreate().Name; name != "" { if name != "" { // Match being created with a name. Use it to derive a match ID. matchID = uuid.NewV5(uuid.NamespaceDNS, name) } else { Loading @@ -44,25 +45,45 @@ func (p *Pipeline) matchCreate(logger *zap.Logger, session Session, envelope *rt matchID = uuid.Must(uuid.NewV4()) } userID := session.UserID() sessionID := session.ID() username := session.Username() stream := PresenceStream{Mode: StreamModeMatchRelayed, Subject: matchID} if success, _ := p.tracker.Track(session.Context(), session.ID(), PresenceStream{Mode: StreamModeMatchRelayed, Subject: matchID}, session.UserID(), PresenceMeta{ Username: username, Format: session.Format(), }, false); !success { success, isNew := p.tracker.Track(session.Context(), sessionID, stream, userID, PresenceMeta{Username: username, Format: session.Format()}, false) if !success { // Presence creation was rejected due to `allowIfFirstForSession` flag, session is gone so no need to reply. return } var size int32 = 1 var userPresences []*rtapi.UserPresence if name != "" { presences := p.tracker.ListByStream(stream, false, true) size = int32(len(presences)) userPresences = make([]*rtapi.UserPresence, 0, len(presences)) for _, presence := range presences { if isNew && presence.UserID == userID && presence.ID.SessionID == sessionID { continue } userPresences = append(userPresences, &rtapi.UserPresence{ UserId: presence.GetUserId(), SessionId: presence.GetSessionId(), Username: presence.GetUsername(), }) } } session.Send(&rtapi.Envelope{Cid: envelope.Cid, Message: &rtapi.Envelope_Match{Match: &rtapi.Match{ MatchId: fmt.Sprintf("%v.", matchID.String()), Authoritative: false, // No label. Size: 1, // No presences. Size: size, Presences: userPresences, Self: &rtapi.UserPresence{ UserId: session.UserID().String(), SessionId: session.ID().String(), UserId: userID.String(), SessionId: sessionID.String(), Username: username, }, }}}, true) Loading Loading
CHANGELOG.md +1 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ The format is based on [keep a changelog](http://keepachangelog.com) and this pr ### Changed - Set JS runtime custom error message as the returned payload message in RPC requests. - JS runtime match data changed to Uint8Array. - Named match creation now returns existing presences if the name mapped to an existing match. ## [3.9.0] - 2021-10-29 ### Added Loading
server/pipeline_match.go +30 −9 Original line number Diff line number Diff line Loading @@ -35,8 +35,9 @@ type matchDataFilter struct { } func (p *Pipeline) matchCreate(logger *zap.Logger, session Session, envelope *rtapi.Envelope) { name := envelope.GetMatchCreate().Name var matchID uuid.UUID if name := envelope.GetMatchCreate().Name; name != "" { if name != "" { // Match being created with a name. Use it to derive a match ID. matchID = uuid.NewV5(uuid.NamespaceDNS, name) } else { Loading @@ -44,25 +45,45 @@ func (p *Pipeline) matchCreate(logger *zap.Logger, session Session, envelope *rt matchID = uuid.Must(uuid.NewV4()) } userID := session.UserID() sessionID := session.ID() username := session.Username() stream := PresenceStream{Mode: StreamModeMatchRelayed, Subject: matchID} if success, _ := p.tracker.Track(session.Context(), session.ID(), PresenceStream{Mode: StreamModeMatchRelayed, Subject: matchID}, session.UserID(), PresenceMeta{ Username: username, Format: session.Format(), }, false); !success { success, isNew := p.tracker.Track(session.Context(), sessionID, stream, userID, PresenceMeta{Username: username, Format: session.Format()}, false) if !success { // Presence creation was rejected due to `allowIfFirstForSession` flag, session is gone so no need to reply. return } var size int32 = 1 var userPresences []*rtapi.UserPresence if name != "" { presences := p.tracker.ListByStream(stream, false, true) size = int32(len(presences)) userPresences = make([]*rtapi.UserPresence, 0, len(presences)) for _, presence := range presences { if isNew && presence.UserID == userID && presence.ID.SessionID == sessionID { continue } userPresences = append(userPresences, &rtapi.UserPresence{ UserId: presence.GetUserId(), SessionId: presence.GetSessionId(), Username: presence.GetUsername(), }) } } session.Send(&rtapi.Envelope{Cid: envelope.Cid, Message: &rtapi.Envelope_Match{Match: &rtapi.Match{ MatchId: fmt.Sprintf("%v.", matchID.String()), Authoritative: false, // No label. Size: 1, // No presences. Size: size, Presences: userPresences, Self: &rtapi.UserPresence{ UserId: session.UserID().String(), SessionId: session.ID().String(), UserId: userID.String(), SessionId: sessionID.String(), Username: username, }, }}}, true) Loading