59 lines
2.1 KiB
JavaScript
59 lines
2.1 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const enums_1 = require("../../../enums");
|
|
exports.TransmissionHandler = ({ realm }) => {
|
|
const handle = (client, message) => {
|
|
const type = message.type;
|
|
const srcId = message.src;
|
|
const dstId = message.dst;
|
|
const destinationClient = realm.getClientById(dstId);
|
|
// User is connected!
|
|
if (destinationClient) {
|
|
const socket = destinationClient.getSocket();
|
|
try {
|
|
if (socket) {
|
|
const data = JSON.stringify(message);
|
|
socket.send(data);
|
|
}
|
|
else {
|
|
// Neither socket no res available. Peer dead?
|
|
throw new Error("Peer dead");
|
|
}
|
|
}
|
|
catch (e) {
|
|
// This happens when a peer disconnects without closing connections and
|
|
// the associated WebSocket has not closed.
|
|
// Tell other side to stop trying.
|
|
if (socket) {
|
|
socket.close();
|
|
}
|
|
else {
|
|
realm.removeClientById(destinationClient.getId());
|
|
}
|
|
handle(client, {
|
|
type: enums_1.MessageType.LEAVE,
|
|
src: dstId,
|
|
dst: srcId
|
|
});
|
|
}
|
|
}
|
|
else {
|
|
// Wait for this client to connect/reconnect (XHR) for important
|
|
// messages.
|
|
const ignoredTypes = [enums_1.MessageType.LEAVE, enums_1.MessageType.EXPIRE];
|
|
if (!ignoredTypes.includes(type) && dstId) {
|
|
realm.addMessageToQueue(dstId, message);
|
|
}
|
|
else if (type === enums_1.MessageType.LEAVE && !dstId) {
|
|
realm.removeClientById(srcId);
|
|
}
|
|
else {
|
|
// Unavailable destination specified with message LEAVE or EXPIRE
|
|
// Ignore
|
|
}
|
|
}
|
|
return true;
|
|
};
|
|
return handle;
|
|
};
|