@sync-in/server
Version:
The secure, open-source platform for file storage, sharing, collaboration, and sync
127 lines (126 loc) • 5.26 kB
JavaScript
/*
* Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>
* This file is part of Sync-in | The open source file sync and share solution
* See the LICENSE file for licensing details
*/ "use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "WebSocketAdapter", {
enumerable: true,
get: function() {
return WebSocketAdapter;
}
});
const _common = require("@nestjs/common");
const _jwt = require("@nestjs/jwt");
const _platformfastify = require("@nestjs/platform-fastify");
const _platformsocketio = require("@nestjs/platform-socket.io");
const _websockets = require("@nestjs/websockets");
const _cookie = require("cookie");
const _nodecluster = /*#__PURE__*/ _interop_require_default(require("node:cluster"));
const _websocket = require("../../../applications/users/constants/websocket");
const _configenvironment = require("../../../configuration/config.environment");
const _utils = require("../utils");
const _clusteradapter = require("./cluster.adapter");
const _redisadapter = require("./redis.adapter");
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _ts_decorate(decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
}
function _ts_metadata(k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
}
let WebSocketAdapter = class WebSocketAdapter extends _platformsocketio.IoAdapter {
async initAdapter() {
this.adapter = await this.getAdapter();
}
createIOServer(port, options) {
const server = this.adapter.createIOServer(port, {
...options,
cors: {
origin: _configenvironment.configuration.websocket.corsOrigin
},
transports: [
'websocket'
]
});
// Authentication
server.use(this.authenticateSocket.bind(this));
server.on('new_namespace', (namespace)=>{
// apply auth on all namespaces
namespace.use(this.authenticateSocket.bind(this));
});
this.logger.log(`Using ${server.of(_websocket.USERS_WS.NAME_SPACE).adapter.constructor.name}`);
return server;
}
async getAdapter() {
if (_configenvironment.configuration.websocket.adapter === 'redis') {
try {
const redisIoAdapter = new _redisadapter.RedisAdapter(this.app);
await redisIoAdapter.connectToRedis(_configenvironment.configuration.websocket.redis);
return redisIoAdapter;
} catch (e) {
this.logger.error(e.message);
process.exit(1);
}
} else {
if (_nodecluster.default.isWorker) {
// setup connection with the primary process
return new _clusteradapter.ClusterAdapter(this.app);
} else {
this.logger.warn('Adapter Cluster only works in clustering mode', 'WEBSOCKET');
// do not exit for tests (e2e)
}
}
}
authenticateSocket(socket, next) {
const cookies = socket.request.headers.cookie ? (0, _cookie.parse)(socket.request.headers.cookie) : {};
const token = cookies[_configenvironment.configuration.auth.token.ws.name];
if (!token) {
this.onAuthError('Authorization is missing', socket, next);
return;
}
let payload;
try {
payload = this.jwtService.verify(token, {
secret: _configenvironment.configuration.auth.token.ws.secret
});
} catch (e) {
this.onAuthError(e.message, socket, next);
return;
}
if (!payload) {
this.onAuthError('Payload is missing', socket, next);
return;
}
Object.assign(socket, {
user: payload.identity
});
next();
}
onAuthError(error, socket, next) {
this.logger.warn(`${error} - ${(0, _utils.getClientAddress)(socket)} ${socket.id} ${socket.handshake.url} ${socket.handshake.headers['user-agent']}`);
next(new _websockets.WsException('Unauthorized'));
}
constructor(app){
super(app), this.logger = new _common.Logger(WebSocketAdapter.name);
this.app = app;
this.jwtService = app.get(_jwt.JwtService);
}
};
WebSocketAdapter = _ts_decorate([
(0, _common.Injectable)(),
_ts_metadata("design:type", Function),
_ts_metadata("design:paramtypes", [
typeof _platformfastify.NestFastifyApplication === "undefined" ? Object : _platformfastify.NestFastifyApplication
])
], WebSocketAdapter);
//# sourceMappingURL=web-socket.adapter.js.map