summaryrefslogtreecommitdiff
path: root/service_skeleton.js
diff options
context:
space:
mode:
Diffstat (limited to 'service_skeleton.js')
-rw-r--r--service_skeleton.js73
1 files changed, 73 insertions, 0 deletions
diff --git a/service_skeleton.js b/service_skeleton.js
new file mode 100644
index 0000000..1dc9a3b
--- /dev/null
+++ b/service_skeleton.js
@@ -0,0 +1,73 @@
+#!/usr/bin/env node
+/* jshint esnext: true */
+"use strict";
+
+const Promise = require("bluebird");
+
+const logger = global.logger,
+ KEY_TYPE = process.env.KEY_TYPE || "crunch"; // backwards compat
+
+module.exports = class Service {
+ setRoutes(routes) { // route str -> func
+ this.routes = new Map(Object.entries(routes));
+ }
+
+ setDatabases(dbs, defaultDb) { // mode str -> Sequelize
+ this.dbs = new Map(Object.entries(dbs));
+ }
+ getDatabase(category) {
+ if (!this.dbs.has(category))
+ logger.error("unsupported database category");
+ return this.dbs.get(category);
+ }
+
+ async register(rmqChannel, expressApp) { // assert queues, initialize routes
+ this.notify = async (topic, msg) =>
+ await rmqChannel.publish("amq.topic", topic, new Buffer(msg));
+ this.forward = async (queue, payload, options) =>
+ await rmqChannel.sendToQueue(queue, new Buffer(payload), options);
+
+ await Promise.all(this.targets, (queue) =>
+ rmqChannel.assertQueue(queue, { durable: true }));
+
+ for(let [route, func] of this.routes) {
+ expressApp.post(route, func);
+ }
+ }
+
+ setTargets(queues) { // set channels messages can be forwarded to, str -> str
+ this.targets = new Map(Object.entries(queues));
+ }
+ getTarget(category) { // return channel for category
+ if (!this.targets.has(category))
+ logger.error("unsupported queue category", category);
+ return this.targets.get(category);
+ }
+
+ // return an entry from keys db
+ async getKey(category, key, default_value) {
+ const db = this.getDatabase(category),
+ record = await db.Keys.findOrCreate({
+ where: {
+ type: KEY_TYPE,
+ key: key
+ },
+ defaults: { value: default_value }
+ });
+ return record[0].value;
+ }
+
+ // update an entry from keys db
+ async setKey(category, key, value) {
+ const db = this.getDatabase(category),
+ record = await db.Keys.findOrCreate({
+ where: {
+ type: KEY_TYPE,
+ key: key
+ },
+ defaults: { value: value }
+ });
+ record[0].update({ value: value });
+ return value;
+ }
+}