UNPKG

@yawetse/pkgcloud

Version:

An infrastructure-as-a-service agnostic cloud library for node.js

100 lines (85 loc) 2.56 kB
/* * model.js: Base model from which all pkgcloud models inherit from * * (C) 2011 Charlie Robbins, Ken Perkins, Ross Kukulinski & the Contributors. * */ var events = require('eventemitter2'), util = require('util'); var Model = exports.Model = function (client, details) { events.EventEmitter2.call(this, { delimiter: '::', wildcard: true }); this.client = client; if (details) { this._setProperties(details); } }; util.inherits(Model, events.EventEmitter2); // ### function setWait (attributes, interval, callback) // // Continually polls resource and checks the // results against the attributes parameter. // When the attributes match the callback will be fired // // e.g. server.setWait({ status: 'RUNNING' }, 5000, function (err, resource) { // console.log('status is now running'); // }); // // #### @attributes {Object|Function} Attributes to match. Optionally provide a matching function // #### @* {*} **Optional** Key and expected value // #### @interval {Integer} Time between pools in ms. // #### @timeLimit {Integer} **Optional** Max time to spend executing // #### @callback {Function} f(err, resource). function setWait(attributes, interval, timeLimit, callback) { if (typeof timeLimit === 'function') { callback = timeLimit; timeLimit = null; } var self = this, start = Date.now(), fired = false, equalCheckId, current; equalCheckId = setInterval(function () { self.refresh(function (err, resource) { if (timeLimit) { current = Date.now(); if (current - start > timeLimit) { clearInterval(equalCheckId); if (!fired) { fired = true; callback(err, resource); return; } } } if (err) { return; } // Ignore errors var equal = true, keys = Object.keys(attributes); if (typeof attributes === 'function') { equal = attributes(resource); } else { for (var i = 0; i < keys.length; i++) { if (attributes[keys[i]] !== resource[keys[i]]) { equal = false; break; } } } if (equal) { clearInterval(equalCheckId); callback(null, resource); } }); }, interval); return equalCheckId; } // clear the interval function clear(intervalId) { clearInterval(intervalId); } Model.prototype.until = setWait; Model.prototype.setWait = setWait; Model.prototype.clearWait = clear;