@musnows/scriverse 0.4.2 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,75 @@
1
+ export const presencePageKinds = [
2
+ "welcome",
3
+ "editor",
4
+ "module",
5
+ "entity-editor",
6
+ "settings"
7
+ ];
8
+ const moduleLabels = {
9
+ settings: "设定库",
10
+ characters: "角色",
11
+ races: "种族",
12
+ organizations: "组织",
13
+ timeline: "时间轴",
14
+ relationships: "人物关系",
15
+ outlines: "大纲与伏笔",
16
+ reviews: "审核队列",
17
+ tasks: "AI 分析",
18
+ "ai-settings": "AI 设置"
19
+ };
20
+ const entityLabels = {
21
+ setting: "设定编辑",
22
+ character: "角色编辑",
23
+ race: "种族编辑",
24
+ organization: "组织编辑"
25
+ };
26
+ function normalizedPage(page) {
27
+ const module = String(page.module ?? "");
28
+ const resourceId = String(page.resourceId ?? "");
29
+ if (page.kind === "editor")
30
+ return { key: `editor:${resourceId}`, label: "正文编辑" };
31
+ if (page.kind === "entity-editor")
32
+ return { key: `entity-editor:${module}:${resourceId}`, label: entityLabels[module] ?? "资料编辑" };
33
+ if (page.kind === "module")
34
+ return { key: `module:${module}`, label: moduleLabels[module] ?? "作品模块" };
35
+ if (page.kind === "settings")
36
+ return { key: "settings", label: "设置中心" };
37
+ return { key: "welcome", label: "作品首页" };
38
+ }
39
+ export class CollaborationPresence {
40
+ timeoutMs;
41
+ now;
42
+ entries = new Map();
43
+ constructor(timeoutMs = 45_000, now = Date.now) {
44
+ this.timeoutMs = timeoutMs;
45
+ this.now = now;
46
+ }
47
+ heartbeat(workId, clientId, user, page) {
48
+ const now = this.now();
49
+ this.prune(now);
50
+ const normalized = normalizedPage(page);
51
+ this.entries.set(`${workId}:${clientId}`, {
52
+ workId,
53
+ clientId,
54
+ ...user,
55
+ page: normalized,
56
+ lastSeenAt: new Date(now).toISOString(),
57
+ lastSeenMs: now
58
+ });
59
+ return this.list(workId, now);
60
+ }
61
+ list(workId, now) {
62
+ this.prune(now);
63
+ return [...this.entries.values()]
64
+ .filter((entry) => entry.workId === workId)
65
+ .sort((left, right) => right.lastSeenMs - left.lastSeenMs || left.displayName.localeCompare(right.displayName, "zh-CN"))
66
+ .map(({ workId: _workId, lastSeenMs: _lastSeenMs, ...participant }) => participant);
67
+ }
68
+ prune(now) {
69
+ for (const [key, entry] of this.entries) {
70
+ if (now - entry.lastSeenMs > this.timeoutMs)
71
+ this.entries.delete(key);
72
+ }
73
+ }
74
+ }
75
+ //# sourceMappingURL=collaboration-presence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collaboration-presence.js","sourceRoot":"","sources":["../src/collaboration-presence.ts"],"names":[],"mappings":"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"}