rbxts-pako/examples/server.js
2018-11-29 21:10:51 +03:00

97 lines
2.5 KiB
JavaScript

'use strict';
/*eslint-disable no-console*/
const http = require('http');
const pako = require('../');
const multiparty = require('multiparty');
const fs = require('fs');
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
//
let 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;
let form = new multiparty.Form({
maxFieldsSize: MAX_FIELDS_SIZE,
maxFilesSize: MAX_FILES_SIZE
});
let 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;
}
// In ideal world, we should process data as stream to minimize memory use
// on big data (and use node's `zlib` inflate).
//
// But that's just a quick sample to explain data reencoding steps from
// browser to server. Feel free to improve.
let bin = fs.readFileSync(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
let uncompressed = pako.inflate(new Uint8Array(bin), { to: 'string' });
// Convert utf8 -> utf16 (native JavaScript string format)
let decoded = decodeURIComponent(escape(uncompressed));
// Finally, create an object
// Note! Can throw error on bad data
let 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');