forked from sheetjs/sheetjs
		
	
		
			
	
	
		
			80 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			80 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||
|  | 
 | ||
|  | const Koa = require('koa'), app = new Koa(); | ||
|  | const { sprintf } = require('printj'); | ||
|  | const { IncomingForm } = require('formidable'); | ||
|  | const { fork } = require('child_process'); | ||
|  | const logit = require('./_logit'); | ||
|  | const subprocess = fork('koasub.js'); | ||
|  | 
 | ||
|  | const get_data = async (ctx, type) => { | ||
|  | 	await new Promise((resolve, reject) => { | ||
|  | 		const cb = (data) => { | ||
|  | 			ctx.response.body = Buffer(data); | ||
|  | 			subprocess.removeListener('message', cb); | ||
|  | 			resolve(); | ||
|  | 		}; | ||
|  | 		subprocess.on('message', cb); | ||
|  | 		subprocess.send(['get data', type]); | ||
|  | 	}); | ||
|  | }; | ||
|  | 
 | ||
|  | const get_file = async (ctx, file) => { | ||
|  | 	await new Promise((resolve, reject) => { | ||
|  | 		const cb = (data) => { | ||
|  | 			ctx.response.body = Buffer(data); | ||
|  | 			subprocess.removeListener('message', cb); | ||
|  | 			resolve(); | ||
|  | 		}; | ||
|  | 		subprocess.on('message', cb); | ||
|  | 		subprocess.send(['get file', file]); | ||
|  | 	}); | ||
|  | }; | ||
|  | 
 | ||
|  | const load_data = async (ctx, file) => { | ||
|  | 	await new Promise((resolve, reject) => { | ||
|  | 		const cb = (data) => { | ||
|  | 			ctx.response.body = "ok\n"; | ||
|  | 			subprocess.removeListener('message', cb); | ||
|  | 			resolve(); | ||
|  | 		}; | ||
|  | 		subprocess.on('message', cb); | ||
|  | 		subprocess.send(['load data', file]); | ||
|  | 	}); | ||
|  | }; | ||
|  | 
 | ||
|  | const post_data = async (ctx) => { | ||
|  | 	const keys = Object.keys(ctx.request._files), k = keys[0]; | ||
|  | 	await load_data(ctx, ctx.request._files[k].path); | ||
|  | }; | ||
|  | 
 | ||
|  | app.use(async (ctx, next) => { logit(ctx.req, ctx.res); await next(); }); | ||
|  | app.use(async (ctx, next) => { | ||
|  | 	const form = new IncomingForm(); | ||
|  | 	await new Promise((resolve, reject) => { | ||
|  | 		form.parse(ctx.req, (err, fields, files) => { | ||
|  | 			if(err) return reject(err); | ||
|  | 			ctx.request._fields = fields; | ||
|  | 			ctx.request._files = files; | ||
|  | 			resolve(); | ||
|  | 		}); | ||
|  | 	}); | ||
|  | 	await next(); | ||
|  | }); | ||
|  | app.use(async (ctx, next) => { | ||
|  | 	if(ctx.request.method !== 'GET') await next(); | ||
|  | 	else if(ctx.request.path !== '/') await next(); | ||
|  | 	else if(ctx.request.query.t) await get_data(ctx, ctx.request.query.t); | ||
|  | 	else if(ctx.request.query.f) await get_file(ctx, ctx.request.query.f); | ||
|  | 	else ctx.throw(403, "Forbidden"); | ||
|  | }); | ||
|  | app.use(async (ctx, next) => { | ||
|  | 	if(ctx.request.method !== 'POST') await next(); | ||
|  | 	else if(ctx.request.path !== '/') await next(); | ||
|  | 	else if(ctx.request.query.f) await load_data(ctx, ctx.request.query.f); | ||
|  | 	else await post_data(ctx); | ||
|  | }); | ||
|  | 
 | ||
|  | const port = +process.argv[2] || +process.env.PORT || 7262; | ||
|  | app.listen(port, () => { console.log('Serving HTTP on port ' + port); }); |