| import crc32 from './crc32.js' | |
| import http from 'axios' | |
| import express from 'express' | |
| const app = express() | |
| const port = 7860 | |
| app.use(express.json()) | |
| app.use(express.urlencoded({ extended: true })) | |
| const splitBuffer = (buffer, n) => { | |
| const partSize = Math.ceil(buffer.length / n) | |
| const parts = [] | |
| for (let i = 0; i < n; i++) { | |
| const start = i * partSize | |
| const end = start + partSize | |
| parts.push(buffer.slice(start, end)) | |
| } | |
| return parts | |
| } | |
| app.get('*', async (req, res) => { | |
| try { | |
| const file_url = req.path.replace(/^\//, '') | |
| const file = await http({ | |
| method: 'GET', | |
| url: file_url, | |
| responseType: 'arraybuffer' | |
| }) | |
| const files_list = splitBuffer(file.data, 5) | |
| const upload_info = await http({ | |
| method: 'GET', | |
| url: 'https://data.emmmm.eu.org/upload/cn' | |
| }) | |
| const upload_part_info = await http({ | |
| method: 'POST', | |
| url: upload_info.data.url, | |
| params: { | |
| uploadmode: 'part', | |
| phase: 'init' | |
| }, | |
| headers: { | |
| 'authorization': upload_info.data.authorization | |
| } | |
| }) | |
| const uploadid = upload_part_info.data.data.uploadid | |
| console.log(uploadid) | |
| const upload_list = {} | |
| await Promise.all(files_list.map(async (item, index) => { | |
| const crc32_text = crc32(item) | |
| let count = 1 | |
| while (count && count <= 5) { | |
| const upload_result = await http({ | |
| method: 'POST', | |
| url: upload_info.data.url, | |
| params: { | |
| uploadid: uploadid, | |
| part_number: index + 1, | |
| phase: 'transfer' | |
| }, | |
| headers: { | |
| 'content-crc32': crc32_text, | |
| 'authorization': upload_info.data.authorization | |
| }, | |
| data: item | |
| }) | |
| if (upload_result.data.data.crc32 == crc32_text) { | |
| count = 0 | |
| upload_list[index + 1] = crc32_text | |
| } else { | |
| count += 1 | |
| if (count > 5) { | |
| throw Error | |
| } | |
| } | |
| } | |
| })) | |
| const finish = Object.entries(upload_list).map(i => i.join(':')).join(',') | |
| const upload_result = await http({ | |
| method: 'POST', | |
| url: upload_info.data.url, | |
| params: { | |
| uploadid: uploadid, | |
| uploadmode: 'part', | |
| phase: 'finish' | |
| }, | |
| headers: { | |
| 'authorization': upload_info.data.authorization | |
| }, | |
| data: finish | |
| }) | |
| if (upload_result.data.code == 2000) { | |
| res.send(JSON.stringify({ | |
| vid: upload_info.data.vid, | |
| url: `https://data.emmmm.eu.org/parse/zj/${upload_info.data.uri}` | |
| })) | |
| } else { | |
| throw Error | |
| } | |
| } catch (e) { | |
| res.send(e.toString()) | |
| } | |
| }) | |
| app.listen(port, async () => { | |
| console.log(`http://localhost:${port}`) | |
| }) |