File size: 3,144 Bytes
6279ff0
 
 
 
 
1e6a865
 
6279ff0
 
 
 
1e6a865
 
 
6279ff0
 
 
1e6a865
6279ff0
 
 
 
 
 
 
1e6a865
6279ff0
 
1e6a865
6279ff0
1e6a865
6279ff0
 
 
 
 
 
 
1e6a865
6279ff0
 
 
 
 
 
1e6a865
 
 
 
 
 
6279ff0
1e6a865
 
6279ff0
 
1e6a865
6279ff0
 
1e6a865
6279ff0
1e6a865
6279ff0
 
1e6a865
 
6279ff0
 
1e6a865
 
6279ff0
 
1e6a865
6279ff0
1e6a865
 
 
6279ff0
 
 
1e6a865
 
6279ff0
 
1e6a865
6279ff0
 
1e6a865
6279ff0
 
 
 
 
 
 
1e6a865
6279ff0
 
 
1e6a865
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// === 引入依赖 ===
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const requestIp = require('request-ip');
const crypto = require('crypto');
const { URL } = require('url');

const app = express();

// === 配置常量 ===
const PORT = process.env.PORT || 3000;
const HOST = '0.0.0.0';
console.log(`Starting server! PORT: ${PORT}`);

// === 中间件配置 ===
const corsOptions = {
    origin: '*',
    methods: ['GET', 'POST', 'OPTIONS'],
    allowedHeaders: ['Content-Type'],
};
app.use(cors(corsOptions));
app.use(bodyParser.json());
app.use(requestIp.mw());

// === 内存存储 ===
const urlMap = new Map();
const EXPIRATION_TIME = 90 * 1000; // 90 秒
const CLEANUP_INTERVAL = 60 * 1000;

// 定期清理任务
setInterval(() => {
    const now = Date.now();
    const expiredTime = now - EXPIRATION_TIME;

    for (const [userId, { timestamp }] of urlMap) {
        if (timestamp < expiredTime) {
            console.log(`Deleting expired data for user: ${userId}`);
            urlMap.delete(userId);
        }
    }
}, CLEANUP_INTERVAL);

// === 路由 ===

// 健康检查
app.get("/", (req, res) => {
    res.status(200).send({ message: "Server is healthy and running." });
});

// 存储 URL
app.post('/storeURL', (req, res) => {
    const url = req.body.url;
    const ip = req.clientIp;

    if (!url) {
        return res.status(400).json({ success: false, message: 'URL is required.' });
    }
    try {
        new URL(url);
    } catch (err) {
        return res.status(400).json({ success: false, message: 'Invalid URL format.' });
    }

    const fingerprint = crypto.createHash('sha256').update(`${ip}-${req.headers['user-agent']}`).digest('hex');
    const userId = `${ip}-${fingerprint}`;
    urlMap.set(userId, { url, timestamp: Date.now() });

    console.log(`Stored URL for user: ${userId}`);
    res.json({ success: true, message: 'URL stored successfully.', userId });
});

// 获取 URL
app.get('/getURL', (req, res) => {
    const ip = req.clientIp;
    const fingerprint = crypto.createHash('sha256').update(`${ip}-${req.headers['user-agent']}`).digest('hex');
    const userId = `${ip}-${fingerprint}`;

    if (urlMap.has(userId)) {
        const storedData = urlMap.get(userId);
        storedData.timestamp = Date.now();
        urlMap.set(userId, storedData);

        console.log(`Retrieved URL for user: ${userId}`);
        res.json({ success: true, url: storedData.url });
    } else {
        console.error(`No URL found for user: ${userId}`);
        res.status(404).json({ success: false, message: 'URL not found for this user.' });
    }
});

// === 启动服务器 ===
app.listen(PORT, HOST, (err) => {
    if (err) {
        console.error(`Error starting server: ${err}`);
        process.exit(1);
    }
    console.log(`Server running on http://${HOST}:${PORT}`);
});

// === 全局错误处理 ===
process.on('uncaughtException', (err) => {
    console.error('Uncaught Exception:', err);
});

process.on('unhandledRejection', (reason, promise) => {
    console.error('Unhandled Rejection at:', promise, 'reason:', reason);
});