Есть ли способ сохранить службу LG WebOS?

Я пытаюсь создать JS-сервис в WebOS 3.0 следует официальной документации.

Я могу отправлять данные между службой JS и моим приложением, но иногда служба JS не отвечает на запрос, если она простаивает около 20 секунд. Я также пытался увеличить время ожидания за это. К сожалению, похоже, он не работает.

Вот мой код

Сторона приложения

const request = webOS.service.request('luna://com.myapp.service', {
        method : 'fetch',
        parameters : { url, method, headers, body },
        onFailure : (err) => {
          reject(err)
        },
        onSuccess : (s) => {
          console.log('request success', s)
        },
        onComplete : (resp) => {
          const isSuccess = resp.data.status >= 200 && resp.data.status < 400
          var payload = {
            json : () => Promise.resolve(JSON.parse(resp.data.body)),
            ok : isSuccess,
            headers : resp.data.headers,
            status : resp.data.status,
            error : isSuccess
              ? null
              : resp.data.body
          }
          resolve(payload)
        }
      })
    })

Сервисная сторона

var Service = require('webos-service')
var service = new Service('com.myapp.service')

service.register('fetch', function(message) {
var payload = message.payload
  if(!payload) {
    message.respond({
      returnValue : true,
      error : 'Message does not have a `payload`'
    })
    return
  }
  var url = payload.url,
      headers = payload.headers,
      method = payload.method,
      body = payload.body
  var request = http.request({
    method : method,
    hostname : URL.parse(url).hostname,
    path : URL.parse(url).path,
    headers : headers,
  }, function(res) {
    var data = ''
    res.on('data', function(chunk) { data+=chunk })
    res.on('end', function() {
      message.respond({
        returnValue : true,
        data : {
          status : res.statusCode,
          statusText : res.statusMessage,
          headers : res.headers,
          body : data,
        }
      })
    })
  })
  request.on('error', function(err) {
    console.log(err)
    message.respond({
      returnValue : true,
      error : err
    })
  })
  request.end()
})

person Xeijp    schedule 11.09.2017    source источник
comment
Есть ли ошибки на стороне сервиса? Его отключают из-за того, что он слишком долго работает? Запрос занимает больше 5 секунд или около того? Мне сложно разобрать этот код, но я не вижу ничего очевидного.   -  person Eric Blade    schedule 31.08.2018


Ответы (1)


Недавно я написал приложение JavaScript для LG Smart-TV и настоятельно рекомендую использовать socket.io для связи между клиентом и сервером. Сначала немного сложно заставить его работать, но работает безупречно.

Вот как выглядит подключение...

    var socket = io("http://10.27.101.95");
    idUser = getCookie("idUser");   // Retrieved from device and set to cookie.

// ┌────────────────────────────────────────────────────────────────┐
// │   Socket.io: Connect/Emit                                      │

    socket.on('connect', function() {
        socket.emit("addUser", {
            "idUser": idUser
        });
        reconnectHideData = false;
    });

    // Hide data if server cannot be reached.
    var reconnectCount = 0;
    var reconnectHideData = false;
    socket.on('reconnect_error', function() {
        if (reconnectCount < 10 && reconnectHideData == false) {
            // console.log( '---=== Reconnect attempt: ' + reconnectCount + ' ===---' );
            setTimeout(function(){
                reconnectCount++;
            }, 3000);
        }
        if (reconnectCount == 10 && reconnectHideData == false) {
            // console.log( '-----===== Cleared Data =====-----' );
            $('.section ').addClass(' u-hide ');
            $('.greeting').addClass(' u-hide ');
            reconnectHideData = true;
            reconnectCount = 0;
        }
        else {
            return;
        }
    });

    // Necessary to trigger event to be emitted server side.
    setInterval(function(){
        socket.emit("reqData");
    }, 5000);

// └────────────────────────────────────────────────────────────────┘

После этого все дело в обработке и форматировании возвращаемых данных.

person Dustin Halstead    schedule 28.12.2017
comment
Для сообщений, отправляемых с телевизора на сервер, сокеты — единственный вариант? Разве нельзя использовать что-то вроде AJAX для отправки запроса POST на сервер? - person Nuwan Jayawardene; 19.04.2018
comment
@nuwanjaya -- Абсолютно. Длинный опрос AJAX работает достаточно легко — и если это приложение, которое будет использовать только несколько человек, то это жизнеспособный вариант (просто вообще избегайте короткого опроса). Однако веб-сокет гораздо менее требователен к оборудованию и пропускной способности. Вот отличная статья, в которой это объясняется более подробно... "nofollow noreferrer">blog.baasil.io/ - person Dustin Halstead; 19.04.2018
comment
Чтобы уточнить мой предыдущий комментарий... Это относится к отображению данных в реальном времени. Если в этом нет необходимости, то простого запроса POST будет вполне достаточно. Таким образом, если содержимое извлекается только тогда, когда пользователь нажимает определенную кнопку, то AJAX — прекрасное решение. Если контент постоянно обновляется, то веб-сокет — это то, что вам нужно. Кроме того, если веб-сокет реализован даже для одного компонента, его можно легко использовать для всех последующих запросов. Нет необходимости использовать их оба. - person Dustin Halstead; 19.04.2018
comment
спасибо за справочную статью! Чтобы дать некоторый контекст моему вопросу, в настоящее время я тестирую, как отправить POST с эмулятора webOS TV на локальный сервер. Просто чтобы уточнить, можно ли просто отправить запрос ajax? или требуются ли какие-либо предварительные условия, такие как необходимость сначала вызвать какую-либо службу Luna, а затем выполнить запрос? - person Nuwan Jayawardene; 20.04.2018
comment
@nuwanjaya -- С удовольствием. WebOS (первоначально разработанная Palm) по сути представляет собой модифицированный движок веб-браузера Blink (подобный тому, который используется в Chrome). Единственное отличие состоит в том, что он может получить доступ к определенным функциям телевизора (для чего требуется библиотека API). Когда я впервые начал разрабатывать для WebOS, я рассматривал возможность использования Enyo и службы Luna или Mojo.Service API, но лично обнаружил, что это приносит больше проблем, чем пользы. Итак, помимо взаимодействия с одним TV API, я просто придерживаюсь стандартных методов (таких как POST и socket.io) и пишу все остальное (например, пользовательский интерфейс) с нуля. - person Dustin Halstead; 24.04.2018
comment
Спасибо большое! Я разместил аналогичный вопрос на форуме webOS TV на их собственном сайте и до сих пор не получил никакого ответа. Ваш ответ дал более понятное и логичное объяснение, чем любой из материалов, которые я мог найти в их собственных документах. Говоря о веб-приложениях, пробовали ли вы когда-нибудь создать веб-приложение, используя другой фреймворк, чем Enyo? Используете что-то вроде ReactJS? - person Nuwan Jayawardene; 25.04.2018
comment
@nuwanjaya - Помимо некоторых действительно старых версий WebOS, почти все, что работает в ванильном Chrome, должно работать на телевизоре практически без проблем. Я не использовал ReactJS лично, но я использовал другие библиотеки JavaScript и сам добавил в него множество пользовательских скриптов. Я даже собрал эту анимацию холста для стресс-тестирования телевизора, и она отлично запустилась... codepen. io/Mangax/pen/NXXYpY - person Dustin Halstead; 25.04.2018
comment
Единственная раздражающая проблема, с которой я столкнулся, связана с запросами getDate() или getTime(). На компьютере, даже если установлено неправильное время, стандартный браузер использует текущий IP-адрес для получения правильного времени. Однако LG перехватывают запрос и возвращают текущую дату/время телевизора. Кроме того, они не устанавливают свое время автоматически, как компьютер или телефон — оно будет автоматически устанавливаться только при наличии стандартного широковещательного сигнала. Так вот, если нет активного соединения по коаксиальному кабелю, то его приходится ставить вручную (и теряется минута раз в пару дней). - person Dustin Halstead; 25.04.2018
comment
Рад, что смог помочь. :) Я полностью согласен с вами относительно их документации и форумов. По большей части в Интернете можно найти очень мало конструктивной помощи. Я работаю в очень крупной компании, и даже договориться по телефону с их разработчиками так долго, что к моменту, когда это действительно произошло, (кроме одного вопроса) я уже во всем разобрался за месяц проб и ошибок . - person Dustin Halstead; 25.04.2018
comment
@ Дастин, ты даже не представляешь, как много для меня значат твои слова! Я прочесывал Google в надежде найти какое-то человеческое подобие того, что на самом деле означает разработка для этой платформы. Ваши ответы - рай. - person Nuwan Jayawardene; 26.04.2018
comment
Все, что я могу извлечь из этого опыта, это; Документация LG по webOS TV является хорошим примером того, что происходит, когда компания, не ориентированная на разработчиков, выходит на территорию поддержки разработчиков без надлежащего планирования. В такой ситуации не будет много времени, пока Android TV превзойдет webOS с лучшей экосистемой просто из-за их превосходной документации. - person Nuwan Jayawardene; 26.04.2018
comment
Прошло некоторое время, но не могли бы вы подробно объяснить, как вы заставили службу WebOS JS запускать модуль socket.io? - person Didzis; 09.05.2019
comment
@Didzis - по сути, это стандартный веб-сайт / приложение с несколькими странностями, которые необходимо обойти (в первую очередь, все, кроме JavaScript ES5, не будет работать на телевизоре). На сервере, на котором размещено приложение, должен быть установлен Node.js вместе с модулем socket.io. Веб-служба обрабатывается Node.js вместо IIS. Также можно использовать IISNode для интеграции Node с IIS (github.com/tjanczuk/iisnode) — однако лично я нашел этот подход чрезвычайно запутанным, поэтому вместо этого я использую PM2 для запуска и мониторинга службы Node.js (pm2. keymetrics.io). - person Dustin Halstead; 15.05.2019