140 lines
12 KiB
JavaScript
140 lines
12 KiB
JavaScript
|
"use strict";
|
||
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||
|
if (k2 === undefined) k2 = k;
|
||
|
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
||
|
}) : (function(o, m, k, k2) {
|
||
|
if (k2 === undefined) k2 = k;
|
||
|
o[k2] = m[k];
|
||
|
}));
|
||
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||
|
}) : function(o, v) {
|
||
|
o["default"] = v;
|
||
|
});
|
||
|
var __importStar = (this && this.__importStar) || function (mod) {
|
||
|
if (mod && mod.__esModule) return mod;
|
||
|
var result = {};
|
||
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||
|
__setModuleDefault(result, mod);
|
||
|
return result;
|
||
|
};
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
exports.SocketConnection = exports.allSocketConnections = void 0;
|
||
|
const plugins = __importStar(require("./smartsocket.plugins"));
|
||
|
const smartsocket_classes_socketrequest_1 = require("./smartsocket.classes.socketrequest");
|
||
|
const smartsocket_classes_socketrole_1 = require("./smartsocket.classes.socketrole");
|
||
|
const smartsocket_logging_1 = require("./smartsocket.logging");
|
||
|
// export classes
|
||
|
exports.allSocketConnections = new plugins.lik.ObjectMap();
|
||
|
/**
|
||
|
* class SocketConnection represents a websocket connection
|
||
|
*/
|
||
|
class SocketConnection {
|
||
|
constructor(optionsArg) {
|
||
|
this.authenticated = false;
|
||
|
this.eventSubject = new plugins.smartrx.rxjs.Subject();
|
||
|
this.eventStatus = 'new';
|
||
|
this.alias = optionsArg.alias;
|
||
|
this.authenticated = optionsArg.authenticated;
|
||
|
this.role = optionsArg.role;
|
||
|
this.side = optionsArg.side;
|
||
|
this.smartsocketRef = optionsArg.smartsocketHost;
|
||
|
this.socket = optionsArg.socket;
|
||
|
// standard behaviour that is always true
|
||
|
exports.allSocketConnections.add(this);
|
||
|
// handle connection
|
||
|
this.socket.on('connect', async () => {
|
||
|
this.updateStatus('connected');
|
||
|
});
|
||
|
this.socket.on('disconnect', async () => {
|
||
|
smartsocket_logging_1.logger.log('info', `SocketConnection with >alias ${this.alias} on >side ${this.side} disconnected`);
|
||
|
await this.disconnect();
|
||
|
exports.allSocketConnections.remove(this);
|
||
|
});
|
||
|
}
|
||
|
// authenticating --------------------------
|
||
|
/**
|
||
|
* authenticate the socket
|
||
|
*/
|
||
|
authenticate() {
|
||
|
const done = plugins.smartpromise.defer();
|
||
|
this.socket.on('dataAuth', async (dataArg) => {
|
||
|
smartsocket_logging_1.logger.log('info', 'received authentication data. now hashing and comparing...');
|
||
|
this.socket.removeListener('dataAuth', () => { });
|
||
|
if (smartsocket_classes_socketrole_1.SocketRole.checkPasswordForRole(dataArg, this.smartsocketRef)) {
|
||
|
// TODO: authenticate password
|
||
|
this.alias = dataArg.alias;
|
||
|
this.authenticated = true;
|
||
|
this.role = smartsocket_classes_socketrole_1.SocketRole.getSocketRoleByName(this.smartsocketRef, dataArg.role);
|
||
|
this.socket.emit('authenticated');
|
||
|
smartsocket_logging_1.logger.log('ok', `socket with >>alias ${this.alias} >>role ${this.role} is authenticated!`);
|
||
|
done.resolve(this);
|
||
|
}
|
||
|
else {
|
||
|
this.authenticated = false;
|
||
|
await this.disconnect();
|
||
|
done.reject('not authenticated');
|
||
|
}
|
||
|
});
|
||
|
const requestAuthPayload = {
|
||
|
serverShortId: this.smartsocketRef.shortId
|
||
|
};
|
||
|
this.socket.emit('requestAuth', requestAuthPayload);
|
||
|
return done.promise;
|
||
|
}
|
||
|
// listening -------------------------------
|
||
|
/**
|
||
|
* listen to function requests
|
||
|
*/
|
||
|
listenToFunctionRequests() {
|
||
|
const done = plugins.smartpromise.defer();
|
||
|
if (this.authenticated) {
|
||
|
this.socket.on('function', (dataArg) => {
|
||
|
// check if requested function is available to the socket's scope
|
||
|
smartsocket_logging_1.logger.log('info', 'function request received');
|
||
|
const referencedFunction = this.role.allowedFunctions.find(socketFunctionArg => {
|
||
|
return socketFunctionArg.name === dataArg.funcCallData.funcName;
|
||
|
});
|
||
|
if (referencedFunction) {
|
||
|
smartsocket_logging_1.logger.log('ok', 'function in access scope');
|
||
|
const localSocketRequest = new smartsocket_classes_socketrequest_1.SocketRequest(this.smartsocketRef, {
|
||
|
side: 'responding',
|
||
|
originSocketConnection: this,
|
||
|
shortId: dataArg.shortId,
|
||
|
funcCallData: dataArg.funcCallData
|
||
|
});
|
||
|
localSocketRequest.createResponse(); // takes care of creating response and sending it back
|
||
|
}
|
||
|
else {
|
||
|
smartsocket_logging_1.logger.log('warn', 'function not existent or out of access scope');
|
||
|
}
|
||
|
});
|
||
|
this.socket.on('functionResponse', (dataArg) => {
|
||
|
smartsocket_logging_1.logger.log('info', `received response for request with id ${dataArg.shortId}`);
|
||
|
const targetSocketRequest = smartsocket_classes_socketrequest_1.SocketRequest.getSocketRequestById(this.smartsocketRef, dataArg.shortId);
|
||
|
targetSocketRequest.handleResponse(dataArg);
|
||
|
});
|
||
|
smartsocket_logging_1.logger.log('info', `now listening to function requests for ${this.alias}`);
|
||
|
done.resolve(this);
|
||
|
}
|
||
|
else {
|
||
|
const errMessage = 'socket needs to be authenticated first';
|
||
|
smartsocket_logging_1.logger.log('error', errMessage);
|
||
|
done.reject(errMessage);
|
||
|
}
|
||
|
return done.promise;
|
||
|
}
|
||
|
// disconnecting ----------------------
|
||
|
async disconnect() {
|
||
|
this.socket.disconnect(true);
|
||
|
this.updateStatus('disconnected');
|
||
|
}
|
||
|
updateStatus(statusArg) {
|
||
|
if (this.eventStatus !== statusArg) {
|
||
|
this.eventSubject.next(statusArg);
|
||
|
}
|
||
|
this.eventStatus = statusArg;
|
||
|
}
|
||
|
}
|
||
|
exports.SocketConnection = SocketConnection;
|
||
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRjb25uZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRzb2NrZXQuY2xhc3Nlcy5zb2NrZXRjb25uZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrREFBaUQ7QUFNakQsMkZBQThGO0FBQzlGLHFGQUE4RDtBQUs5RCwrREFBK0M7QUE4Qi9DLGlCQUFpQjtBQUNOLFFBQUEsb0JBQW9CLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBb0IsQ0FBQztBQUVoRjs7R0FFRztBQUNILE1BQWEsZ0JBQWdCO0lBVzNCLFlBQVksVUFBK0M7UUFScEQsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFLL0IsaUJBQVksR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBZ0MsQ0FBQztRQUNoRixnQkFBVyxHQUFpQyxLQUFLLENBQUM7UUFHdkQsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQzlCLElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUM5QyxJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQztRQUNqRCxJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFFaEMseUNBQXlDO1FBQ3pDLDRCQUFvQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUvQixvQkFBb0I7UUFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDdEMsNEJBQU0sQ0FBQyxHQUFHLENBQ1IsTUFBTSxFQUNOLGdDQUFnQyxJQUFJLENBQUMsS0FBSyxhQUFhLElBQUksQ0FBQyxJQUFJLGVBQWUsQ0FDaEYsQ0FBQztZQUNGLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3hCLDRCQUFvQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCw0Q0FBNEM7SUFFNUM7O09BRUc7SUFDSSxZQUFZO1FBQ2pCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxPQUE4QyxFQUFFLEVBQUU7WUFDbEYsNEJBQU0sQ0FBQyxHQUFHLENBQ1IsTUFBTSxFQUNOLDREQUE0RCxDQUM3RCxDQUFDO1lBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2pELElBQUksMkNBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFO2dCQUNqRSw4QkFBOEI7Z0JBQzlCLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDM0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxJQUFJLEdBQUcsMkNBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDOUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ2xDLDRCQUFNLENBQUMsR0FBRyxDQUNSLElBQUksRUFDSix1QkFBdUIsSUFBSSxDQUFDLEtBQUssV0FBVyxJQUFJLENBQUMsSUFBSSxvQkFBb0IsQ0FDMUUsQ0FBQztnQkFDRixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3BCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO2dCQUMzQixNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2FBQ2xDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLGtCQUFrQixHQUFtQztZQUN6RCxhQUFhLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPO1NBQzNDLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUNwRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELDRDQUE0QztJQUU1Qzs7T0FFRztJQUNJLHdCQUF3QjtRQUM3QixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFzQyxFQUFFLEVBQUU7Z0JBQ3BFLGlFQUFpRTtnQkFDakUsNEJBQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLDJCQUEyQixDQUFDLENBQUM7Z0JBQ2hELE1BQU0sa0JBQWtCLEdBQXdCLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUM3RSxpQkFBaUIsQ0FBQyxFQUFFO29CQUNsQixPQUFPLGlCQUFpQixDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztnQkFDbEUsQ0FBQyxDQUNGLENBQUM7Z0JBQ0YsSUFBSSxrQkFBa0IsRUFBRTtvQkFDdEIsNEJBQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLDBCQUEwQixDQUFDLENBQUM7b0JBQzdDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxpREFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7d0JBQ2hFLElBQUksRUFBRSxZQUFZO3dCQUNsQixzQkFBc0IsRUFBRSxJQUFJO3dCQUM1QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87d0JBQ3hCLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtxQkFDbkMsQ0FBQyxDQUFDO29CQUNILGtCQUFrQixDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsc0RBQXNEO2lCQ
|