mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-25 19:25:43 +00:00
f0a9475719
Connection already saves the list of Session, so it is more natural to save it only once there and instead directly close the connections from Target. Each connection is going to cleanup all related sessions. I also stop automatically registering the session to the connection from Session constructor, it felt not explicit enough. Differential Revision: https://phabricator.services.mozilla.com/D37045 --HG-- extra : moz-landing-system : lando
68 lines
1.9 KiB
JavaScript
68 lines
1.9 KiB
JavaScript
/* 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";
|
|
|
|
var EXPORTED_SYMBOLS = ["Target"];
|
|
|
|
const { Connection } = ChromeUtils.import(
|
|
"chrome://remote/content/Connection.jsm"
|
|
);
|
|
const { WebSocketTransport } = ChromeUtils.import(
|
|
"chrome://remote/content/server/WebSocketTransport.jsm"
|
|
);
|
|
const { WebSocketHandshake } = ChromeUtils.import(
|
|
"chrome://remote/content/server/WebSocketHandshake.jsm"
|
|
);
|
|
|
|
/**
|
|
* Base class for all the Targets.
|
|
*/
|
|
class Target {
|
|
/**
|
|
* @param Targets targets
|
|
* @param Class sessionClass
|
|
*/
|
|
constructor(targets, sessionClass) {
|
|
// Save a reference to Targets instance in order to expose it to:
|
|
// domains/parent/Target.jsm
|
|
this.targets = targets;
|
|
|
|
// When a new connection is made to this target,
|
|
// we will instantiate a new session based on this given class.
|
|
// The session class is specific to each target's kind and is passed
|
|
// by the inheriting class.
|
|
this.sessionClass = sessionClass;
|
|
|
|
// There can be more than one connection if multiple clients connect to the remote agent.
|
|
this.connections = new Set();
|
|
}
|
|
|
|
/**
|
|
* Close all active connections made to this target.
|
|
*/
|
|
destructor() {
|
|
for (const conn of this.connections) {
|
|
conn.close();
|
|
}
|
|
}
|
|
|
|
// nsIHttpRequestHandler
|
|
|
|
async handle(request, response) {
|
|
const so = await WebSocketHandshake.upgrade(request, response);
|
|
const transport = new WebSocketTransport(so);
|
|
const conn = new Connection(transport, response._connection);
|
|
const session = new this.sessionClass(conn, this);
|
|
conn.registerSession(session);
|
|
this.connections.add(conn);
|
|
}
|
|
|
|
// XPCOM
|
|
|
|
get QueryInterface() {
|
|
return ChromeUtils.generateQI([Ci.nsIHttpRequestHandler]);
|
|
}
|
|
}
|