tiny refactorizing
This commit is contained in:
parent
e799724b3b
commit
eec6df3301
5 changed files with 116 additions and 17 deletions
|
@ -7,7 +7,7 @@ import which from "which";
|
||||||
|
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
|
|
||||||
import { wss } from "./ws";
|
//import { wss } from "./ws";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enum to represent different types of video encoding methods.
|
* Enum to represent different types of video encoding methods.
|
||||||
|
|
|
@ -4,8 +4,8 @@ declare global {
|
||||||
interface User {
|
interface User {
|
||||||
id?: number | string;
|
id?: number | string;
|
||||||
username: string;
|
username: string;
|
||||||
hashed_password?: any;
|
hashed_password?: Buffer;
|
||||||
salt?: any;
|
salt?: Buffer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,8 +21,11 @@ export function extension(str: string) {
|
||||||
export interface User {
|
export interface User {
|
||||||
id?: number | string;
|
id?: number | string;
|
||||||
username: string;
|
username: string;
|
||||||
hashed_password?: any;
|
}
|
||||||
salt?: any;
|
|
||||||
|
export interface UserRow extends User {
|
||||||
|
salt: Buffer;
|
||||||
|
hashed_password: Buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface oembedObj {
|
export interface oembedObj {
|
||||||
|
|
|
@ -1,7 +1,19 @@
|
||||||
|
import { EventEmitter } from "events";
|
||||||
|
|
||||||
import WebSocket from "ws";
|
import WebSocket from "ws";
|
||||||
|
|
||||||
|
const eventEmitter = new EventEmitter();
|
||||||
|
|
||||||
const wsPort = normalizePort(process.env.EBWSPORT || "3001");
|
const wsPort = normalizePort(process.env.EBWSPORT || "3001");
|
||||||
|
|
||||||
|
const clients: WebSocket[] = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalizes a port number to ensure it is a valid integer.
|
||||||
|
*
|
||||||
|
* @param {string} val - The port number as a string.
|
||||||
|
* @returns {number} The normalized port number.
|
||||||
|
*/
|
||||||
function normalizePort(val: string) {
|
function normalizePort(val: string) {
|
||||||
const port = parseInt(val, 10);
|
const port = parseInt(val, 10);
|
||||||
|
|
||||||
|
@ -13,8 +25,91 @@ function normalizePort(val: string) {
|
||||||
return port;
|
return port;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* The WebSocket server instance.
|
||||||
|
*/
|
||||||
const wss = new WebSocket.Server({port: wsPort});
|
const wss = new WebSocket.Server({port: wsPort});
|
||||||
|
|
||||||
export { wss };
|
wss.on("connection", (ws) => {
|
||||||
|
clients.push(ws);
|
||||||
|
|
||||||
|
ws.on("message", handleMessage);
|
||||||
|
|
||||||
|
ws.on("close", handleMessage);
|
||||||
|
|
||||||
|
ws.on("error", handleMessage);
|
||||||
|
|
||||||
|
ws.on("close", () => {
|
||||||
|
const index = clients.indexOf(ws);
|
||||||
|
if (index !== -1) {
|
||||||
|
clients.splice(index, 1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles incoming messages from clients.
|
||||||
|
*
|
||||||
|
* @param {string} message - The incoming message.
|
||||||
|
*/
|
||||||
|
function handleMessage(message: string) {
|
||||||
|
try {
|
||||||
|
const data = JSON.parse(message);
|
||||||
|
|
||||||
|
switch (data.type) {
|
||||||
|
case "message":
|
||||||
|
eventEmitter.emit("message", data.message);
|
||||||
|
break;
|
||||||
|
case "close":
|
||||||
|
eventEmitter.emit("close", data.userId);
|
||||||
|
break;
|
||||||
|
case "error":
|
||||||
|
eventEmitter.emit("error", data.error);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
console.log(`Unknown message type: ${data.type}`);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log(`Error parsing message: ${error}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Broadcasts a message to all connected clients.
|
||||||
|
*
|
||||||
|
* @param {string} message - The message to broadcast.
|
||||||
|
*/
|
||||||
|
function broadcast(message: string) {
|
||||||
|
wss.clients.forEach((client) => {
|
||||||
|
if (client.readyState === WebSocket.OPEN) {
|
||||||
|
client.send(message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array of all connected clients.
|
||||||
|
*
|
||||||
|
* @returns {WebSocket[]} An array of connected clients.
|
||||||
|
*/
|
||||||
|
function getClients() {
|
||||||
|
return clients;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a message to a specific client.
|
||||||
|
*
|
||||||
|
* @param {string} clientId - The ID of the client to send the message to.
|
||||||
|
* @param {string} message - The message to send.
|
||||||
|
*/
|
||||||
|
/*function sendMessageToClient(clientId: string, message: string) {
|
||||||
|
const client = clients.find((client) => client.id === clientId);
|
||||||
|
if (client) {
|
||||||
|
client.send(message);
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//export { wss, eventEmitter, broadcast, getClients, sendMessageToClient };
|
||||||
|
|
||||||
|
|
|
@ -46,12 +46,9 @@ passport.use(
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
passport.serializeUser(function (user: User, cb) {
|
passport.serializeUser((user: User, cb: (err: Error | null, id?: User) => void) => {
|
||||||
process.nextTick(function () {
|
process.nextTick(() => {
|
||||||
cb(null, {
|
cb(null, user); // No need to reconstruct the user object
|
||||||
id: user.id,
|
|
||||||
username: user.username,
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -124,7 +124,7 @@ router.get("/oembed/:file",
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const oembedData: oembedObj = {
|
const oembedData: oembedObj = {
|
||||||
type: (videoExtensions.includes(fileExtension) ? "photo" : "video"),
|
type: (videoExtensions.includes(fileExtension) ? "video" : "photo"),
|
||||||
version: "1.0",
|
version: "1.0",
|
||||||
provider_name: "embedder",
|
provider_name: "embedder",
|
||||||
provider_url: "https://github.com/WaveringAna/embedder",
|
provider_url: "https://github.com/WaveringAna/embedder",
|
||||||
|
@ -134,16 +134,20 @@ router.get("/oembed/:file",
|
||||||
url: `${req.protocol}://${req.get("host")}/uploads/${filename}`
|
url: `${req.protocol}://${req.get("host")}/uploads/${filename}`
|
||||||
};
|
};
|
||||||
|
|
||||||
if (videoExtensions.includes(fileExtension) || fileExtension === '.gif') {
|
if (videoExtensions.includes(fileExtension) || fileExtension === ".gif") {
|
||||||
const ffprobeData = await ffProbe(`uploads/${filename}`, filename, fileExtension);
|
const ffprobeData = await ffProbe(`uploads/${filename}`, filename, fileExtension);
|
||||||
oembedData.width = ffprobeData.streams[0].width;
|
oembedData.width = ffprobeData.streams[0].width;
|
||||||
oembedData.height = ffprobeData.streams[0].height;
|
oembedData.height = ffprobeData.streams[0].height;
|
||||||
|
|
||||||
// Consider generating a thumbnail_url if it's a video
|
oembedData.html = `<video width="${oembedData.width}" height="${oembedData.height}" controls><source src="${oembedData.url}" type="video/${fileExtension.substring(1)}">Your browser does not support the video tag.</video>`;
|
||||||
} else {
|
} else {
|
||||||
const imageData = await imageProbe(fs.createReadStream(`uploads/${filename}`));
|
const imageData = await imageProbe(fs.createReadStream(`uploads/${filename}`));
|
||||||
oembedData.width = imageData.width;
|
oembedData.width = imageData.width;
|
||||||
oembedData.height = imageData.height;
|
oembedData.height = imageData.height;
|
||||||
|
|
||||||
|
oembedData.html = `
|
||||||
|
<img src="${oembedData.url}" width="${oembedData.width}" height="${oembedData.height}" alt="${filename}">
|
||||||
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
res.json(oembedData);
|
res.json(oembedData);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue