(directory, client, sessionID)
| 910 | const current = loopOwnedUserMessageGuards.get(sessionID) || { pending: 0, until: 0, messageIDs: new Map }; |
| 911 | current.pending += 1; |
| 912 | current.until = Math.max(current.until || 0, now() + LOOP_OWNED_USER_MESSAGE_GUARD_MS); |
| 913 | for (const [messageID, expiresAt] of current.messageIDs.entries()) |
| 914 | if (expiresAt < now()) |
| 915 | current.messageIDs.delete(messageID); |
| 916 | loopOwnedUserMessageGuards.set(sessionID, current); |
| 917 | for (const [key, entry] of loopOwnedUserMessageGuards.entries()) { |
| 918 | for (const [messageID, expiresAt] of entry.messageIDs.entries()) |
| 919 | if (expiresAt < now()) |
| 920 | entry.messageIDs.delete(messageID); |
| 921 | if ((entry.pending || 0) <= 0 && entry.messageIDs.size === 0 && (entry.until || 0) < now()) |
| 922 | loopOwnedUserMessageGuards.delete(key); |
| 923 | } |
| 924 | } |
| 925 | function loopOwnedUserMessageGuardActive(sessionID, messageID) { |
| 926 | const entry = loopOwnedUserMessageGuards.get(sessionID); |
| 927 | if (!entry || typeof entry !== "object") |
| 928 | return false; |
| 929 | for (const [id2, expiresAt] of entry.messageIDs.entries()) |
| 930 | if (expiresAt < now()) |
| 931 | entry.messageIDs.delete(id2); |
| 932 | const id = typeof messageID === "string" ? messageID : ""; |
| 933 | if (id && entry.messageIDs.has(id)) |
| 934 | return true; |
| 935 | if ((entry.pending || 0) > 0 && (entry.until || 0) >= now()) { |
| 936 | if (!id) |
| 937 | return true; |
| 938 | entry.pending -= 1; |
no test coverage detected