func newSession( ctx scope.Context, server *Server, conn *websocket.Conn, clientAddr string, room proto.Room, client *proto.Client, agentKey *security.ManagedKey) *session { nextID := atomic.AddUint64(&sessionIDCounter, 1) sessionCount.WithLabelValues(room.ID()).Set(float64(nextID)) sessionID := fmt.Sprintf("%x-%08x", client.Agent.IDString(), nextID) ctx = logging.LoggingContext(ctx, os.Stdout, fmt.Sprintf("[%s] ", sessionID)) session := &session{ id: sessionID, ctx: ctx, server: server, conn: conn, clientAddr: clientAddr, vClientAddr: clientAddr, identity: newMemIdentity(client.UserID(), server.ID, server.Era), client: client, agentKey: agentKey, serverID: server.ID, serverEra: server.Era, roomName: room.ID(), room: room, backend: server.b, kms: server.kms, heim: server.heim, incoming: make(chan *proto.Packet), outgoing: make(chan *proto.Packet, 100), floodLimiter: ratelimit.NewBucketWithQuantum(time.Second, 50, 10), } if managedRoom, ok := room.(proto.ManagedRoom); ok { session.managedRoom = managedRoom } return session }