Bug 1286281 - Part 4: WebSocket-based debugger transport r=jryans
authorJarda Snajdr <jsnajdr@gmail.com>
Wed, 03 Aug 2016 00:50:00 -0700
changeset 351990 7a112d070bbf534ac611ab24b8d724c20273aa1e
parent 351989 05299f77fe3865660fb8e8eac46784ab9bb40ea0
child 351991 e5376bdccaa4618bfc811809cc0c6e9d59d8481c
push id1324
push usermtabara@mozilla.com
push dateMon, 16 Jan 2017 13:07:44 +0000
treeherdermozilla-release@a01c49833940 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjryans
bugs1286281
milestone51.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1286281 - Part 4: WebSocket-based debugger transport r=jryans MozReview-Commit-ID: G4h7Z3KJTMA
.eslintignore
devtools/shared/transport/moz.build
devtools/shared/transport/websocket-transport.js
--- a/.eslintignore
+++ b/.eslintignore
@@ -145,16 +145,17 @@ devtools/shared/performance/**
 devtools/shared/qrcode/**
 devtools/shared/security/**
 devtools/shared/shims/**
 devtools/shared/tests/**
 !devtools/shared/tests/unit/test_csslexer.js
 devtools/shared/touch/**
 devtools/shared/transport/**
 !devtools/shared/transport/transport.js
+!devtools/shared/transport/websocket-transport.js
 devtools/shared/webconsole/test/**
 devtools/shared/worker/**
 !devtools/shared/worker/worker.js
 
 # Ignore devtools pre-processed files
 devtools/client/framework/toolbox-process-window.js
 devtools/client/performance/system.js
 devtools/client/webide/webide-prefs.js
--- a/devtools/shared/transport/moz.build
+++ b/devtools/shared/transport/moz.build
@@ -4,10 +4,11 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 XPCSHELL_TESTS_MANIFESTS += ['tests/unit/xpcshell.ini']
 
 DevToolsModules(
     'packets.js',
     'stream-utils.js',
-    'transport.js'
+    'transport.js',
+    'websocket-transport.js',
 )
new file mode 100644
--- /dev/null
+++ b/devtools/shared/transport/websocket-transport.js
@@ -0,0 +1,79 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+const EventEmitter = require("devtools/shared/event-emitter");
+
+function WebSocketDebuggerTransport(socket) {
+  EventEmitter.decorate(this);
+
+  this.active = false;
+  this.hooks = null;
+  this.socket = socket;
+}
+
+WebSocketDebuggerTransport.prototype = {
+  ready() {
+    if (this.active) {
+      return;
+    }
+
+    this.socket.addEventListener("message", this);
+    this.socket.addEventListener("close", this);
+
+    this.active = true;
+  },
+
+  send(object) {
+    this.emit("send", object);
+    if (this.socket) {
+      this.socket.send(JSON.stringify(object));
+    }
+  },
+
+  startBulkSend() {
+    throw new Error("Bulk send is not supported by WebSocket transport");
+  },
+
+  close() {
+    this.emit("onClosed");
+    this.active = false;
+
+    this.socket.removeEventListener("message", this);
+    this.socket.removeEventListener("close", this);
+    this.socket.close();
+    this.socket = null;
+
+    if (this.hooks) {
+      this.hooks.onClosed();
+      this.hooks = null;
+    }
+  },
+
+  handleEvent(event) {
+    switch (event.type) {
+      case "message":
+        this.onMessage(event);
+        break;
+      case "close":
+        this.close();
+        break;
+    }
+  },
+
+  onMessage({ data }) {
+    if (typeof data !== "string") {
+      throw new Error("Binary messages are not supported by WebSocket transport");
+    }
+
+    let object = JSON.parse(data);
+    this.emit("onPacket", object);
+    if (this.hooks) {
+      this.hooks.onPacket(object);
+    }
+  },
+};
+
+module.exports = WebSocketDebuggerTransport;