Skip to content

Instantly share code, notes, and snippets.

@kissarat
Last active October 2, 2021 18:27
Show Gist options
  • Save kissarat/f7cfd8194740f864bea9cb6c127f3cfd to your computer and use it in GitHub Desktop.
Save kissarat/f7cfd8194740f864bea9cb6c127f3cfd to your computer and use it in GitHub Desktop.
/**
* @author Taras Labiak <kissarat@gmail.com>
*/
const http = require('http');
const https = require('https');
const fs = require('fs');
const path = require('path');
const { promisify } = require('util');
function jsonifyError(err) {
// return err
let json;
if (typeof err.toJSON === 'function') {
json = err.toJSON();
} else {
json = {
message: err.message
};
}
// json.ok = 0;
if (err.body) {
if (Array.isArray(err.body.errors)) {
err.message = err.body.errors.join('; ')
} else {
err.message = JSON.stringify(err.body)
}
}
for (const name of ['status', 'code', 'field']) {
if (err[name]) {
json[name] = err[name];
}
}
if (!json.type) {
json.type = (err.constructor && err.constructor.name) || err.name || 'UnknownError';
}
if (isDebug()) {
if (typeof err.spend === 'number') {
json.spend = err.spend;
}
if (typeof err.stack === 'string') {
json.stack = err.stack.split(/\s*\n\s*/);
}
}
return json;
}
const {
origin = 'https://gist.githubusercontent.com',
port = 9070,
dir = null,
prevent = 'text/plain',
redirect = ''
} = process.argv
.map(a => a.split('='))
.filter(a => 2 === a.length && a[0].indexOf('--') === 0)
.reduce((acc, a) => ({ ...acc, [a[0].slice(2)]: a[1] }), {});
const allowHeaders = ['content-type', 'content-length', 'cache-control', 'etag', 'date', 'last-modified', 'expires', 'location'];
const newHeaders = {
'access-control-allow-origin': '*'
};
const extensions = {};
function serve(req, res) {
if (redirect && '/' === req.url) {
res.writeHead(302, 'Found', {
location: redirect
});
return void res.end();
}
const type = extensions[path.extname(req.url)];
(0 === origin.indexOf('https:') ? https : http)
.get(origin + req.url, async function (response) {
const headers = {};
for (const header of allowHeaders) {
if (header in response.headers) {
headers[header] = response.headers[header];
}
}
Object.assign(headers, newHeaders);
const oldType = headers['content-type'];
if (!oldType || (type && oldType.indexOf(prevent) === 0)) {
headers['content-type'] = type;
}
res.writeHead(response.statusCode, response.statusMessage, headers);
if (dir) {
const p = req.url.split('/');
await promisify(fs.mkdir)(path.join(dir, ...p.slice(1, -1)), { recursive: true });
response.pipe(fs.createWriteStream(path.join(dir, ...p.slice(1))));
}
response.pipe(res);
console.log(req.url);
});
}
const server = http.createServer(function (req, res) {
try {
serve(req, res)
} catch (err) {
res.writeHead(500, {
'content-type': 'application/json'
})
res.end(JSON.stringify(jsonifyError(err)))
}
});
`
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;
text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;
image/png png;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/x-icon ico;
image/x-jng jng;
image/x-ms-bmp bmp;
image/svg+xml svg svgz;
image/webp webp;
application/font-woff woff;
application/java-archive jar war ear;
application/json json;
application/mac-binhex40 hqx;
application/msword doc;
application/pdf pdf;
application/postscript ps eps ai;
application/rtf rtf;
application/vnd.apple.mpegurl m3u8;
application/vnd.ms-excel xls;
application/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
application/vnd.wap.wmlc wmlc;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/x-7z-compressed 7z;
application/x-cocoa cco;
application/x-java-archive-diff jardiff;
application/x-java-jnlp-file jnlp;
application/x-makeself run;
application/x-perl pl pm;
application/x-pilot prc pdb;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
application/x-sea sea;
application/x-shockwave-flash swf;
application/x-stuffit sit;
application/x-tcl tcl tk;
application/x-x509-ca-cert der pem crt;
application/x-xpinstall xpi;
application/xhtml+xml xhtml;
application/xspf+xml xspf;
application/zip zip;
application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream iso img;
application/octet-stream msi msp msm;
application/vnd.openxmlformats-officedocument.wordprocessingml.document docx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx;
application/vnd.openxmlformats-officedocument.presentationml.presentation pptx;
audio/midi mid midi kar;
audio/mpeg mp3;
audio/ogg ogg;
audio/x-m4a m4a;
audio/x-realaudio ra;
video/3gpp 3gpp 3gp;
video/mp2t ts;
video/mp4 mp4;
video/mpeg mpeg mpg;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-m4v m4v;
video/x-mng mng;
video/x-ms-asf asx asf;
video/x-ms-wmv wmv;
video/x-msvideo avi;
`
.trim().split(/;\s*\n/)
.map(s => s.trim().split(/\s+/))
.forEach(([type, ...exts]) => exts.forEach(ext => extensions['.' + ext] = type));
server.listen(port);
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Raw Gist</title>
<style>
body {
margin: 0;
display: flex;
align-items: center;
flex-direction: column;
}
input, textarea {
width: 720px;
max-width: calc(100vw - 16px);
margin-bottom: 16px;
}
textarea {
height: 80px;
}
</style>
</head>
<body>
<h1>Raw Gist</h1>
<input id="input" placeholder="Input"/>
<input id="output" placeholder="Output"/>
<textarea id="source" style="display: none"></textarea>
<script>
document.addEventListener('DOMContentLoaded', function () {
document.getElementById('input').addEventListener('change', function (e) {
const origin = 'https://gist.githubusercontent.com';
const src = e.target.value.indexOf(origin) === 0
? location.origin + e.target.value.slice(origin.length)
: '';
document.getElementById('output').value = src;
const isJavaScript = /\.js$/.test(src);
const source = document.getElementById('source');
source.style.display = isJavaScript ? 'block' : 'none';
source.value = `(function(){\nconst s = document.createElement('script');\ns.src = '${src}';\ndocument.body.appendChild(s);\n})()`;
});
});
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment