2016-06-24 06:52:45 +08:00
|
|
|
const Hapi = require('hapi');
|
|
|
|
const HapiWebSocket = require('hapi-plugin-websocket');
|
|
|
|
const Inert = require('inert');
|
2016-07-09 08:13:30 +08:00
|
|
|
const {DatabaseConnector, PubsubConnector, SchedulerUtils, Logger} = require(`nylas-core`);
|
2016-07-06 06:41:56 +08:00
|
|
|
const fs = require('fs');
|
|
|
|
const path = require('path');
|
2016-06-24 06:52:45 +08:00
|
|
|
|
|
|
|
global.Promise = require('bluebird');
|
2016-07-09 08:13:30 +08:00
|
|
|
global.Logger = Logger.createLogger('nylas-k2-dashboard')
|
2016-06-24 06:52:45 +08:00
|
|
|
|
|
|
|
const server = new Hapi.Server();
|
2016-07-08 07:05:44 +08:00
|
|
|
server.connection({ port: process.env.PORT });
|
2016-07-06 06:41:56 +08:00
|
|
|
|
|
|
|
const attach = (directory) => {
|
|
|
|
const routesDir = path.join(__dirname, directory)
|
|
|
|
fs.readdirSync(routesDir).forEach((filename) => {
|
|
|
|
if (filename.endsWith('.js')) {
|
|
|
|
const routeFactory = require(path.join(routesDir, filename));
|
|
|
|
routeFactory(server);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2016-07-14 01:57:05 +08:00
|
|
|
const onAccountsWebsocketConnected = (wss, ws) => {
|
|
|
|
DatabaseConnector.forShared().then(({Account}) => {
|
|
|
|
Account.findAll().then((accounts) => {
|
|
|
|
accounts.forEach((acct) => {
|
|
|
|
ws.send(JSON.stringify({ cmd: "ACCOUNT", payload: acct }));
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
this.observable = PubsubConnector.observeAllAccounts().subscribe((accountId) => {
|
|
|
|
Account.find({where: {id: accountId}}).then((acct) => {
|
|
|
|
ws.send(JSON.stringify({ cmd: "ACCOUNT", payload: acct }));
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
this.pollInterval = setInterval(() => {
|
|
|
|
SchedulerUtils.listActiveAccounts().then((accountIds) => {
|
|
|
|
ws.send(JSON.stringify({ cmd: "ACTIVE", payload: accountIds}))
|
|
|
|
});
|
|
|
|
const assignments = {};
|
|
|
|
SchedulerUtils.forEachAccountList((identity, accountIds) => {
|
|
|
|
for (const accountId of accountIds) {
|
|
|
|
assignments[accountId] = identity;
|
|
|
|
}
|
|
|
|
}).then(() =>
|
|
|
|
ws.send(JSON.stringify({ cmd: "ASSIGNMENTS", payload: assignments}))
|
|
|
|
)
|
|
|
|
}, 1000);
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
const onAccountsWebsocketConnectedFake = (wss, ws) => {
|
|
|
|
const accts = [];
|
|
|
|
for (let ii = 0; ii < 300; ii++) {
|
|
|
|
const acct = {
|
|
|
|
id: ii,
|
|
|
|
email_address: `halla+${ii}@nylas.com`,
|
|
|
|
object: "account",
|
|
|
|
organization_unit: "folder",
|
|
|
|
provider: "imap",
|
|
|
|
connection_settings: {
|
|
|
|
imap_host: "imap.mail.me.com",
|
|
|
|
imap_port: 993,
|
|
|
|
smtp_host: "smtp.mail.me.com",
|
|
|
|
smtp_port: 0,
|
|
|
|
ssl_required: true,
|
|
|
|
},
|
|
|
|
sync_policy: {
|
|
|
|
afterSync: "idle",
|
|
|
|
intervals: {
|
|
|
|
active: 30000,
|
|
|
|
inactive: 300000,
|
|
|
|
},
|
|
|
|
folderSyncOptions: {
|
|
|
|
deepFolderScan: 600000,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
sync_error: null,
|
|
|
|
first_sync_completion: 0,
|
|
|
|
last_sync_completions: [],
|
|
|
|
created_at: "2016-07-13T00:49:25.000Z",
|
|
|
|
};
|
|
|
|
ws.send(JSON.stringify({ cmd: "ACCOUNT", payload: acct }));
|
|
|
|
accts.push(acct);
|
|
|
|
}
|
|
|
|
setInterval(() => {
|
|
|
|
const acct = accts[Math.floor(Math.random() * accts.length)];
|
|
|
|
ws.send(JSON.stringify({ cmd: "ACCOUNT", payload: acct }));
|
|
|
|
}, 250);
|
|
|
|
}
|
|
|
|
|
2016-07-09 05:55:12 +08:00
|
|
|
server.register([HapiWebSocket, Inert], () => {
|
|
|
|
attach('./routes/')
|
2016-07-06 06:41:56 +08:00
|
|
|
|
2016-07-09 05:55:12 +08:00
|
|
|
server.route({
|
|
|
|
method: "POST",
|
|
|
|
path: "/accounts",
|
|
|
|
config: {
|
|
|
|
plugins: {
|
|
|
|
websocket: {
|
|
|
|
only: true,
|
2016-07-14 01:57:05 +08:00
|
|
|
connect: onAccountsWebsocketConnectedFake,
|
|
|
|
disconnect: function disconnect() {
|
2016-07-09 05:55:12 +08:00
|
|
|
clearInterval(this.pollInterval);
|
|
|
|
this.observable.dispose();
|
2016-06-24 06:52:45 +08:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2016-07-09 05:55:12 +08:00
|
|
|
},
|
|
|
|
handler: (request, reply) => {
|
|
|
|
if (request.payload.cmd === "PING") {
|
|
|
|
reply(JSON.stringify({ result: "PONG" }));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
});
|
2016-06-24 06:52:45 +08:00
|
|
|
|
2016-07-09 05:55:12 +08:00
|
|
|
server.route({
|
|
|
|
method: 'GET',
|
|
|
|
path: '/ping',
|
|
|
|
config: {
|
|
|
|
auth: false,
|
|
|
|
},
|
|
|
|
handler: (request, reply) => {
|
|
|
|
console.log("---> Ping!")
|
|
|
|
reply("pong")
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
server.route({
|
|
|
|
method: 'GET',
|
|
|
|
path: '/{param*}',
|
|
|
|
handler: {
|
|
|
|
directory: {
|
|
|
|
path: require('path').join(__dirname, 'public'),
|
2016-06-24 06:52:45 +08:00
|
|
|
},
|
2016-07-09 05:55:12 +08:00
|
|
|
},
|
|
|
|
});
|
2016-06-24 06:52:45 +08:00
|
|
|
|
2016-07-09 05:55:12 +08:00
|
|
|
server.start((startErr) => {
|
|
|
|
if (startErr) { throw startErr; }
|
2016-07-09 08:13:30 +08:00
|
|
|
global.Logger.info({uri: server.info.uri}, 'Dashboard running');
|
2016-06-24 06:52:45 +08:00
|
|
|
});
|
|
|
|
});
|