Files
2026-07-13 12:06:16 +08:00

123 lines
2.8 KiB
JavaScript

/*jslint node: true */
"use strict";
var util = require('util'),
qlobber = require('..'),
Qlobber = qlobber.Qlobber;
function QlobberSub (options)
{
Qlobber.call(this, options);
this.subscriptionsCount = 0;
}
util.inherits(QlobberSub, Qlobber);
QlobberSub.prototype._initial_value = function (val)
{
this.subscriptionsCount += 1;
let r = {
topic: val.topic,
clientMap: new Map().set(val.clientId, { qos: val.qos, rh: val.rh, rap: val.rap, nl: val.nl }),
};
r[Symbol.iterator] = function* (topic)
{
if (topic === undefined)
{
for (let [clientId, sub] of r.clientMap)
{
yield { topic: r.topic, clientId, ...sub };
}
}
else if (r.topic === topic)
{
for (let [clientId, sub] of r.clientMap)
{
yield { clientId, ...sub };
}
}
};
return r;
};
QlobberSub.prototype._add_value = function (existing, val)
{
var clientMap = existing.clientMap,
size = clientMap.size;
clientMap.set(val.clientId, { qos: val.qos, rh: val.rh, rap: val.rap, nl: val.nl });
if (clientMap.size > size)
{
this.subscriptionsCount += 1;
}
};
QlobberSub.prototype._add_values = function (dest, existing, topic)
{
if (topic === undefined)
{
for (let [clientId, sub] of existing.clientMap)
{
dest.push({ clientId, topic: existing.topic, ...sub });
}
}
else if (existing.topic === topic)
{
for (let [clientId, sub] of existing.clientMap)
{
dest.push({ clientId,...sub });
}
}
};
QlobberSub.prototype._remove_value = function (existing, val)
{
var clientMap = existing.clientMap,
size_before = clientMap.size;
clientMap.delete(val.clientId);
var size_after = clientMap.size;
if (size_after < size_before)
{
this.subscriptionsCount -= 1;
}
return size_after === 0;
};
// Returns whether client is last subscriber to topic
QlobberSub.prototype.test_values = function (existing, val)
{
var clientMap = existing.clientMap;
return (existing.topic === val.topic) &&
(clientMap.size === 1) &&
clientMap.has(val.clientId);
};
QlobberSub.prototype.match = function (topic, ctx)
{
return this._match([], 0, topic.split(this._separator), this._trie, ctx);
};
QlobberSub.prototype.clear = function ()
{
this.subscriptionsCount = 0;
return Qlobber.prototype.clear.call(this);
};
QlobberSub.set_native = function (qlobber_native)
{
const wrap_native = require('../lib/wrap_native.js');
QlobberSub.native = wrap_native(qlobber_native.QlobberSub, QlobberSub);
return module.exports;
};
module.exports = QlobberSub;