mirror of
https://github.com/coderaiser/cloudcmd.git
synced 2026-01-23 18:55:26 +00:00
114 lines
2.8 KiB
JavaScript
114 lines
2.8 KiB
JavaScript
'use strict';
|
|
|
|
const currify = require('currify/legacy');
|
|
const wraptile = require('wraptile/legacy');
|
|
const squad = require('squad/legacy');
|
|
const omit = require('object.omit');
|
|
|
|
const config = require('../config');
|
|
const log = require('./log');
|
|
|
|
const exportStr = log.exportStr;
|
|
const connectedStr = log.connectedStr;
|
|
const disconnectedStr = log.disconnectedStr;
|
|
const authTryStr = log.authTryStr;
|
|
|
|
const makeColor = log.makeColor;
|
|
const getMessage = log.getMessage;
|
|
const getDescription = log.getDescription;
|
|
const logWraped = log.logWraped;
|
|
|
|
const omitList = [
|
|
'auth',
|
|
'username',
|
|
'password',
|
|
'algo',
|
|
'name',
|
|
'ip',
|
|
'port',
|
|
'root',
|
|
'import',
|
|
'importUrl',
|
|
'importToken',
|
|
'export',
|
|
'exportToken',
|
|
'log',
|
|
'configDialog',
|
|
];
|
|
|
|
const omitConfig = wraptile((config) => omit(config, omitList));
|
|
|
|
module.exports = (socket) => {
|
|
if (!config('export'))
|
|
return;
|
|
|
|
const prefix = config('prefix');
|
|
const distributePrefix = `${prefix}/distribute`;
|
|
|
|
const onError = squad(logWraped(exportStr), getMessage);
|
|
const onConnectError = squad(logWraped(exportStr), getDescription);
|
|
|
|
socket.of(distributePrefix)
|
|
.on('connection', onConnection(push))
|
|
.on('error', onError)
|
|
.on('connect_error', onConnectError);
|
|
};
|
|
|
|
const push = currify((socket, key, value) => {
|
|
if (omitList.includes(key))
|
|
return;
|
|
|
|
socket.emit('change', key, value);
|
|
});
|
|
|
|
function getHost(socket) {
|
|
const remoteAddress = socket.request.connection.remoteAddress;
|
|
const name = socket.handshake.query.name;
|
|
const port = socket.handshake.query.port;
|
|
const color = socket.handshake.query.color;
|
|
|
|
if (!name)
|
|
return `${remoteAddress}:${port}`;
|
|
|
|
const colorName = makeColor(name, color);
|
|
|
|
return `${colorName} [${remoteAddress}:${port}]`;
|
|
}
|
|
|
|
const connectPush = wraptile((push, socket) => {
|
|
socket.emit('accept');
|
|
|
|
const host = getHost(socket);
|
|
const subscription = push(socket);
|
|
|
|
socket.on('disconnect', onDisconnect(subscription, host));
|
|
|
|
log(exportStr, `${connectedStr} to ${host}`);
|
|
socket.emit('config', omitConfig(config('*')));
|
|
|
|
config.subscribe(subscription);
|
|
});
|
|
|
|
const onConnection = currify((push, socket) => {
|
|
const host = getHost(socket);
|
|
const reject = () => {
|
|
socket.emit('reject');
|
|
socket.disconnect();
|
|
};
|
|
|
|
log(exportStr, `${authTryStr} from ${host}`);
|
|
socket.on('auth', auth(connectPush(push, socket), reject));
|
|
});
|
|
|
|
const auth = currify((fn, reject, token) => {
|
|
if (token === config('exportToken'))
|
|
return fn();
|
|
|
|
reject();
|
|
});
|
|
|
|
const onDisconnect = wraptile((subscription, host) => {
|
|
config.unsubscribe(subscription);
|
|
log(exportStr, `${disconnectedStr} from ${host}`);
|
|
});
|
|
|