Skip to content

enhance: カスタム絵文字の更新をサーバーに確認してクライアントキャッシュを更新するように#17758

Open
kakkokari-gtyih wants to merge 4 commits into
misskey-dev:developfrom
kakkokari-gtyih:fix-16624
Open

enhance: カスタム絵文字の更新をサーバーに確認してクライアントキャッシュを更新するように#17758
kakkokari-gtyih wants to merge 4 commits into
misskey-dev:developfrom
kakkokari-gtyih:fix-16624

Conversation

@kakkokari-gtyih

@kakkokari-gtyih kakkokari-gtyih commented Jul 20, 2026

Copy link
Copy Markdown
Member

What

  • ローカル絵文字の最終更新日と件数を返すAPI emojis/stats を追加
  • ローカルの絵文字キャッシュの更新を、このAPIの値により判断して行うように
    • 60分の制限を撤廃し、代わりにこのチェックによりキャッシュを更新する
    • 場合によってはキャッシュの更新が最低限で済むようになり、通信量削減につながる
  • customEmojisMap をリアクティブにして、カスタム絵文字の更新をバックグラウンドで行うように(初回は待たせる)
    • 場合によっては起動の高速化につながる

Why

Fix #16624

  • クライアントを閉じている間に追加・変更されたカスタム絵文字が、クライアントのキャッシュを削除するか期限切れになるまで反映されない問題を修正

Additional info (optional)

DBにインデックスを張るべきかどうかはわからなかったので詳しい方に聞く必要がある(メモリキャッシュは既に入れてあるが…)

CREATE INDEX "IDX_EMOJI_LOCAL_UPDATED_AT" ON "emoji" ("updatedAt") WHERE "host" IS NULL;

Checklist

  • Read the contribution guide
  • Test working in a local environment
  • (If needed) Add story of storybook
  • (If needed) Update CHANGELOG.md
  • (If possible) Add tests

@dosubot dosubot Bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Jul 20, 2026
@github-actions github-actions Bot added packages/frontend Client side specific issue/PR packages/backend Server side specific issue/PR packages/misskey-js labels Jul 20, 2026
@coderabbitai

coderabbitai Bot commented Jul 20, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 45f4a8b2-7a02-4ce5-8469-ad244eb9b2a2

📥 Commits

Reviewing files that changed from the base of the PR and between edcd70f and 9f06d5f.

📒 Files selected for processing (1)
  • packages/frontend/src/custom-emojis.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/frontend/src/custom-emojis.ts

📝 Walkthrough

Walkthrough

Changes

カスタム絵文字同期

Layer / File(s) Summary
ローカル絵文字統計API
packages/backend/src/core/CustomEmojiService.ts, packages/backend/src/server/api/...
ローカル絵文字の件数と最終更新日時を集計・キャッシュし、emojis/stats から返す処理を追加しました。変更時には統計キャッシュも無効化されます。
統計APIのクライアント型定義
packages/misskey-js/src/autogen/*, packages/misskey-js/etc/misskey-js.api.md
emojis/stats のOpenAPI定義、レスポンス型、エンドポイント型、APIClient定義を追加しました。
統計による絵文字キャッシュ同期
packages/frontend/src/custom-emojis.ts, packages/frontend/src/boot/common.ts
統計値で更新要否を判定し、初期取得の待機、取得中に届いた更新の適用、キャッシュ保存を変更しました。
リアクティブ絵文字参照の更新
packages/frontend/src/components/*, CHANGELOG.md
絵文字マップをリアクティブな値から参照する形に統一し、検索・表示・リアクション処理と変更履歴を更新しました。

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant CustomEmojis
  participant EmojisStatsAPI
  participant EmojiStream
  Client->>CustomEmojis: 絵文字同期を開始
  CustomEmojis->>EmojisStatsAPI: emojis/stats を要求
  EmojisStatsAPI-->>CustomEmojis: count / lastUpdatedAt
  CustomEmojis->>EmojisStatsAPI: 絵文字一覧を取得
  EmojiStream-->>CustomEmojis: 取得中の追加・更新・削除
  CustomEmojis-->>Client: 最新一覧と更新を反映
Loading

Poem

絵文字の雲を数えれば
新しい輝きすぐわかる
キャッシュの扉をそっと開き
リアクティブな地図を描く
今日も笑顔が、ぴこっ ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed 主要変更であるカスタム絵文字の更新反映とキャッシュ更新の改善を端的に示しており、内容に合っています。
Description check ✅ Passed What/Why/Additional info/Checklist が揃っており、必要項目は概ね埋まっています。
Linked Issues check ✅ Passed ローカル絵文字の統計API追加、キャッシュ更新の判定変更、更新未受信時の反映改善が issue #16624 の目的に合致しています。
Out of Scope Changes check ✅ Passed 変更はAPI、クライアントキャッシュ、関連型定義、CHANGELOG に収まっており、明らかな逸脱は見当たりません。
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint install failed. For unrecoverable errors, disable the tool in CodeRabbit configuration.


Comment @coderabbitai help to get the list of available commands.

@codecov

codecov Bot commented Jul 20, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 7.46269% with 62 lines in your changes missing coverage. Please review.
✅ Project coverage is 26.43%. Comparing base (ab36978) to head (9f06d5f).

Files with missing lines Patch % Lines
packages/frontend/src/custom-emojis.ts 13.79% 22 Missing and 3 partials ⚠️
packages/backend/src/core/CustomEmojiService.ts 5.26% 18 Missing ⚠️
...s/backend/src/server/api/endpoints/emojis/stats.ts 0.00% 9 Missing and 1 partial ⚠️
packages/frontend/src/components/MkEmojiPicker.vue 0.00% 2 Missing and 2 partials ⚠️
...tend/src/components/MkReactionsViewer.reaction.vue 0.00% 2 Missing and 1 partial ⚠️
...ages/frontend/src/components/MkReactionsViewer.vue 0.00% 0 Missing and 1 partial ⚠️
...s/frontend/src/components/global/MkCustomEmoji.vue 0.00% 0 Missing and 1 partial ⚠️
Additional details and impacted files
@@             Coverage Diff             @@
##           develop   #17758      +/-   ##
===========================================
+ Coverage    26.16%   26.43%   +0.26%     
===========================================
  Files         1182     1185       +3     
  Lines        40178    40418     +240     
  Branches     11106    11151      +45     
===========================================
+ Hits         10513    10684     +171     
- Misses       23794    23859      +65     
- Partials      5871     5875       +4     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions

github-actions Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

このPRによるapi.jsonの差分

差分はこちら
--- base
+++ head
@@ -43891,6 +43891,153 @@
         }
       }
     },
+    "/emojis/stats": {
+      "post": {
+        "operationId": "post___emojis___stats",
+        "summary": "emojis/stats",
+        "description": "No description provided.\n\n**Credential required**: *No*",
+        "externalDocs": {
+          "description": "Source code",
+          "url": "https://github.com/misskey-dev/misskey/blob/develop/packages/backend/src/server/api/endpoints/emojis/stats.ts"
+        },
+        "tags": [
+          "meta"
+        ],
+        "responses": {
+          "200": {
+            "description": "OK (with results)",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "object",
+                  "properties": {
+                    "count": {
+                      "type": "number"
+                    },
+                    "lastUpdatedAt": {
+                      "type": [
+                        "string",
+                        "null"
+                      ],
+                      "format": "date-time"
+                    }
+                  },
+                  "required": [
+                    "count",
+                    "lastUpdatedAt"
+                  ]
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Client error",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/Error"
+                },
+                "examples": {
+                  "INVALID_PARAM": {
+                    "value": {
+                      "error": {
+                        "message": "Invalid param.",
+                        "code": "INVALID_PARAM",
+                        "id": "3d81ceae-475f-4600-b2a8-2bc116157532"
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          },
+          "401": {
+            "description": "Authentication error",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/Error"
+                },
+                "examples": {
+                  "CREDENTIAL_REQUIRED": {
+                    "value": {
+                      "error": {
+                        "message": "Credential required.",
+                        "code": "CREDENTIAL_REQUIRED",
+                        "id": "1384574d-a912-4b81-8601-c7b1c4085df1"
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Forbidden error",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/Error"
+                },
+                "examples": {
+                  "AUTHENTICATION_FAILED": {
+                    "value": {
+                      "error": {
+                        "message": "Authentication failed. Please ensure your token is correct.",
+                        "code": "AUTHENTICATION_FAILED",
+                        "id": "b0a7f5f8-dc2f-4171-b91f-de88ad238e14"
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          },
+          "418": {
+            "description": "I'm Ai",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/Error"
+                },
+                "examples": {
+                  "I_AM_AI": {
+                    "value": {
+                      "error": {
+                        "message": "You sent a request to Ai-chan, Misskey's showgirl, instead of the server.",
+                        "code": "I_AM_AI",
+                        "id": "60c46cd1-f23a-46b1-bebe-5d2b73951a84"
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          },
+          "500": {
+            "description": "Internal server error",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/Error"
+                },
+                "examples": {
+                  "INTERNAL_ERROR": {
+                    "value": {
+                      "error": {
+                        "message": "Internal error occurred. Please contact us if the error persists.",
+                        "code": "INTERNAL_ERROR",
+                        "id": "5d37dbcb-891e-41ca-a3d6-e690c97775ac"
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    },
     "/endpoint": {
       "post": {
         "operationId": "post___endpoint",

Get diff files from Workflow Page

@github-actions

github-actions Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

📦 Frontend Bundle Report

Chunk size diff (4 updated, 0 added, 0 removed)
Chunk Before After Δ Δ (%)
(total) 5.8 MB 5.8 MB $\text{+188 B}$ $\text{+0\%}$
src/_boot_.ts ja-JP/DcZQZQvov-D21PamQZ.js → ja-JP/DcZQZQvov-Cov07ZEC.js
64 KB 64 KB $\text{+36 B}$ $\text{+0.1\%}$
(other generated chunks) 2 MB 2 MB $\text{+154 B}$ $\text{+0\%}$
(other) 61 KB 61 KB $\text{-2 B}$ $\text{-0\%}$
Startup chunk size (1 updated, 0 added, 0 removed)
Chunk Before After Δ Δ (%)
(total) 1 MB 1 MB $\text{+185 B}$ $\text{+0\%}$
src/_boot_.ts ja-JP/DcZQZQvov-D21PamQZ.js → ja-JP/DcZQZQvov-Cov07ZEC.js
64 KB 64 KB $\text{+36 B}$ $\text{+0.1\%}$
(other generated chunks) 754 KB 754 KB $\text{+149 B}$ $\text{+0\%}$
(other) 216 KB 216 KB 0 B 0%

Startup chunks are the Vite entry for src/_boot_.ts and its static imports.

Bundle Stats

Bundles Modules Entries Imports Size
Static Dynamic Rendered Gzip Brotli
Before 468 2,865 21 10,661 330 10 MB 2.8 MB 2.4 MB
After 468 2,865 21 10,661 330 10 MB 2.8 MB 2.4 MB
Δ 0 0 0 0 0 $\text{+368 B}$ $\text{+67 B}$ $\text{+148 B}$
Δ (%) 0% 0% 0% 0% 0% $\text{+0\%}$ $\text{+0\%}$ $\text{+0\%}$

Open treemap HTML

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@CHANGELOG.md`:
- Line 20: CHANGELOG.md の 2026.7.0 配下にあるカスタム絵文字キャッシュ修正の Fix 項目を、## Unreleased
配下の該当する ### General または ### Client
サブセクションへ移動してください。項目の内容は変更せず、リリース前のユーザー影響変更として1行の - Fix: 形式で保持してください。

In `@packages/backend/src/core/CustomEmojiService.ts`:
- Line 68: Invalidate localEmojisStatsCache after successful database updates in
add, update, every bulk update, and delete, alongside
localEmojisCache.refresh(). For multi-process deployments, use the existing
shared-cache or invalidation-notification mechanism so each process clears its
independent stats cache.

In `@packages/frontend/src/components/MkEmojiPicker.vue`:
- Around line 260-261: Update the watch source in
packages/frontend/src/components/MkEmojiPicker.vue lines 260-261 to include
customEmojis or customEmojisMap, ensuring existing query results are
recalculated when custom emojis change. Also update the reaction-list watch
source in packages/frontend/src/components/MkReactionsViewer.vue line 79 to
include customEmojisMap so the list is re-sorted based on current availability.

In `@packages/frontend/src/custom-emojis.ts`:
- Around line 58-66: Update fetchCustomEmojis so the emoji list and emojisStats
are committed only when they represent the same revision: either use an API
response contract that returns a revision shared by the stats and list requests,
or refetch and verify the stats remain unchanged after retrieving the list
before calling setCustomEmojis and set('emojisStats', ...). Prevent an older
list response from overwriting newer event-applied state.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 6b233b74-c0c1-468b-a816-eaee347590e8

📥 Commits

Reviewing files that changed from the base of the PR and between ab36978 and 5092984.

📒 Files selected for processing (15)
  • CHANGELOG.md
  • packages/backend/src/core/CustomEmojiService.ts
  • packages/backend/src/server/api/endpoint-list.ts
  • packages/backend/src/server/api/endpoints/emojis/stats.ts
  • packages/frontend/src/boot/common.ts
  • packages/frontend/src/components/MkEmojiPicker.vue
  • packages/frontend/src/components/MkReactionsViewer.reaction.vue
  • packages/frontend/src/components/MkReactionsViewer.vue
  • packages/frontend/src/components/global/MkCustomEmoji.vue
  • packages/frontend/src/custom-emojis.ts
  • packages/misskey-js/etc/misskey-js.api.md
  • packages/misskey-js/src/autogen/apiClientJSDoc.ts
  • packages/misskey-js/src/autogen/endpoint.ts
  • packages/misskey-js/src/autogen/entities.ts
  • packages/misskey-js/src/autogen/types.ts

Comment thread CHANGELOG.md
Comment thread packages/backend/src/core/CustomEmojiService.ts
Comment thread packages/frontend/src/components/MkEmojiPicker.vue
Comment thread packages/frontend/src/custom-emojis.ts Outdated
@github-actions

github-actions Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

⚙️ Backend Diagnostics Report

Memory: After GC

Metric Base Head Δ median Δ MAD Δ min Δ max
HeapUsed 72.2 MB
± 0 MB
72.2 MB
± 0 MB
$\text{+0 MB}$
$\text{+0\%}$
0 MB $\text{+0 MB}$ $\text{+0.1 MB}$
PSS 274.4 MB
± 0.8 MB
274.1 MB
± 2.8 MB
$\color{green}{\text{-0.3 MB}}$
$\text{-0.1\%}$
3 MB $\color{green}{\text{-6.3 MB}}$ $\color{orange}{\text{+5.8 MB}}$
USS 258.1 MB
± 0.8 MB
257.8 MB
± 2.8 MB
$\color{green}{\text{-0.3 MB}}$
$\color{green}{\text{-0.1\%}}$
3 MB $\color{green}{\text{-6.3 MB}}$ $\color{orange}{\text{+5.8 MB}}$
External 8.8 MB
± 0 MB
8.8 MB
± 0 MB
$\text{+0 MB}$
$\text{+0\%}$
0 MB $\text{+0 MB}$ $\text{+0 MB}$

V8 Heap Snapshot Statistics

Metric Base Head Δ median Δ MAD Δ min Δ max
$\color{gray}{\rule{8pt}{8pt}}$ Total 86 MB
± 4.3 KB
86 MB
± 3.1 KB
$\text{+32 KB}$
$\text{+0\%}$
5 KB $\text{+24 KB}$ $\text{+60 KB}$
$\color{orange}{\rule{8pt}{8pt}}$ Code28.7% → 28.7%
25 MB 25 MB $\text{+7.4 KB}$ 1.9 KB $\text{-5.5 KB}$ $\text{+31 KB}$
$\color{red}{\rule{8pt}{8pt}}$ Strings34.9% → 34.9%
30 MB 30 MB $\text{+4.4 KB}$ 764 B $\text{+2.1 KB}$ $\text{+6.4 KB}$
$\color{cyan}{\rule{8pt}{8pt}}$ JS arrays4.8% → 4.8%
4.1 MB 4.1 MB $\text{+5 KB}$ 0 B $\text{+5 KB}$ $\text{+5 KB}$
$\color{green}{\rule{8pt}{8pt}}$ Typed arrays0.6% → 0.6%
533 KB 533 KB 0 B 0 B 0 B 0 B
$\color{yellow}{\rule{8pt}{8pt}}$ System objects2.6% → 2.6%
2.2 MB 2.2 MB $\text{+976 B}$ 420 B $\text{-1.5 KB}$ $\text{+5.3 KB}$
$\color{violet}{\rule{8pt}{8pt}}$ Other JS objs28.2% → 28.2%
24 MB 24 MB $\text{+15 KB}$ 124 B $\text{+11 KB}$ $\text{+20 KB}$
$\color{pink}{\rule{8pt}{8pt}}$ Other non-JS objs0% → 0%
39 KB 39 KB 0 B 0 B 0 B 0 B

Download representative heap snapshot: base / head

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (1)
packages/backend/src/core/CustomEmojiService.ts (1)

68-68: ⚠️ Potential issue | 🟠 Major

複数プロセス環境では統計キャッシュの無効化がまだ不十分です。

MemorySingleCache はプロセス内メモリのみを無効化するため、更新を処理したプロセス以外では /emojis/stats が最大3分間、古い count / lastUpdatedAt を返します。複数Backendプロセスをサポートする場合は、共有キャッシュまたはサーバー間の無効化通知を利用してください。単一プロセス運用が前提であれば、その制約を確認してください。

Also applies to: 83-83, 101-101

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/backend/src/core/CustomEmojiService.ts` at line 68, Replace the
process-local localEmojisStatsCache used by CustomEmojiService with a shared
cache or server-to-server invalidation mechanism. Ensure emoji updates
invalidate the cached count and lastUpdatedAt across all backend processes, not
only in the process handling the update. If the service intentionally supports
only a single process, explicitly enforce or document that deployment constraint
instead.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Duplicate comments:
In `@packages/backend/src/core/CustomEmojiService.ts`:
- Line 68: Replace the process-local localEmojisStatsCache used by
CustomEmojiService with a shared cache or server-to-server invalidation
mechanism. Ensure emoji updates invalidate the cached count and lastUpdatedAt
across all backend processes, not only in the process handling the update. If
the service intentionally supports only a single process, explicitly enforce or
document that deployment constraint instead.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 37ac1b84-1d60-46ed-bd74-a36563bb3cf6

📥 Commits

Reviewing files that changed from the base of the PR and between 5092984 and edcd70f.

📒 Files selected for processing (1)
  • packages/backend/src/core/CustomEmojiService.ts

lastUpdatedAt: raw?.lastUpdatedAt ?? null,
};
});
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

現状、件数と最終更新日時ベースでは絵文字削除が追えないかと思います(物理削除なので)。

「有効な絵文字一覧」としてのバージョンをmetaあたりに持っておくのが良いかと思います。
addやdelete/deleteBulkなどの1操作につき1回更新されるイメージの

@kakkokari-gtyih kakkokari-gtyih Jul 24, 2026

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • カスタム絵文字削除した場合は件数が変わる→最終更新日時は変わらないけど件数が変わるのでキャッシュ更新
  • 削除した分と同じだけカスタム絵文字を追加する→件数は変わる前と同じになるけど最終更新日時が変わるのでキャッシュ更新

で問題なく更新される説がある

@samunohito samunohito Jul 24, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ありがとうございます。削除の追跡が漏れる懸念はなさそうです。

--

ただ、それでもやはり気になるのが、絵文字一覧の変更有無を表現するためだけに COUNT / MAX の集計を都度行っている点です。

  • キャッシュの有効期間が3分と短く、絵文字の追加・削除・更新時にも無効化される
  • 複数のHTTPプロセスを使っている環境ではプロセスごとに集計が走る
  • キュープロセスなどの別プロセスで行われた変更はHTTPプロセス側のキャッシュを更新できず、最大3分古い値を返す可能性がある
  • キャッシュミスが重なった場合、同一の集計クエリが並行して実行され得る

という点から、負荷と整合性の両面でウィークポイントになりやすいと考えています。

そのため再度、metaやRedisなどの共有領域に、集計不要な絵文字一覧のリビジョンを持たせ、論理的な変更操作ごとに更新する方式を提案させて頂きます

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

packages/backend Server side specific issue/PR packages/frontend Client side specific issue/PR packages/misskey-js size:L This PR changes 100-499 lines, ignoring generated files.

Projects

Development

Successfully merging this pull request may close these issues.

カスタム絵文字の登録更新削除イベントを受け取れなかったクライアントのケアを検討

2 participants