zby-live-sdk
Version:
This is a live SDK for weclassroom.
151 lines (125 loc) • 3.4 kB
JavaScript
function DoubleLinkList() {
function DNode(data) {
this.data = data;
this.next = null;
this.prev = null;
}
this.head = null;
this.tail = null;
this.length = 0;
this.insert_head = function (data) {
var temp_node = new DNode(data);
if (this.head == null) {
this.head = temp_node;
this.tail = temp_node;
} else {
temp_node.next = this.head;
this.head.prev = temp_node;
this.head = temp_node;
}
this.length += 1;
return temp_node;
};
this.insert_tail = function (data) {
var node = new DNode(data);
if (this.tail == null) {
this.head = node;
this.tail = node;
} else {
node.prev = this.tail;
this.tail.next = node;
this.tail = node;
}
this.length += 1;
return node;
};
this.delete = function (node) {
if (node.prev != null && node.next != null) {
node.prev.next = node.next;
node.next.prev = node.prev;
} else if (node.prev != null) {
this.tail = node.prev;
this.tail.next = null;
} else if (node.next != null) {
this.head = node.next;
this.head.prev = null;
} else {
this.head = null;
this.tail = null;
}
this.length -= 1;
};
this.touch = function (node) {
if (node.prev != null && node.next != null) {
node.prev.next = node.next;
node.next.prev = node.prev;
} else if (node.prev != null) {
this.tail = node.prev;
this.tail.next = null;
} else if (node.next != null) {
this.head = node.next;
this.head.prev = null;
} else {
this.head = null;
this.tail = null;
}
node.prev = null;
node.next = null;
if (this.tail == null) {
this.head = node;
this.tail = node;
} else {
node.prev = this.tail;
this.tail.next = node;
this.tail = node;
}
};
this.getLength = function () {
return this.length;
};
this.getHead = function () {
return this.head;
};
this.getTail = function () {
return this.tail;
};
}
export default function LatestQueue() {
this.latestDList = new DoubleLinkList();
this.latestDict = {};
function LatestNode(msgId, timestamp) {
this.msgId = msgId;
this.timestamp = timestamp;
}
this.insert = function (msgId, timestamp) {
if (this.latestDict[msgId]) {
return;
}
const latestNode = new LatestNode(msgId, timestamp);
this.latestDList.insert_tail(latestNode);
this.latestDict[msgId] = latestNode;
};
this.isRepeat = function (msgId) {
return !!this.latestDict[msgId];
};
this.delete = function (latestInterval, maxDeleteNum) {
let tempDNode = this.latestDList.getHead();
let currentDeleteNum = 0;
let currentTimeStamp = Date.now();
while (tempDNode != null) {
if (currentTimeStamp - tempDNode.data.timestamp >= latestInterval) {
delete this.latestDict[tempDNode.data.msgId];
this.latestDList.delete(tempDNode);
currentDeleteNum += 1;
}
if (currentDeleteNum >= maxDeleteNum) {
break;
}
tempDNode = tempDNode.next;
}
return currentDeleteNum;
};
this.getLength = function () {
return this.latestDList.getLength();
};
}