mirror of
https://github.com/0x5eal/rbxts-pako.git
synced 2025-04-04 10:50:59 +01:00
94 lines
2.3 KiB
JavaScript
94 lines
2.3 KiB
JavaScript
'use strict';
|
|
|
|
/* eslint-disable no-console */
|
|
|
|
const http = require('http');
|
|
const multiparty = require('multiparty');
|
|
const fs = require('fs');
|
|
const zlib = require('zlib');
|
|
const util = require('util');
|
|
|
|
const readFile = util.promisify(fs.readFile);
|
|
const inflate = util.promisify(zlib.inflate);
|
|
|
|
const MULTIPART_RE = /^multipart\/form-data(?:;|$)/i;
|
|
const MAX_FIELDS_SIZE = 100 * 1024; // 100kb
|
|
const MAX_FILES_SIZE = 10 * 1024 * 1024; // 10mb
|
|
|
|
|
|
function error(msg) {
|
|
let e = new Error(msg);
|
|
e.statusCode = 400;
|
|
return e;
|
|
}
|
|
|
|
|
|
const server = http.createServer(async (req, res) => {
|
|
|
|
console.log('--- received request');
|
|
|
|
// Quick hack to bypass security restrictions when demo html is opened from
|
|
// file system. Don't do such things on production.
|
|
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
|
|
try {
|
|
//
|
|
// Check request size early by header and terminate immediately for big data
|
|
//
|
|
const length = parseInt((req.headers['content-length'] || '0'), 10);
|
|
|
|
if (!length || isNaN(length)) throw error('Length required');
|
|
|
|
if (!MULTIPART_RE.test(req.headers['content-type'])) {
|
|
throw error('Expect form data');
|
|
}
|
|
|
|
let err = null;
|
|
|
|
const form = new multiparty.Form({
|
|
maxFieldsSize: MAX_FIELDS_SIZE,
|
|
maxFilesSize: MAX_FILES_SIZE
|
|
});
|
|
|
|
const files = await new Promise(resolve => {
|
|
form.parse(req, function (e, fields, files) {
|
|
if (e) err = e;
|
|
resolve(files);
|
|
});
|
|
});
|
|
|
|
if (err) {
|
|
err.statusCode = err.statusCode || 400;
|
|
throw err;
|
|
}
|
|
|
|
const bin = await readFile(files.binson[0].path);
|
|
|
|
// Kludge - here we should cleanup all files
|
|
fs.unlinkSync(files.binson[0].path);
|
|
|
|
// Decompress binary content
|
|
// Note! Can throw error on bad data
|
|
const uncompressed = await inflate(bin);
|
|
|
|
// Convert utf8 buffer -> utf16 string (native JavaScript string format)
|
|
const decoded = uncompressed.toString();
|
|
|
|
// Finally, create an object
|
|
// Note! Can throw error on bad data
|
|
const obj = JSON.parse(decoded);
|
|
|
|
console.log('--- received object is: ', obj);
|
|
res.end('ok');
|
|
}
|
|
catch (err) {
|
|
console.log(err);
|
|
res.statusCode = err.statusCode || 400;
|
|
res.end(err.message);
|
|
}
|
|
|
|
});
|
|
|
|
server.listen(8000);
|
|
|
|
console.log('Listening browser requests. Open `browser.html` to see');
|