UNPKG

zby-live-sdk

Version:

This is a live SDK for weclassroom.

151 lines (125 loc) 3.4 kB
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(); }; }