JSFiddle - React, Tailwind, and code Playground

by Luke

JavaScript

var fs = require('fs');
var koa = require('koa');
var app = koa();
var requestBody = require('koa-body');
var serve = require('koa-static');
var Router = require('koa-router');
var jwt = require('koa-jwt');
var publicRouter = new Router();
var apiRouter = new Router();

// Public Routes and Middleware. unprotected
// Custom 401 handling if you don't want to expose koa-jwt errors to users
app.use(function *(next){
	try {
		yield next;
  	} catch (err) {
		// 401 Unauthorized. this error is thrown when authorization fails. here, when jwt token not exixsts or invalid.
		if (401 == err.status) {
			this.redirect('/enter');
	  	} else if (404 == err.status) {
			this.status = 404;
		} else {
		  	throw err;
    	}
	}
});

app.use(serve('browser/dist'));
app.use(requestBody());

var readFileThunk = function(src) {
  return new Promise(function (resolve, reject) {
    fs.readFile(src, {'encoding': 'utf8'}, function (err, data) {
      if(err) return reject(err);
      resolve(data);
    });
  });
}

publicRouter.get('/',/* jwt({secret: 'my secret'}),*/ function* (next){
	var token = this.request.body.Authorization;
	console.log("token", token);
	jwt.verify(token, 'my secret', function(err, decoded){
		if(err) {
			console.log("route '/'", err);
			
		} else {
			console.log("route '/'", decoded);
			this.body = readFileThunk(__dirname + '/browser/dist/app.html');
		}
	})
});

publicRouter.get('/jwt', function* (next){
	var token = jwt.sign({ foo: 'bar' }, 'my secret');
	console.log(token);
	this.response.headers.Authorization = token;
	console.log("route /jwt", this.response.headers);
	this.body = token;
	this.redirect('/');
});

publicRouter.get('/enter', function* (next){
	// if jwt related auth hader exists then redirect to '/'
	// else if not serve enter.html file.
	this.body = yield readFileThunk(__dirname + '/browser/dist/enter.html');
});

app
  	.use(publicRouter.routes())
  	.use(publicRouter.allowedMethods());
	
app.listen(3000);
console.log('listening on port...