syndicate-2017/js/src/ack.js

42 lines
1.1 KiB
JavaScript

// Utility protocol for measuring when a stateChange takes effect.
var RandomID = require('./randomid.js');
var Dataspace = require('./dataspace.js').Dataspace;
var Struct = require('./struct.js');
var Patch = require('./patch.js');
var ack = Struct.makeConstructor('ack', ['id']);
function Ack(metaLevel, id) {
this.metaLevel = metaLevel || 0;
this.id = id || RandomID.randomId(16);
this.done = false;
}
Ack.prototype.arm = function () {
Dataspace.stateChange(Patch.sub(ack(this.id), this.metaLevel));
Dataspace.send(ack(this.id), this.metaLevel);
};
Ack.prototype.disarm = function () {
Dataspace.stateChange(Patch.unsub(ack(this.id), this.metaLevel));
};
Ack.prototype.check = function (e) {
if (!this.done) {
if (e.type === 'message') {
var m = Patch.stripAtMeta(e.message, this.metaLevel);
if (ack.isClassOf(m) && m[0] === this.id) {
this.disarm();
this.done = true;
}
}
}
return this.done;
};
///////////////////////////////////////////////////////////////////////////
module.exports.ack = ack;
module.exports.Ack = Ack;