mirror of
https://github.com/whyour/qinglong.git
synced 2025-11-09 16:16:07 +08:00
72 lines
2.0 KiB
TypeScript
72 lines
2.0 KiB
TypeScript
import sockJs from 'sockjs';
|
|
import { Server } from 'http';
|
|
import { Container } from 'typedi';
|
|
import SockService from '../services/sock';
|
|
import { getPlatform } from '../config/util';
|
|
import { shareStore } from '../shared/store';
|
|
|
|
export default async ({ server }: { server: Server }) => {
|
|
const echo = sockJs.createServer({ prefix: '/api/ws', log: () => {} });
|
|
const sockService = Container.get(SockService);
|
|
|
|
echo.on('connection', async (conn) => {
|
|
if (!conn.headers || !conn.url || !conn.pathname) {
|
|
conn.close('404');
|
|
}
|
|
|
|
const authInfo = await shareStore.getAuthInfo();
|
|
const platform = getPlatform(conn.headers['user-agent'] || '') || 'desktop';
|
|
const headerToken = conn.url.replace(`${conn.pathname}?token=`, '');
|
|
if (authInfo) {
|
|
const { token = '', tokens = {} } = authInfo;
|
|
|
|
// Check legacy token field
|
|
if (headerToken === token) {
|
|
sockService.addClient(conn);
|
|
|
|
conn.on('data', (message) => {
|
|
conn.write(message);
|
|
});
|
|
|
|
conn.on('close', function () {
|
|
sockService.removeClient(conn);
|
|
});
|
|
|
|
return;
|
|
}
|
|
|
|
// Check platform-specific tokens (support both legacy string and new TokenInfo[] format)
|
|
const platformTokens = tokens[platform];
|
|
if (platformTokens) {
|
|
let isValidToken = false;
|
|
|
|
if (typeof platformTokens === 'string') {
|
|
// Legacy format: single string token
|
|
isValidToken = headerToken === platformTokens;
|
|
} else if (Array.isArray(platformTokens)) {
|
|
// New format: array of TokenInfo objects
|
|
isValidToken = platformTokens.some((t) => t.value === headerToken);
|
|
}
|
|
|
|
if (isValidToken) {
|
|
sockService.addClient(conn);
|
|
|
|
conn.on('data', (message) => {
|
|
conn.write(message);
|
|
});
|
|
|
|
conn.on('close', function () {
|
|
sockService.removeClient(conn);
|
|
});
|
|
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
conn.close('404');
|
|
});
|
|
|
|
echo.installHandlers(server);
|
|
};
|