42 lines
1.1 KiB
JavaScript
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;
|