feat: add service lock file and multi-worker startup guard with session cache clear

This commit is contained in:
2026-06-02 21:17:51 +00:00
parent a136287d36
commit 13870d3219
30 changed files with 406 additions and 103 deletions
+10 -3
View File
@@ -1,7 +1,14 @@
export class Avatar {
static imgHtml(username, size = 24) {
const url = `/avatar/multiavatar/${encodeURIComponent(username)}?size=${size}`;
return `<img src="${url}" class="avatar-img" style="width:${size}px;height:${size}px;border-radius:50%" alt="" loading="lazy">`;
static imgElement(username, size = 24) {
const img = document.createElement("img");
img.src = `/avatar/multiavatar/${encodeURIComponent(username)}?size=${size}`;
img.className = "avatar-img";
img.style.width = `${size}px`;
img.style.height = `${size}px`;
img.style.borderRadius = "50%";
img.alt = "";
img.loading = "lazy";
return img;
}
}
+3 -1
View File
@@ -75,7 +75,9 @@ export class MentionInput {
item.type = "button";
item.className = "mention-dropdown-item";
item.dataset.username = r.username;
item.innerHTML = Avatar.imgHtml(r.username) + "<span>@" + r.username + "</span>";
const label = document.createElement("span");
label.textContent = "@" + r.username;
item.append(Avatar.imgElement(r.username), label);
item.addEventListener("mousedown", (e) => {
e.preventDefault();
this.insert(r.username);
+3 -1
View File
@@ -41,7 +41,9 @@ export class MessageSearch {
const item = document.createElement("a");
item.className = "search-dropdown-item";
item.href = `/messages?with_uid=${r.uid}`;
item.innerHTML = `${Avatar.imgHtml(r.username)}<span>${r.username}</span>`;
const label = document.createElement("span");
label.textContent = r.username;
item.append(Avatar.imgElement(r.username), label);
dropdown.appendChild(item);
}
DomUtils.show(dropdown);
+2 -1
View File
@@ -34,6 +34,7 @@ export class ProfileEditor {
const tag = document.createElement("span");
tag.className = "platform-tag";
tag.textContent = val;
tag.dataset.value = val;
const remove = document.createElement("button");
remove.type = "button";
remove.textContent = "x";
@@ -57,7 +58,7 @@ export class ProfileEditor {
const updatePlatforms = () => {
const values = [];
tagsContainer.querySelectorAll(".platform-tag").forEach((t) => {
values.push(t.textContent.replace("x", "").trim());
values.push(t.dataset.value);
});
hiddenInput.value = values.join(",");
};