2

Firefox 拡張機能で「WebSocketServer.jsm」という .jsm ファイル (この githubから) をインポートしようとしています。以下の状況です。

  • .jsm ファイルは、次のパスの modules というディレクトリにあります。

root_of_extension/modules/WebSocketServer.jsm

  • chrome.manifest ファイルに次の行を追加しました。

resource external_components modules/

  • ファイルをインポートすることを推奨するコードをコードに挿入しました。

Cu.import("resource://external_components/WebSocketServer.jsm");

問題は、コンソールから次のエラーが表示されることです

console.error: 
Object
- message = Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIXPCComponents_Utils.import]
- fileName = undefined
- lineNumber = 6
- stack = @undefined:6:undefined|CuddlefishLoader/options<.load@resource://gre/modules/commonjs/sdk/loader/cuddlefish.js:129:9|run@resource://gre/modules
/commonjs/sdk/addon/runner.js:149:1|startup/<@resource://gre/modules/commonjs/sdk/addon/runner.js:113:7|resolve@resource://gre/modules/commonjs
/sdk/core/promise.js:118:11|resolve@resource://gre/modules/commonjs/sdk/core/promise.js:118:11|then@resource://gre/modules/commonjs/sdk/core/
promise.js:43:43|then@resource://gre/modules/commonjs/sdk/core/promise.js:153:9|resolve@resource://gre/modules/commonjs/sdk/core/
promise.js:185:11|resolve@resource://gre/modules/commonjs/sdk/core/promise.js:118:11|then@resource://gre/modules/commonjs/sdk/core/
promise.js:43:43|resolve@resource://gre/modules/commonjs/sdk/core/promise.js:185:11|resolve@resource://gre/modules/commonjs/sdk/core/
promise.js:118:11|resolve@resource://gre/modules/commonjs/sdk/core/promise.js:118:11|then@resource://gre/modules/commonjs/sdk/core/
promise.js:43:43|then@resource://gre/modules/commonjs/sdk/core/promise.js:153:9|resolve@resource://gre/modules/commonjs/sdk/core/
promise.js:185:11|resolve@resource://gre/modules/commonjs/sdk/core/promise.js:118:11|then@resource://gre/modules/commonjs/sdk/core/
promise.js:43:43|resolve@resource://gre/modules/commonjs/sdk/core/promise.js:185:11|resolve@resource://gre/modules/commonjs/sdk/core/
promise.js:118:11|then@resource://gre/modules/commonjs/sdk/core/promise.js:43:43|resolve@resource://gre/modules/commonjs/sdk/core/
promise.js:185:11|resolve@resource://gre/modules/commonjs/sdk/core/promise.js:118:11|then@resource://gre/modules/commonjs/sdk/core/
promise.js:43:43|resolve@resource://gre/modules/commonjs/sdk/core/promise.js:185:11|resolve@resource://gre/modules/commonjs/sdk/core/
promise.js:118:11|then@resource://gre/modules/commonjs/sdk/core/promise.js:43:43|resolve@resource://gre/modules/commonjs/sdk/core/
promise.js:185:11|resolve@resource://gre/modules/commonjs/sdk/core/promise.js:118:11|then@resource://gre/modules/commonjs/sdk/core/
promise.js:43:43|resolve@resource://gre/modules/commonjs/sdk/core/promise.js:185:11|readAsync/<@resource://gre/modules/commonjs/
sdk/net/url.js:49:9|NetUtil_asyncOpen/<.onStopRequest@resource://gre/modules/NetUtil.jsm:137:17|
- toString = function () /* use strict */ toString

「Cu.import」行の 6 行目。あなたはなにか考えはありますか?

4

2 に答える 2

1

これが私がテストしたばかりの解決策です。

まず構造:

$ ls -lR
total 8
drwxr-xr-x  3 maierman  staff  102 23 Jul 15:45 data
drwxr-xr-x  3 maierman  staff  102 23 Jul 15:47 lib
-rw-r--r--  1 maierman  staff  164 23 Jul 15:33 package.json

./data:
total 40
-rw-------  1 maierman  staff  17925 23 Jul 15:45 WebSocketServer.jsm

./lib:
total 8
-rw-r--r--  1 maierman  staff  874 23 Jul 15:47 main.js

今、main.js

const self = require("sdk/self");
const {Cc, Ci, Cu} = require("chrome");

const wssuri = self.data.url("WebSocketServer.jsm");

Cu.import(wssuri);

// Create an echo server
var clients = [];
var server;

exports.onUnload = function() {
  try {
    server.close();
    clients.slice().forEach(function(c) {
      try {
        c.close();
      }
      catch (cex) {
        console.debug("Failed to disconnect client " + client, cex);
      }
    });
  }
  catch (ex) {
    console.debug("Failed to disconnect server", ex);
  }
  Cu.unload(wssuri);
};

server = new WebSocketServer(12345);
server.onclient = function(client) {
  console.log(client + " connected");
  clients.push(client);

  client.onmessage = function(client, msg) {
    console.log(client + " message:" + msg);
    client.send(msg);
  };

  client.onclose = function(client) {
    console.log(client + " disconnected");
    clients = clients.filter(function(c) {
      return c != client;
    });
  };
};
server.connect();

また、必ず最新バージョンの を入手してWebSocketServer.jsmください。クライアントの切断が適切に処理されないバグに気付き、修正しました (ただし、それはあなたの質問とは関係ありません)。

そして、スクラッチパッドで以下を実行してこれをテストしました。

var ws = new WebSocket("ws://localhost:12345");
ws.onmessage = function(e) {
  console.log(e.data);
};
ws.onopen = function(e) {
  console.log("opened");
  ws.send("hello, world!");
};
ws.onerror = ws.onclose = function(e) {
  console.log(e.type);
};
于 2014-07-23T13:59:53.630 に答える