text: 'use strict';
  
  var cluster = require('cluster');
  
  console.log("[Worker #" + cluster.worker.id + "]");
  
  function testSelect(client) {
    var PromiseA = require('bluebird');
  
    return new PromiseA(function (resolve, reject) {
      client.run('CREATE TABLE IF NOT EXISTS meta (version TEXT)', function (err) {
        if (err) {
          if ('E_NO_INIT' === err.code) {
            console.error(err.message);
            resolve(client);
            return;
          }
  
          reject(err);
          return;
        }
  
        client.get("SELECT version FROM meta", [], function (err, result) {
          if (err) {
            console.error('[ERROR] create table', cluster.isMaster && '0' || cluster.worker.id);
            console.error(err.stack || err);
            reject(err);
            return;
          }
  
          console.log('Worker #', (cluster.isMaster && '0' || cluster.worker.id), '[this], [result]:');
          console.log(this);
          console.log(result);
  
          resolve(client);
        });
      });
    });
  }
  
  function run(clientFactory) {
    return clientFactory.create({
        init: false
      , dbname: 'factory.' + cluster.worker.id
    });
  }
  
  function init(client) {
    return client.init({
      algorithm: 'aes'
    , bits: 128
    , mode: 'cbc'
    , key: '00000000000000000000000000000000'
    }).then(function (/*db*/) {
      return client;
    });
  }
  
  function onMessage(msg) {
    function loseTheWillToLive() {
      process.removeListener('message', onMessage);
      // child processes do not exit when their event loop is empty
      setTimeout(function () {
        console.log('#' + cluster.worker.id + ' dead');
        process.exit(0);
      }, 100);
    }
  
    var clientFactory = require('../../client').createClientFactory({
        algorithm: 'aes'
      , bits: 128
      , mode: 'cbc'
      , dirname: '/tmp/'
      , prefix: 'foobar.'
      //, dbname: 'cluster'
      , suffix: '.test'
      , ext: '.sqlcipher'
      , sock: msg.sock
      , ipcKey: msg.ipcKey
    });
  
    console.log('New Worker', cluster.worker.id, msg);
    if (1 === cluster.worker.id) {
      //setTimeout(function () {
        run(clientFactory).then(testSelect).then(function (client) {
          setTimeout(function () {
            console.log('init worker closing...');
            client.close(loseTheWillToLive);
            loseTheWillToLive();
          }, 1000);
          // waiting for https://github.com/websockets/ws/issues/613 to land
        });
      //}, 1000);
    } else {
      setTimeout(function () {
        run(clientFactory).then(init).then(testSelect).then(function (client) {
          console.log('#' + cluster.worker.id + ' other working closing...');
          client.close(loseTheWillToLive);
          loseTheWillToLive();
        });
      }, 100 * cluster.worker.id);
    }
  }
  process.on('message', onMessage);
  
  // The native Promise implementation ignores errors because... dumbness???
  process.on('beforeExit', function () {
    console.log("[WORKER] I've got nothing left to do");
  });
  process.on('unhandledRejection', function (err) {
    console.error('Unhandled Promise Rejection');
    console.error(err.stack || err);
  
    process.exit(1);
  });
  