Kodiを制御するための Firefox 用のアドオンを開発することにしました。イベントを受信できるようにWebSocketを使用して Kodi と通信することを選択しましたが、アドオンの WebSocket 部分の実装に問題があります。一時的に、WebSocket 機能をテストするためだけにページ ワーカーを含むアドオンを作成しました。開発用アドオンと一時的なテスト用アドオンの両方で、次のような動作が見られます。
test.html
アドオンの外部で Firefox に直接ロードすると (コンテンツについては投稿の下部を参照)、WebSocket は期待どおりに動作します。Kodi を再生または一時停止すると、接続は開いたままになり、イベントを受信します。
アドオンの外部で test.html を実行した場合のコンソール出力
Connection opened test.html:12:9
Object { jsonrpc: "2.0", method: "Player.OnPlay", params: Object } test.html:28:9
Object { jsonrpc: "2.0", method: "Player.OnPause", params: Object } test.html:28:9
Object { jsonrpc: "2.0", method: "Player.OnPlay", params: Object } test.html:28:9
Object { jsonrpc: "2.0", method: "Player.OnPause", params: Object } test.html:28:9
Object { jsonrpc: "2.0", method: "Player.OnPlay", params: Object } test.html:28:9
Object { jsonrpc: "2.0", method: "Player.OnPause", params: Object } test.html:28:9
Object { jsonrpc: "2.0", method: "GUI.OnScreensaverActivated", params: Object } test.html:28:9
ただし、コマンド ラインから を使用してアドオンを実行する場合は、この限りではありませんjpm run
。接続は数秒 (最大 4 秒) 後に閉じられます。(接続が開いている間はイベントを問題なく受信できることに注意してください):
jpm を使用してアドオンを実行した場合のコンソール出力
C:\Users\User\Desktop\example>jpm run
JPM [info] Starting jpm run on test
JPM [info] Creating a new profile
console.log: test: Connection opened
console.log: test: {"jsonrpc":"2.0","method":"Player.OnPlay","params":{"data":{"item":{"id":23,"type":"song"},"player":{"playerid":0,"speed":1}},"sender":"xbmc"}}
console.log: test: {"jsonrpc":"2.0","method":"Player.OnPause","params":{"data":{"item":{"id":23,"type":"song"},"player":{"playerid":0,"speed":0}},"sender":"xbmc"}}
console.log: test: Websocket error: undefined
console.log: test: Connection closed: 1006
アドオンの外部ではなく、アドオンの内部で接続が切断される理由を確認するにはどうすればよいですか? この奇妙な動作を修正するにはどうすればよいですか?
index.js:
var data = require("sdk/self").data;
var pageWorker = require("sdk/page-worker");
var pw = pageWorker.Page({
contentURL: data.url('test.html')
});
pw.port.on('message', function(message) {
console.log(message);
});
test.html:
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script type=text/javascript>
var ws = new WebSocket('ws://192.168.2.34:9090/jsonrpc');
ws.onopen = function (event) {
try {
addon.port.emit('message', "Connection opened");
} catch (e) {
console.log("Connection opened");
}
};
ws.onerror = function (event) {
try {
addon.port.emit('message', "Websocket error: "+event.data);
} catch (e) {
console.log("Websocket error: "+event.data);
}
};
ws.onmessage = function (event) {
try {
addon.port.emit('message', JSON.parse(event.data));
} catch (e) {
console.log(JSON.parse(event.data));
}
};
ws.onclose = function (event) {
try {
addon.port.emit('message', "Connection closed: "+event.code);
} catch (e) {
console.log("Connection closed: "+event.code);
}
};
</script>
</head>
<body>
</body>
</html>