Example #1
0
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
}