aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/ApiManagers/UserManager.ts1
-rw-r--r--src/server/DashStats.ts70
-rw-r--r--src/server/index.ts7
-rw-r--r--src/server/stats/userLoginStats.csv2
-rw-r--r--src/server/websocket.ts17
5 files changed, 95 insertions, 2 deletions
diff --git a/src/server/ApiManagers/UserManager.ts b/src/server/ApiManagers/UserManager.ts
index 53e55c1c3..c3dadd821 100644
--- a/src/server/ApiManagers/UserManager.ts
+++ b/src/server/ApiManagers/UserManager.ts
@@ -5,6 +5,7 @@ import { msToTime } from '../ActionUtilities';
import * as bcrypt from 'bcrypt-nodejs';
import { Opt } from '../../fields/Doc';
import { WebSocket } from '../websocket';
+import { DashStats } from '../DashStats';
export const timeMap: { [id: string]: number } = {};
interface ActivityUnit {
diff --git a/src/server/DashStats.ts b/src/server/DashStats.ts
new file mode 100644
index 000000000..13ee61b3a
--- /dev/null
+++ b/src/server/DashStats.ts
@@ -0,0 +1,70 @@
+import { magenta } from 'colors';
+import { Request, Response } from 'express';
+import SocketIO from 'socket.io';
+import { Client } from './Client';
+import { WebSocket } from './websocket';
+const fs = require('fs');
+const csv = require('csv-parser');
+import { stringify } from 'csv-stringify/sync';
+
+export namespace DashStats {
+ const statsCSVFilename = './src/server/stats/userLoginStats.csv';
+ const columns = ['USERNAME', 'ACTION', 'TIME'];
+
+ interface SocketPair {
+ socketId: string;
+ username: string;
+ }
+
+ interface CSVStore {
+ USERNAME: string;
+ ACTION: string;
+ TIME: string;
+ }
+
+ export function handleStatsView(res: Response) {
+ const results: CSVStore[] = [];
+ fs.createReadStream(statsCSVFilename)
+ .pipe(csv(columns))
+ .on('data', (data: any) => results.push(data))
+ .on('end', () => {
+ console.log(results);
+ });
+
+ // let newRow = stringify([{ USERNAME: 'hi', ACTION: 'hi', TIME: 'hi' }], { header: true, columns: columns });
+ // console.log(newRow);
+
+ let current = getCurrentConnections();
+ res.json({
+ message: 'welcome to stats',
+ currentConnections: current.length,
+ socketMap: current,
+ });
+ }
+
+ export function logUserLogin(username: string | undefined, socket: SocketIO.Socket) {
+ if (!(username === undefined)) {
+ let currentDate = new Date();
+ console.log(magenta(`User ${username.split(' ')[0]} logged in at: ${currentDate.toISOString()}`));
+ console.log('stringify -> ');
+ }
+ }
+
+ export function logUserLogout(username: string | undefined, socket: SocketIO.Socket) {
+ if (!(username === undefined)) {
+ let currentDate = new Date();
+ console.log(magenta(`User ${username.split(' ')[0]} logged out at: ${currentDate.toISOString()}`));
+ }
+ }
+
+ function getCurrentConnections(): SocketPair[] {
+ let socketPairs: SocketPair[] = [];
+ for (let [key, value] of WebSocket.socketMap) {
+ if (!key.disconnected) {
+ socketPairs.push({ socketId: key.id, username: value.split(' ')[0] });
+ }
+ }
+ console.log(socketPairs);
+ return socketPairs;
+ }
+}
diff --git a/src/server/index.ts b/src/server/index.ts
index 6e6bde3cb..0848d828e 100644
--- a/src/server/index.ts
+++ b/src/server/index.ts
@@ -18,6 +18,7 @@ import { GoogleCredentialsLoader, SSL } from './apis/google/CredentialsLoader';
import { GoogleApiServerUtils } from './apis/google/GoogleApiServerUtils';
import { DashSessionAgent } from './DashSession/DashSessionAgent';
import { AppliedSessionAgent } from './DashSession/Session/agents/applied_session_agent';
+import { DashStats } from './DashStats';
import { DashUploadUtils } from './DashUploadUtils';
import { Database } from './database';
import { Logger } from './ProcessFactory';
@@ -85,6 +86,12 @@ function routeSetter({ isRelease, addSupervisedRoute, logRegistrationOutcome }:
addSupervisedRoute({
method: Method.GET,
+ subscription: '/stats',
+ secureHandler: ({ res }) => DashStats.handleStatsView(res),
+ });
+
+ addSupervisedRoute({
+ method: Method.GET,
subscription: '/resolvedPorts',
secureHandler: ({ res }) => res.send(resolvedPorts),
publicHandler: ({ res }) => res.send(resolvedPorts),
diff --git a/src/server/stats/userLoginStats.csv b/src/server/stats/userLoginStats.csv
new file mode 100644
index 000000000..ec33b01b2
--- /dev/null
+++ b/src/server/stats/userLoginStats.csv
@@ -0,0 +1,2 @@
+USERNAME,ACTION,TIME
+boo15869,loggedIn,2023-01 \ No newline at end of file
diff --git a/src/server/websocket.ts b/src/server/websocket.ts
index 9b91a35a6..e556ecc17 100644
--- a/src/server/websocket.ts
+++ b/src/server/websocket.ts
@@ -1,4 +1,4 @@
-import { blue } from 'colors';
+import { blue, magenta } from 'colors';
import * as express from 'express';
import { createServer, Server } from 'https';
import { networkInterfaces } from 'os';
@@ -12,6 +12,7 @@ import { GoogleCredentialsLoader, SSL } from './apis/google/CredentialsLoader';
import YoutubeApi from './apis/youtube/youtubeApiSample';
import { initializeGuest } from './authentication/DashUserModel';
import { Client } from './Client';
+import { DashStats } from './DashStats';
import { Database } from './database';
import { DocumentsCollection } from './IDatabase';
import { Diff, GestureContent, MessageStore, MobileDocumentUploadContent, MobileInkOverlayContent, Transferable, Types, UpdateMobileInkOverlayPositionContent, YoutubeQueryInput, YoutubeQueryTypes } from './Message';
@@ -20,7 +21,7 @@ import { resolvedPorts } from './server_Initialization';
export namespace WebSocket {
export let _socket: Socket;
- const clients: { [key: string]: Client } = {};
+ export const clients: { [key: string]: Client } = {};
export const socketMap = new Map<SocketIO.Socket, string>();
export let disconnect: Function;
@@ -97,6 +98,13 @@ export namespace WebSocket {
console.log('received bye');
});
+ socket.on('disconnect', function () {
+ let currentUser = socketMap.get(socket);
+ if (!(currentUser === undefined)) {
+ DashStats.logUserLogout(socketMap.get(socket), socket);
+ }
+ });
+
Utils.Emit(socket, MessageStore.Foo, 'handshooken');
Utils.AddServerHandler(socket, MessageStore.Bar, guid => barReceived(socket, guid));
@@ -176,7 +184,12 @@ export namespace WebSocket {
const currentdate = new Date();
const datetime = currentdate.getDate() + '/' + (currentdate.getMonth() + 1) + '/' + currentdate.getFullYear() + ' @ ' + currentdate.getHours() + ':' + currentdate.getMinutes() + ':' + currentdate.getSeconds();
console.log(blue(`user ${userEmail} has connected to the web socket at: ${datetime}`));
+ console.log(magenta(`currently connected: ${JSON.stringify(clients)}`));
+ // console.log(magenta('socket map below'));
+ // console.log([...socketMap.entries()]);
+ printActiveUsers();
socketMap.set(socket, userEmail + ' at ' + datetime);
+ DashStats.logUserLogin(socketMap.get(socket), socket);
}
function getField([id, callback]: [string, (result?: Transferable) => void]) {