public override Task <MigrateInResponse> MigrateIn(MigrateInRequest request, ServerCallContext context)
    {
        if (!tokenCache.TryGetValue(request.Token, out TokenEntry data))
        {
            throw new RpcException(new Status(StatusCode.Unauthenticated, "Invalid token"));
        }
        if (data.AccountId != request.AccountId)
        {
            throw new RpcException(new Status(StatusCode.PermissionDenied, "Invalid token for account"));
        }

        tokenCache.Remove(request.Token);
        return(Task.FromResult(new MigrateInResponse {
            CharacterId = data.CharacterId
        }));
    }
    public override void Handle(T session, IByteReader packet)
    {
        session.AccountId = packet.ReadLong();
        ulong token = packet.Read <ulong>();

        logger.LogInformation("LOGIN USER TO GAME: {AccountId}", session.AccountId);

        var request = new MigrateInRequest {
            AccountId = session.AccountId,
            Token     = token,
        };
        var response = worldClient.MigrateIn(request);

        session.CharacterId = response.CharacterId;

        session.Send(Packet.Of(SendOp.REQUEST_SYSTEM_INFO));
        ByteWriter moveResultPacket = Packet.Of(SendOp.MOVE_RESULT);

        moveResultPacket.WriteByte();
        session.Send(moveResultPacket);
    }