mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-11 23:04:52 +09:00
Implement proper session tracking and resume on reconnect for the WebSocket server.
71 lines
2.0 KiB
JavaScript
71 lines
2.0 KiB
JavaScript
const assert = require("assert").strict;
|
|
const events = require("events");
|
|
|
|
const link = require("lib/link");
|
|
|
|
const { get, exec, url, token } = require("./index");
|
|
|
|
|
|
class TestControl extends link.Link {
|
|
constructor(connector) {
|
|
super("control", "master", connector);
|
|
link.attachAllMessages(this);
|
|
}
|
|
|
|
async shutdownConnectionRequestHandler() { }
|
|
async instanceOutputEventHandler() { }
|
|
}
|
|
|
|
class TestControlConnector extends link.WebSocketClientConnector {
|
|
register() {
|
|
this.sendHandshake("register_control", { token: this.token, agent: "clusterctl", version: "test" });
|
|
}
|
|
}
|
|
|
|
describe("Integration of lib/link", function() {
|
|
let control;
|
|
let controlConnector;
|
|
it("should emitt an error if authentication failed", async function() {
|
|
controlConnector = new TestControlConnector(url, 0.2);
|
|
controlConnector.token = "gibberish";
|
|
control = new TestControl(controlConnector);
|
|
await assert.rejects(
|
|
controlConnector.connect(),
|
|
new Error("Authentication failed")
|
|
);
|
|
});
|
|
|
|
it("should connect with proper credentials", async function() {
|
|
controlConnector = new TestControlConnector(url, 0.2);
|
|
controlConnector.token = token;
|
|
control = new TestControl(controlConnector);
|
|
await controlConnector.connect();
|
|
});
|
|
|
|
it("should reconnect on connection lost", async function() {
|
|
controlConnector._socket.close(1008, "Test");
|
|
await events.once(controlConnector, "connected");
|
|
});
|
|
|
|
it("should reconnect on connection terminated", async function() {
|
|
controlConnector._socket.terminate();
|
|
await events.once(controlConnector, "connected");
|
|
});
|
|
|
|
it("should reconnect on connection heartbeat timeout", async function() {
|
|
controlConnector.stopHeartbeat();
|
|
await events.once(controlConnector, "connected");
|
|
});
|
|
|
|
it("should invalidate on reconnection with bad session token", async function() {
|
|
controlConnector._sessionToken = "blah";
|
|
controlConnector.stopHeartbeat();
|
|
await events.once(controlConnector, "invalidate");
|
|
await events.once(controlConnector, "connected");
|
|
});
|
|
|
|
after(async function() {
|
|
controlConnector.close(1001, "Test Quit");
|
|
});
|
|
});
|