Skip to content

Commit

Permalink
!fixup migrate routers to async/await
Browse files Browse the repository at this point in the history
  • Loading branch information
wpjunior committed Nov 23, 2017
1 parent 92215be commit 24eeaa4
Show file tree
Hide file tree
Showing 3 changed files with 119 additions and 121 deletions.
231 changes: 114 additions & 117 deletions lib/http/routers/FunctionsRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,28 +20,27 @@ function codeFileName(namespace, codeId) {
return `${namespace}/${codeId}.js`;
}

router.get('/', (req, res) => {
router.get('/', async (req, res) => {
const memoryStorage = req.app.get('memoryStorage');
const page = parseInt(req.query.page || '1', 10);
const perPage = parseInt(req.query.perPage || '10', 10);
const functionsRequest = new FunctionsRequest(req);

memoryStorage.listNamespaces(page, perPage).then((list) => {
const functionsRequest = new FunctionsRequest(req);

new SchemaResponse(functionsRequest, res, 'functions/list')
.json(list);
}, (err) => {
try {
const list = await memoryStorage.listNamespaces(page, perPage);
new SchemaResponse(functionsRequest, res, 'functions/list').json(list);
} catch (err) {
log.error(`Error listing namespaces and its functions: ${err}`);
res.status(500).json({ error: err.message });
});
}
});

router.all('/:namespace/:id*', (req, res, next) => {
req.log = new StdoutLogStorage(req.params.namespace, req.params.id).console;
next();
});

router.post('/:namespace/:id', bodyParser.json({ limit: bodyParserLimit }), (req, res) => {
router.post('/:namespace/:id', bodyParser.json({ limit: bodyParserLimit }), async (req, res) => {
const validationResult = new Validator().validate(req.body, schemas['functions/item']);
const memoryStorage = req.app.get('memoryStorage');

Expand Down Expand Up @@ -78,7 +77,8 @@ router.post('/:namespace/:id', bodyParser.json({ limit: bodyParserLimit }), (req
data.env = env;
}

memoryStorage.postCode(namespace, id, data).then((result) => {
try {
const result = await memoryStorage.postCode(namespace, id, data);
const codeResult = result[0][1];
const hashResult = result[1][1];

Expand All @@ -91,18 +91,16 @@ router.post('/:namespace/:id', bodyParser.json({ limit: bodyParserLimit }), (req

res.set({ ETag: data.hash });

const functionsRequest = new FunctionsRequest(req);

new SchemaResponse(functionsRequest, res, 'functions/item').json(data);
}, (err) => {
new SchemaResponse(new FunctionsRequest(req), res, 'functions/item').json(data);
} catch (err) {
req.log.error(`${err}`);
req.log.error(`${err.stack}`);
res.status(500).json({ error: err.message });
});
}
});


router.put('/:namespace/:id', bodyParser.json({ limit: bodyParserLimit }), (req, res) => {
router.put('/:namespace/:id', bodyParser.json({ limit: bodyParserLimit }), async (req, res) => {
const validationResult = new Validator().validate(req.body, schemas['functions/item']);
const memoryStorage = req.app.get('memoryStorage');

Expand Down Expand Up @@ -140,18 +138,19 @@ router.put('/:namespace/:id', bodyParser.json({ limit: bodyParserLimit }), (req,
data.env = env;
}

memoryStorage.putCode(namespace, id, data).then(() => {
try {
await memoryStorage.putCode(namespace, id, data);
res.set({ ETag: data.hash });

const functionsRequest = new FunctionsRequest(req);
new SchemaResponse(functionsRequest, res, 'functions/item').json(data);
}, (err) => {
} catch (err) {
log.error(`[${namespace}:${id}] ${err}`);
res.status(500).json({ error: err.message });
});
}
});

router.put('/:namespace/:id/env/:env', bodyParser.json({ strict: false, limit: bodyParserLimit }), (req, res) => {
router.put('/:namespace/:id/env/:env', bodyParser.json({ strict: false, limit: bodyParserLimit }), async (req, res) => {
const validationResult = new Validator().validate(req.body, schemas['functions/env']);
const memoryStorage = req.app.get('memoryStorage');

Expand All @@ -169,44 +168,43 @@ router.put('/:namespace/:id/env/:env', bodyParser.json({ strict: false, limit: b
env,
} = req.params;

memoryStorage
.putCodeEnviromentVariable(namespace, id, env, req.body)
.then(() => {
res.status(204).end();
})
.catch((err) => {
log.error(`[${namespace}:${id}] Failed to set enviroment variable ${env}, error: ${err}`);
res.status(err.statusCode || 500).json({ error: err.message });
});
try {
await memoryStorage
.putCodeEnviromentVariable(namespace, id, env, req.body);
res.status(204).end();
} catch (err) {
log.error(`[${namespace}:${id}] Failed to set enviroment variable ${env}, error: ${err}`);
res.status(err.statusCode || 500).json({ error: err.message });
}
});

router.delete('/:namespace/:id/env/:env', (req, res) => {
router.delete('/:namespace/:id/env/:env', async (req, res) => {
const {
namespace,
id,
env,
} = req.params;
const memoryStorage = req.app.get('memoryStorage');

memoryStorage
.deleteCodeEnviromentVariable(namespace, id, env)
.then(() => {
res.status(204).end();
})
.catch((err) => {
log.error(`[${namespace}:${id}] Failed to unset enviroment variable ${env}, error: ${err}`);
res.status(err.statusCode || 500).json({ error: err.message });
});
try {
await memoryStorage
.deleteCodeEnviromentVariable(namespace, id, env);
res.status(204).end();
} catch (err) {
log.error(`[${namespace}:${id}] Failed to unset enviroment variable ${env}, error: ${err}`);
res.status(err.statusCode || 500).json({ error: err.message });
}
});

router.get('/:namespace/:id', (req, res) => {
router.get('/:namespace/:id', async (req, res) => {
const {
namespace,
id,
} = req.params;
const memoryStorage = req.app.get('memoryStorage');

memoryStorage.getCode(namespace, id).then((code) => {
try {
const code = await memoryStorage.getCode(namespace, id);
if (!code) {
const error = 'Code not found';
req.log.error(error);
Expand All @@ -219,88 +217,89 @@ router.get('/:namespace/:id', (req, res) => {
const functionsRequest = new FunctionsRequest(req);

new SchemaResponse(functionsRequest, res, 'functions/item').json(code);
}, (err) => {
} catch (err) {
req.log.error(`${err}`);
req.log.error(`${err.stack}`);
res.status(500).json({ error: err.message });
});
}
});


router.delete('/:namespace/:id', (req, res) => {
router.delete('/:namespace/:id', async (req, res) => {
const namespace = req.params.namespace;
const id = req.params.id;
const memoryStorage = req.app.get('memoryStorage');

memoryStorage.deleteCode(namespace, id).then(() => {
try {
await memoryStorage.deleteCode(namespace, id);
res.status(204).end();
}, (err) => {
} catch (err) {
req.log.error(`Failed to delete code id: ${err}`);
res.status(500).json({ error: err.message });
});
}
});


router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), (req, res) => {
router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), async (req, res) => {
const { namespace, id } = req.params;
const memoryStorage = req.app.get('memoryStorage');
const sandbox = req.app.get('sandbox');
const filename = codeFileName(namespace, id);
const metric = new Metric('function-run');
const logStorage = new DefaultLogStorage(namespace, id, req);

memoryStorage
.getCodeByCache(namespace, id, {
preCache: (code) => {
code.script = sandbox.compileCode(filename, code.code);
return code;
try {
const code = await memoryStorage.getCodeByCache(namespace, id, {
preCache: (preCode) => {
preCode.script = sandbox.compileCode(filename, preCode.code);
return preCode;
},
})
.then((code) => {
if (!code) {
const error = new Error(`Code '${namespace}/${id}' is not found`);
error.statusCode = 404;
throw error;
}
const options = {
console: logStorage.console,
env: code.env,
};
return sandbox.runScript(code.script, req, options);
})
.then((result) => {
res.set(result.headers);
res.status(result.status);
res.json(result.body);
const spent = metric.finish({
filename,
status: result.status,
});
logStorage.flush({
status: result.status,
requestTime: spent,
});
}, (err) => {
logStorage.console.error(`Failed to run function: ${err}`);
logStorage.console.error(err.stack);
const status = err.statusCode || 500;
res.status(status).json({ error: err.message });

const spent = metric.finish({
filename,
status,
error: err.message,
});

logStorage.flush({
status,
requestTime: spent,
});
});
if (!code) {
const error = new Error(`Code '${namespace}/${id}' is not found`);
error.statusCode = 404;
throw error;
}
const options = {
console: logStorage.console,
env: code.env,
};
const result = await sandbox.runScript(code.script, req, options);

res.set(result.headers);
res.status(result.status);
res.json(result.body);

const spent = metric.finish({
filename,
status: result.status,
});

logStorage.flush({
status: result.status,
requestTime: spent,
});
} catch (err) {
logStorage.console.error(`Failed to run function: ${err}`);
logStorage.console.error(err.stack);
const status = err.statusCode || 500;
res.status(status).json({ error: err.message });

const spent = metric.finish({
filename,
status,
error: err.message,
});

logStorage.flush({
status,
requestTime: spent,
});
}
});


router.put('/pipeline', bodyParser.json({ limit: bodyParserLimit }), (req, res) => {
router.put('/pipeline', bodyParser.json({ limit: bodyParserLimit }), async (req, res) => {
const memoryStorage = req.app.get('memoryStorage');
const sandbox = req.app.get('sandbox');

Expand All @@ -315,35 +314,33 @@ router.put('/pipeline', bodyParser.json({ limit: bodyParserLimit }), (req, res)
return { namespace, id };
});

memoryStorage
.getCodesByCache(steps, {
try {
const codes = await memoryStorage.getCodesByCache(steps, {
preCache: (code) => {
const filename = codeFileName(code.namespace, code.id);
code.script = sandbox.compileCode(filename, code.code);
return code;
},
})
.then((codes) => {
for (let i = 0; i < codes.length; i += 1) {
if (!codes[i]) {
const { namespace, id } = steps[i];
const e = new Error(`Code '${namespace}/${id}' is not found`);
e.statusCode = 404;
throw e;
}
});

for (let i = 0; i < codes.length; i += 1) {
if (!codes[i]) {
const { namespace, id } = steps[i];
const e = new Error(`Code '${namespace}/${id}' is not found`);
e.statusCode = 404;
throw e;
}
}

return new Pipeline(sandbox, req, codes).run();
})
.then((result) => {
res.set(result.headers);
res.status(result.status);
res.json(result.body);
})
.catch((err) => {
const status = err.statusCode || 500;
res.status(status).json({ error: err.message });
});
const result = await new Pipeline(sandbox, req, codes).run();

res.set(result.headers);
res.status(result.status);
res.json(result.body);
} catch (err) {
const status = err.statusCode || 500;
res.status(status).json({ error: err.message });
}
});

module.exports = router;
9 changes: 5 additions & 4 deletions lib/http/routers/HealthcheckRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ const log = require('../../support/log');
const router = new Router();


router.get('/', (req, res) => {
router.get('/', async (req, res) => {
const memoryStorage = req.app.get('memoryStorage');
memoryStorage.ping().then(() => {
try {
await memoryStorage.ping();
res.send('WORKING');
}, (err) => {
} catch (err) {
log.error(err);
res.status(500).send(`Error: ${err.message}`);
});
}
});

module.exports = router;

0 comments on commit 24eeaa4

Please sign in to comment.