@playcraft/common 0.0.2

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.
Files changed (162) hide show
  1. package/README.md +13 -0
  2. package/dist/auth/index.d.ts +4 -0
  3. package/dist/auth/index.d.ts.map +1 -0
  4. package/dist/auth/index.js +4 -0
  5. package/dist/auth/index.js.map +1 -0
  6. package/dist/auth/jwt.d.ts +18 -0
  7. package/dist/auth/jwt.d.ts.map +1 -0
  8. package/dist/auth/jwt.js +47 -0
  9. package/dist/auth/jwt.js.map +1 -0
  10. package/dist/auth/jwt.test.d.ts +2 -0
  11. package/dist/auth/jwt.test.d.ts.map +1 -0
  12. package/dist/auth/jwt.test.js +13 -0
  13. package/dist/auth/jwt.test.js.map +1 -0
  14. package/dist/auth/local-dev.d.ts +27 -0
  15. package/dist/auth/local-dev.d.ts.map +1 -0
  16. package/dist/auth/local-dev.js +38 -0
  17. package/dist/auth/local-dev.js.map +1 -0
  18. package/dist/auth/types.d.ts +7 -0
  19. package/dist/auth/types.d.ts.map +1 -0
  20. package/dist/auth/types.js +2 -0
  21. package/dist/auth/types.js.map +1 -0
  22. package/dist/constants.d.ts +28 -0
  23. package/dist/constants.d.ts.map +1 -0
  24. package/dist/constants.js +28 -0
  25. package/dist/constants.js.map +1 -0
  26. package/dist/database/index.d.ts +4 -0
  27. package/dist/database/index.d.ts.map +1 -0
  28. package/dist/database/index.js +4 -0
  29. package/dist/database/index.js.map +1 -0
  30. package/dist/database/postgres-adapter.d.ts +8 -0
  31. package/dist/database/postgres-adapter.d.ts.map +1 -0
  32. package/dist/database/postgres-adapter.js +11 -0
  33. package/dist/database/postgres-adapter.js.map +1 -0
  34. package/dist/database/schema.d.ts +919 -0
  35. package/dist/database/schema.d.ts.map +1 -0
  36. package/dist/database/schema.js +70 -0
  37. package/dist/database/schema.js.map +1 -0
  38. package/dist/database/sqlite-adapter.d.ts +11 -0
  39. package/dist/database/sqlite-adapter.d.ts.map +1 -0
  40. package/dist/database/sqlite-adapter.js +78 -0
  41. package/dist/database/sqlite-adapter.js.map +1 -0
  42. package/dist/index.d.ts +10 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +10 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/messenger/index.d.ts +4 -0
  47. package/dist/messenger/index.d.ts.map +1 -0
  48. package/dist/messenger/index.js +4 -0
  49. package/dist/messenger/index.js.map +1 -0
  50. package/dist/messenger/protocol.d.ts +6 -0
  51. package/dist/messenger/protocol.d.ts.map +1 -0
  52. package/dist/messenger/protocol.js +17 -0
  53. package/dist/messenger/protocol.js.map +1 -0
  54. package/dist/messenger/server.d.ts +66 -0
  55. package/dist/messenger/server.d.ts.map +1 -0
  56. package/dist/messenger/server.js +249 -0
  57. package/dist/messenger/server.js.map +1 -0
  58. package/dist/messenger/server.test.d.ts +2 -0
  59. package/dist/messenger/server.test.d.ts.map +1 -0
  60. package/dist/messenger/server.test.js +66 -0
  61. package/dist/messenger/server.test.js.map +1 -0
  62. package/dist/messenger/types.d.ts +32 -0
  63. package/dist/messenger/types.d.ts.map +1 -0
  64. package/dist/messenger/types.js +2 -0
  65. package/dist/messenger/types.js.map +1 -0
  66. package/dist/models/asset.d.ts +57 -0
  67. package/dist/models/asset.d.ts.map +1 -0
  68. package/dist/models/asset.js +33 -0
  69. package/dist/models/asset.js.map +1 -0
  70. package/dist/models/converters.d.ts +11 -0
  71. package/dist/models/converters.d.ts.map +1 -0
  72. package/dist/models/converters.js +25 -0
  73. package/dist/models/converters.js.map +1 -0
  74. package/dist/models/converters.test.d.ts +2 -0
  75. package/dist/models/converters.test.d.ts.map +1 -0
  76. package/dist/models/converters.test.js +18 -0
  77. package/dist/models/converters.test.js.map +1 -0
  78. package/dist/models/index.d.ts +5 -0
  79. package/dist/models/index.d.ts.map +1 -0
  80. package/dist/models/index.js +5 -0
  81. package/dist/models/index.js.map +1 -0
  82. package/dist/models/playcanvas-compat.d.ts +30 -0
  83. package/dist/models/playcanvas-compat.d.ts.map +1 -0
  84. package/dist/models/playcanvas-compat.js +30 -0
  85. package/dist/models/playcanvas-compat.js.map +1 -0
  86. package/dist/models/project.d.ts +28 -0
  87. package/dist/models/project.d.ts.map +1 -0
  88. package/dist/models/project.js +17 -0
  89. package/dist/models/project.js.map +1 -0
  90. package/dist/models/scene.d.ts +52 -0
  91. package/dist/models/scene.d.ts.map +1 -0
  92. package/dist/models/scene.js +49 -0
  93. package/dist/models/scene.js.map +1 -0
  94. package/dist/models/scene.test.d.ts +2 -0
  95. package/dist/models/scene.test.d.ts.map +1 -0
  96. package/dist/models/scene.test.js +12 -0
  97. package/dist/models/scene.test.js.map +1 -0
  98. package/dist/sharedb/index.d.ts +4 -0
  99. package/dist/sharedb/index.d.ts.map +1 -0
  100. package/dist/sharedb/index.js +4 -0
  101. package/dist/sharedb/index.js.map +1 -0
  102. package/dist/sharedb/middleware.d.ts +2 -0
  103. package/dist/sharedb/middleware.d.ts.map +1 -0
  104. package/dist/sharedb/middleware.js +2 -0
  105. package/dist/sharedb/middleware.js.map +1 -0
  106. package/dist/sharedb/server.d.ts +60 -0
  107. package/dist/sharedb/server.d.ts.map +1 -0
  108. package/dist/sharedb/server.js +542 -0
  109. package/dist/sharedb/server.js.map +1 -0
  110. package/dist/sharedb/server.test.d.ts +2 -0
  111. package/dist/sharedb/server.test.d.ts.map +1 -0
  112. package/dist/sharedb/server.test.js +59 -0
  113. package/dist/sharedb/server.test.js.map +1 -0
  114. package/dist/sharedb/snapshot.d.ts +8 -0
  115. package/dist/sharedb/snapshot.d.ts.map +1 -0
  116. package/dist/sharedb/snapshot.js +2 -0
  117. package/dist/sharedb/snapshot.js.map +1 -0
  118. package/dist/storage/cos.d.ts +25 -0
  119. package/dist/storage/cos.d.ts.map +1 -0
  120. package/dist/storage/cos.js +104 -0
  121. package/dist/storage/cos.js.map +1 -0
  122. package/dist/storage/index.d.ts +18 -0
  123. package/dist/storage/index.d.ts.map +1 -0
  124. package/dist/storage/index.js +63 -0
  125. package/dist/storage/index.js.map +1 -0
  126. package/dist/storage/interface.d.ts +19 -0
  127. package/dist/storage/interface.d.ts.map +1 -0
  128. package/dist/storage/interface.js +2 -0
  129. package/dist/storage/interface.js.map +1 -0
  130. package/dist/storage/local.d.ts +16 -0
  131. package/dist/storage/local.d.ts.map +1 -0
  132. package/dist/storage/local.js +57 -0
  133. package/dist/storage/local.js.map +1 -0
  134. package/dist/utils/env.d.ts +2 -0
  135. package/dist/utils/env.d.ts.map +1 -0
  136. package/dist/utils/env.js +10 -0
  137. package/dist/utils/env.js.map +1 -0
  138. package/dist/utils/index.d.ts +3 -0
  139. package/dist/utils/index.d.ts.map +1 -0
  140. package/dist/utils/index.js +3 -0
  141. package/dist/utils/index.js.map +1 -0
  142. package/dist/utils/logger.d.ts +8 -0
  143. package/dist/utils/logger.d.ts.map +1 -0
  144. package/dist/utils/logger.js +10 -0
  145. package/dist/utils/logger.js.map +1 -0
  146. package/dist/websocket/connection.d.ts +4 -0
  147. package/dist/websocket/connection.d.ts.map +1 -0
  148. package/dist/websocket/connection.js +9 -0
  149. package/dist/websocket/connection.js.map +1 -0
  150. package/dist/websocket/heartbeat.d.ts +3 -0
  151. package/dist/websocket/heartbeat.d.ts.map +1 -0
  152. package/dist/websocket/heartbeat.js +16 -0
  153. package/dist/websocket/heartbeat.js.map +1 -0
  154. package/dist/websocket/index.d.ts +4 -0
  155. package/dist/websocket/index.d.ts.map +1 -0
  156. package/dist/websocket/index.js +4 -0
  157. package/dist/websocket/index.js.map +1 -0
  158. package/dist/websocket/server.d.ts +12 -0
  159. package/dist/websocket/server.d.ts.map +1 -0
  160. package/dist/websocket/server.js +12 -0
  161. package/dist/websocket/server.js.map +1 -0
  162. package/package.json +79 -0
@@ -0,0 +1,60 @@
1
+ import http from 'node:http';
2
+ export type ShareDBServerOptions = {
3
+ /**
4
+ * 可选:用于从后端拉取初始数据(scenes/assets)。
5
+ * - Hybrid: 指向云端 backend internal url
6
+ * - Full local: 指向 agent 本地 backend
7
+ */
8
+ backendUrl?: string;
9
+ /**
10
+ * 可选:内部接口鉴权 secret(使用 HEADERS.INTERNAL_SECRET 常量)。
11
+ */
12
+ internalSecret?: string;
13
+ /**
14
+ * 认证回调:返回任意 truthy 表示允许连接,并用于填充 auth payload。
15
+ */
16
+ onAuth?: (accessToken: string | undefined) => Promise<any>;
17
+ /**
18
+ * 自定义拉取初始 doc:返回 json0 data(scenes/assets)。
19
+ */
20
+ onDocCreate?: (collection: string, id: string) => Promise<any>;
21
+ /**
22
+ * WebSocket path,默认 `/realtime`
23
+ */
24
+ path?: string;
25
+ };
26
+ export declare class ShareDBRealtimeServer {
27
+ private backend;
28
+ private wss?;
29
+ private readonly options;
30
+ private readonly conn;
31
+ private assetCache;
32
+ private cacheLoadPromises;
33
+ private readonly CACHE_TTL_MS;
34
+ private readonly MAX_CACHE_SIZE;
35
+ private cacheCleanupTimer;
36
+ constructor(options?: ShareDBServerOptions);
37
+ attach(server: http.Server): void;
38
+ /**
39
+ * 返回 GET /health 处理器,用于存活探针与监控
40
+ */
41
+ createHealthHandler(): (req: http.IncomingMessage, res: http.ServerResponse) => void;
42
+ close(): void;
43
+ /** 定期清理过期缓存并执行 LRU 淘汰 */
44
+ private startCacheCleanup;
45
+ private cleanupExpiredCache;
46
+ private installMiddleware;
47
+ private getCommonConn;
48
+ /**
49
+ * 🔧 性能优化:批量加载项目的所有 assets 到缓存
50
+ * 避免每个 asset 都单独请求后端 API
51
+ */
52
+ private loadProjectAssetsToCache;
53
+ /**
54
+ * 🔧 从缓存中获取 asset,并更新访问计数与时间戳
55
+ */
56
+ private getAssetFromCache;
57
+ private ensureDocExists;
58
+ private handleConnection;
59
+ }
60
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/sharedb/server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAkB7B,MAAM,MAAM,oBAAoB,GAAG;IACjC;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3D;;OAEG;IACH,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/D;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,qBAAa,qBAAqB;IAChC,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,GAAG,CAAC,CAAkB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAIhB;IAGL,OAAO,CAAC,UAAU,CAAoD;IACtE,OAAO,CAAC,iBAAiB,CAAyC;IAClE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkB;IAC/C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,iBAAiB,CAA+C;gBAE5D,OAAO,GAAE,oBAAyB;IAY9C,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM;IAQ1B;;OAEG;IACH,mBAAmB,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,KAAK,IAAI;IAmBpF,KAAK;IAuBL,yBAAyB;IACzB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,mBAAmB;IAiC3B,OAAO,CAAC,iBAAiB;IAiDzB,OAAO,CAAC,aAAa;IAQrB;;;OAGG;YACW,wBAAwB;IA6DtC;;OAEG;IACH,OAAO,CAAC,iBAAiB;YASX,eAAe;IA8H7B,OAAO,CAAC,gBAAgB;CA6LzB"}
@@ -0,0 +1,542 @@
1
+ import ShareDB from 'sharedb';
2
+ import { WebSocketServer, WebSocket } from 'ws';
3
+ import WebSocketJSONStream from '@teamwork/websocket-json-stream';
4
+ import { type as otTextType } from 'ot-text';
5
+ import { LocalDevAuth } from '../auth/local-dev.js';
6
+ import { SceneModel } from '../models/scene.js';
7
+ import { HEADERS } from '../constants.js';
8
+ ShareDB.types.register(otTextType);
9
+ export class ShareDBRealtimeServer {
10
+ backend;
11
+ wss;
12
+ options;
13
+ conn = (() => {
14
+ // ShareDB connection is lightweight; keep a shared one for ensureDocExists.
15
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
16
+ return null;
17
+ })();
18
+ // 🔧 性能优化:添加资产缓存(按项目分组),带 TTL 和 LRU
19
+ assetCache = new Map();
20
+ cacheLoadPromises = new Map();
21
+ CACHE_TTL_MS = 30 * 60 * 1000; // 30 分钟
22
+ MAX_CACHE_SIZE = 10000;
23
+ cacheCleanupTimer = null;
24
+ constructor(options = {}) {
25
+ this.options = options;
26
+ this.backend = new ShareDB({ defaultType: 'json0' });
27
+ // 🔧 添加错误监听器来捕获 ShareDB 内部错误
28
+ this.backend.on('error', (err) => {
29
+ console.error('[sharedb] Backend error:', err);
30
+ });
31
+ this.installMiddleware();
32
+ }
33
+ attach(server) {
34
+ const path = this.options.path ?? '/realtime';
35
+ this.wss = new WebSocketServer({ server, path });
36
+ this.wss.on('connection', (ws) => this.handleConnection(ws));
37
+ this.startCacheCleanup();
38
+ }
39
+ /**
40
+ * 返回 GET /health 处理器,用于存活探针与监控
41
+ */
42
+ createHealthHandler() {
43
+ return (req, res) => {
44
+ if (req.method !== 'GET' || (req.url !== '/health' && req.url !== '/health/')) {
45
+ res.statusCode = 404;
46
+ res.end();
47
+ return;
48
+ }
49
+ const status = {
50
+ uptime: process.uptime(),
51
+ connections: this.wss?.clients?.size ?? 0,
52
+ memory: process.memoryUsage(),
53
+ timestamp: Date.now(),
54
+ };
55
+ res.statusCode = 200;
56
+ res.setHeader('Content-Type', 'application/json');
57
+ res.end(JSON.stringify(status));
58
+ };
59
+ }
60
+ close() {
61
+ // 清理事件监听器
62
+ this.backend.removeAllListeners('error');
63
+ // 关闭共享连接
64
+ const commonConn = this._commonConn;
65
+ if (commonConn) {
66
+ commonConn.close();
67
+ this._commonConn = null;
68
+ }
69
+ // 关闭 WebSocket 服务器
70
+ this.wss?.close();
71
+ this.wss = undefined;
72
+ // 清理缓存与定时器
73
+ this.assetCache.clear();
74
+ this.cacheLoadPromises.clear();
75
+ if (this.cacheCleanupTimer) {
76
+ clearInterval(this.cacheCleanupTimer);
77
+ this.cacheCleanupTimer = null;
78
+ }
79
+ // 关闭 ShareDB backend
80
+ this.backend.close();
81
+ }
82
+ /** 定期清理过期缓存并执行 LRU 淘汰 */
83
+ startCacheCleanup() {
84
+ if (this.cacheCleanupTimer)
85
+ return;
86
+ this.cacheCleanupTimer = setInterval(() => {
87
+ this.cleanupExpiredCache();
88
+ }, 5 * 60 * 1000); // 每 5 分钟
89
+ }
90
+ cleanupExpiredCache() {
91
+ const now = Date.now();
92
+ let totalSize = 0;
93
+ const entries = [];
94
+ for (const [projectId, projectCache] of this.assetCache) {
95
+ for (const [assetId, cached] of projectCache) {
96
+ if (now - cached.timestamp > this.CACHE_TTL_MS) {
97
+ projectCache.delete(assetId);
98
+ }
99
+ else {
100
+ totalSize++;
101
+ entries.push({ projectId, assetId, accessCount: cached.accessCount, timestamp: cached.timestamp });
102
+ }
103
+ }
104
+ if (projectCache.size === 0) {
105
+ this.assetCache.delete(projectId);
106
+ }
107
+ }
108
+ if (totalSize > this.MAX_CACHE_SIZE) {
109
+ entries.sort((a, b) => a.accessCount - b.accessCount || a.timestamp - b.timestamp);
110
+ const toEvict = totalSize - this.MAX_CACHE_SIZE;
111
+ for (let i = 0; i < toEvict && i < entries.length; i++) {
112
+ const e = entries[i];
113
+ const projectCache = this.assetCache.get(e.projectId);
114
+ if (projectCache) {
115
+ projectCache.delete(e.assetId);
116
+ if (projectCache.size === 0)
117
+ this.assetCache.delete(e.projectId);
118
+ }
119
+ }
120
+ }
121
+ }
122
+ installMiddleware() {
123
+ const isDev = process.env.NODE_ENV !== 'production';
124
+ const debugLog = isDev ? (msg, ...args) => console.log(msg, ...args) : () => { };
125
+ // 🔧 reply/receive 仅开发环境打印,避免生产环境日志爆炸
126
+ this.backend.use('reply', (ctx, next) => {
127
+ debugLog(`[sharedb] REPLY: a=${ctx.request?.a}, c=${ctx.request?.c}, d=${ctx.request?.d}`);
128
+ next();
129
+ });
130
+ this.backend.use('receive', (ctx, next) => {
131
+ debugLog(`[sharedb] RECEIVE: a=${ctx.data?.a}, c=${ctx.data?.c}, d=${ctx.data?.d}`);
132
+ next();
133
+ });
134
+ // 🔧 修复:添加 documents 和 settings 到 readSnapshots 中间件
135
+ // Ensure missing docs in readSnapshots (primarily for scenes/assets/documents/settings)
136
+ this.backend.use('readSnapshots', async (ctx, next) => {
137
+ console.log(`[sharedb] readSnapshots middleware called for collection=${ctx.collection}, snapshots=${ctx.snapshots?.length || 0}`);
138
+ if (ctx.collection !== 'scenes' && ctx.collection !== 'assets' && ctx.collection !== 'documents' && ctx.collection !== 'settings' && ctx.collection !== 'user_data') {
139
+ console.log(`[sharedb] Skipping readSnapshots for collection=${ctx.collection}`);
140
+ return next();
141
+ }
142
+ for (const snap of ctx.snapshots || []) {
143
+ console.log(`[sharedb] Processing snapshot: id=${snap?.id}, hasType=${!!snap?.type}`);
144
+ if (!snap || snap.type)
145
+ continue;
146
+ const id = String(snap.id);
147
+ const doc = await this.ensureDocExists(ctx.collection, id, 'readSnapshots');
148
+ // 🔧 根据 collection 设置正确的类型
149
+ if (ctx.collection === 'documents') {
150
+ snap.type = otTextType.name || otTextType.uri || 'text';
151
+ }
152
+ else {
153
+ snap.type = 'json0';
154
+ }
155
+ if (ctx.collection === 'user_data') {
156
+ snap.data = doc.data ?? {};
157
+ }
158
+ else {
159
+ snap.data = doc.data;
160
+ }
161
+ snap.v = doc.version;
162
+ console.log(`[sharedb] ✅ Snapshot filled: id=${id}, type=${snap.type}, hasData=${!!snap.data}`);
163
+ }
164
+ next();
165
+ });
166
+ }
167
+ getCommonConn() {
168
+ // create lazily to avoid connect() before backend ready
169
+ if (!this._commonConn) {
170
+ this._commonConn = this.backend.connect();
171
+ }
172
+ return this._commonConn;
173
+ }
174
+ /**
175
+ * 🔧 性能优化:批量加载项目的所有 assets 到缓存
176
+ * 避免每个 asset 都单独请求后端 API
177
+ */
178
+ async loadProjectAssetsToCache(projectId) {
179
+ // 如果已经有加载中的 Promise,等待它完成
180
+ const existingPromise = this.cacheLoadPromises.get(projectId);
181
+ if (existingPromise) {
182
+ return existingPromise;
183
+ }
184
+ // 创建新的加载 Promise
185
+ const loadPromise = (async () => {
186
+ try {
187
+ if (!this.options.backendUrl) {
188
+ console.warn(`[sharedb] No backendUrl configured, cannot load assets for project ${projectId}`);
189
+ return;
190
+ }
191
+ const internalSecret = this.options.internalSecret || process.env.EMIT_SECRET || 'dev-emit-secret-change-me';
192
+ const url = `${this.options.backendUrl}/api/projects/${projectId}/assets?branchId=local-branch`;
193
+ console.log(`[sharedb] 🚀 Batch loading assets for project ${projectId} from ${url}`);
194
+ const startTime = Date.now();
195
+ const res = await fetch(url, {
196
+ headers: { [HEADERS.INTERNAL_SECRET]: internalSecret },
197
+ });
198
+ if (!res.ok) {
199
+ console.error(`[sharedb] Failed to batch load assets: status=${res.status}`);
200
+ return;
201
+ }
202
+ const data = await res.json();
203
+ const assets = data.result || data; // 兼容不同的响应格式
204
+ if (!Array.isArray(assets)) {
205
+ console.error(`[sharedb] Invalid assets response format`);
206
+ return;
207
+ }
208
+ const now = Date.now();
209
+ const projectCache = new Map();
210
+ for (const asset of assets) {
211
+ if (asset.id != null) {
212
+ projectCache.set(String(asset.id), { data: asset, timestamp: now, accessCount: 0 });
213
+ }
214
+ }
215
+ this.assetCache.set(projectId, projectCache);
216
+ const duration = Date.now() - startTime;
217
+ console.log(`[sharedb] ✅ Cached ${assets.length} assets for project ${projectId} in ${duration}ms`);
218
+ }
219
+ catch (error) {
220
+ console.error(`[sharedb] Failed to batch load assets for project ${projectId}:`, error);
221
+ }
222
+ finally {
223
+ // 清除加载 Promise,允许重试
224
+ this.cacheLoadPromises.delete(projectId);
225
+ }
226
+ })();
227
+ this.cacheLoadPromises.set(projectId, loadPromise);
228
+ return loadPromise;
229
+ }
230
+ /**
231
+ * 🔧 从缓存中获取 asset,并更新访问计数与时间戳
232
+ */
233
+ getAssetFromCache(projectId, assetId) {
234
+ const projectCache = this.assetCache.get(projectId);
235
+ const cached = projectCache?.get(assetId);
236
+ if (!cached)
237
+ return null;
238
+ cached.accessCount++;
239
+ cached.timestamp = Date.now();
240
+ return cached.data;
241
+ }
242
+ async ensureDocExists(collection, id, reason) {
243
+ const docId = String(id);
244
+ const doc = this.getCommonConn().get(collection, docId);
245
+ // fetch with timeout to avoid potential hangs
246
+ try {
247
+ await Promise.race([
248
+ new Promise((resolve) => doc.fetch(() => resolve())),
249
+ new Promise((_, reject) => setTimeout(() => reject(new Error('doc.fetch timeout')), 5000)),
250
+ ]);
251
+ }
252
+ catch {
253
+ // ignore, will fallback to backend fetch
254
+ }
255
+ if (!doc.type) {
256
+ let initial = null;
257
+ // 🔧 user_data 无后端 API,直接使用空对象
258
+ if (collection === 'user_data') {
259
+ initial = {};
260
+ }
261
+ // 🔧 性能优化:对于 assets,优先从缓存获取
262
+ else if (collection === 'assets' && this.options.backendUrl) {
263
+ // 从 asset ID 中提取 projectId(假设格式为 <projectId>-<assetId> 或直接是 UUID)
264
+ // 这里我们需要一个方法来识别 projectId,暂时先尝试批量加载
265
+ // TODO: 需要一个更好的方法来识别 projectId
266
+ // 目前的解决方案:尝试从 URL 或者第一次加载时记录 projectId
267
+ // fallback: 使用单个请求
268
+ console.log(`[sharedb] Asset cache miss for ${docId}, using individual request`);
269
+ }
270
+ if (initial == null && this.options.onDocCreate) {
271
+ try {
272
+ console.log(`[sharedb] Fetching initial data for ${collection}/${docId} via onDocCreate`);
273
+ initial = await this.options.onDocCreate(collection, docId);
274
+ console.log(`[sharedb] onDocCreate returned:`, initial ? `data with keys [${Object.keys(initial).join(', ')}]` : 'null');
275
+ }
276
+ catch (e) {
277
+ console.error(`[sharedb] onDocCreate failed for ${collection}/${docId}:`, e);
278
+ initial = null;
279
+ }
280
+ }
281
+ if (initial == null && this.options.backendUrl) {
282
+ try {
283
+ const internalSecret = this.options.internalSecret || process.env.EMIT_SECRET || 'dev-emit-secret-change-me';
284
+ // 🔧 修复:对于 documents collection,调用 assets API 获取文件内容
285
+ // documents 的 ID 即 asset 的 numeric_id(或 UUID),用于获取文件内容
286
+ let url;
287
+ if (collection === 'documents') {
288
+ // documents 需要获取文件内容(文本)
289
+ url = `${this.options.backendUrl}/api/assets/internal/${docId}/file`;
290
+ }
291
+ else {
292
+ // assets 和 scenes 获取元数据(JSON)
293
+ url =
294
+ collection === 'assets' || collection === 'scenes'
295
+ ? `${this.options.backendUrl}/api/${collection}/internal/${docId}`
296
+ : `${this.options.backendUrl}/api/${collection}/${docId}`;
297
+ }
298
+ console.log(`[sharedb] Fetching initial data from ${url}`);
299
+ const res = await fetch(url, {
300
+ headers: { [HEADERS.INTERNAL_SECRET]: internalSecret },
301
+ });
302
+ console.log(`[sharedb] Backend response: status=${res.status}, ok=${res.ok}`);
303
+ if (res.ok) {
304
+ // 🔧 对于 documents,返回文本内容;其他返回 JSON
305
+ if (collection === 'documents') {
306
+ initial = await res.text();
307
+ console.log(`[sharedb] Backend returned text: ${initial ? initial.substring(0, 100) + '...' : 'empty'}`);
308
+ }
309
+ else {
310
+ initial = await res.json();
311
+ console.log(`[sharedb] Backend returned:`, initial ? `data with keys [${Object.keys(initial).join(', ')}]` : 'null');
312
+ }
313
+ }
314
+ }
315
+ catch (e) {
316
+ console.error(`[sharedb] Backend fetch failed for ${collection}/${docId}:`, e);
317
+ initial = null;
318
+ }
319
+ }
320
+ if (initial == null) {
321
+ console.warn(`[sharedb] No initial data found for ${collection}/${docId}, using fallback`);
322
+ // 🔧 修复:对于 documents collection,返回空字符串而不是空对象
323
+ // documents 应该存储文件内容字符串,Monaco 编辑器需要字符串
324
+ if (collection === 'documents') {
325
+ initial = ''; // 空字符串作为默认文档内容
326
+ }
327
+ else if (collection === 'settings' || collection === 'user_data') {
328
+ // 🔧 user_data: 用户个人数据(相机位置、面板布局等),默认空对象
329
+ // 🔧 settings: 项目设置,默认空对象
330
+ initial = {};
331
+ }
332
+ else {
333
+ initial =
334
+ collection === 'scenes'
335
+ ? SceneModel.getDefaultData(docId)
336
+ : { item_id: Number(docId) || 1, data: {} };
337
+ }
338
+ }
339
+ // 🔧 修复:documents 使用 text 类型(ot-text 包注册的类型名是 'text'),其他使用 json0 类型
340
+ const docType = collection === 'documents' ? otTextType.name || otTextType.uri || 'text' : 'json0';
341
+ console.log(`[sharedb] Creating document ${collection}/${docId} with type=${docType}, initial data type=${typeof initial}, length=${initial?.length || 'N/A'}`);
342
+ await new Promise((resolve, reject) => {
343
+ doc.create(initial, docType, (err) => {
344
+ // 🔧 忽略 "Document already exists" 错误(并发订阅时可能发生)
345
+ if (err && err.code === 'ERR_DOC_ALREADY_CREATED') {
346
+ console.log(`[sharedb] ⚠️ Document ${collection}/${docId} already exists (concurrent subscription), continuing...`);
347
+ resolve();
348
+ }
349
+ else if (err) {
350
+ console.error(`[sharedb] Failed to create document ${collection}/${docId}:`, err);
351
+ reject(err);
352
+ }
353
+ else {
354
+ console.log(`[sharedb] ✅ Document created: ${collection}/${docId}, type=${doc.type}, version=${doc.version}, hasData=${!!doc.data}`);
355
+ resolve();
356
+ }
357
+ });
358
+ });
359
+ }
360
+ console.log(`[sharedb] Returning doc ${collection}/${docId}, type=${doc.type}, version=${doc.version}, hasData=${!!doc.data}`);
361
+ return doc;
362
+ }
363
+ handleConnection(ws) {
364
+ let authed = false;
365
+ let streamListenCalled = false;
366
+ let messageHandler = null;
367
+ const SPECIAL_PREFIXES = ['selection', 'whoisonline', 'chat', 'fs', 'pipeline', 'doc:'];
368
+ // 🔧 修复:直接包装原始的 ws.send 方法,确保所有发送都经过我们的逻辑
369
+ const originalSend = ws.send.bind(ws);
370
+ // 🔧 关键修复:必须传递 callback 参数给原始 send,否则 WebSocketJSONStream 会一直等待回调!
371
+ // 使用 any 类型避免 TypeScript 重载签名冲突
372
+ ws.send = (data, optionsOrCallback, callback) => {
373
+ const dataStr = String(data);
374
+ // 🔧 调试:打印所有发送的消息(在发送前)
375
+ console.log(`[sharedb] >>> Sending to client (length=${dataStr.length}): ${dataStr.substring(0, 200)}...`);
376
+ // 处理可选的 options 和 callback 参数
377
+ const cb = typeof optionsOrCallback === 'function' ? optionsOrCallback : callback;
378
+ const opts = typeof optionsOrCallback === 'object' ? optionsOrCallback : undefined;
379
+ // Patch ShareDB handshake for PlayCanvas compatibility:
380
+ // when ShareDB sends {"a":"init"}, we rewrite to {"a":"hs", protocol...}
381
+ try {
382
+ const msg = JSON.parse(dataStr);
383
+ if (msg?.a === 'init') {
384
+ msg.a = 'hs';
385
+ msg.protocol = 1;
386
+ msg.protocolMinor = 2;
387
+ if (opts) {
388
+ originalSend(JSON.stringify(msg), opts, cb);
389
+ }
390
+ else if (cb) {
391
+ originalSend(JSON.stringify(msg), cb);
392
+ }
393
+ else {
394
+ originalSend(JSON.stringify(msg));
395
+ }
396
+ console.log(`[sharedb] >>> Sent handshake response`);
397
+ return;
398
+ }
399
+ }
400
+ catch {
401
+ // ignore non-JSON messages
402
+ }
403
+ if (opts) {
404
+ originalSend(data, opts, cb);
405
+ }
406
+ else if (cb) {
407
+ originalSend(data, cb);
408
+ }
409
+ else {
410
+ originalSend(data);
411
+ }
412
+ };
413
+ const filteredWs = {
414
+ // 🔧 修复:使用 getter 动态获取 readyState,而不是静态值
415
+ get readyState() { return ws.readyState; },
416
+ OPEN: WebSocket.OPEN,
417
+ send: ws.send, // 使用已包装的 send 方法
418
+ close: (code, reason) => ws.close(code, reason),
419
+ addEventListener: (ev, handler) => {
420
+ if (ev === 'message') {
421
+ console.log(`[sharedb] messageHandler registered`);
422
+ messageHandler = handler;
423
+ }
424
+ },
425
+ removeEventListener: () => { },
426
+ };
427
+ const stream = new WebSocketJSONStream(filteredWs);
428
+ ws.on('message', async (raw) => {
429
+ const text = raw.toString();
430
+ // 非 JSON:处理 PlayCanvas realtime 的 auth / ping / selection 等
431
+ if (!text.startsWith('{') && !text.startsWith('[')) {
432
+ if (text.startsWith('auth')) {
433
+ let p = {};
434
+ try {
435
+ p = JSON.parse(text.slice(4) || '{}');
436
+ }
437
+ catch {
438
+ p = {};
439
+ }
440
+ const accessToken = p?.accessToken;
441
+ const isDev = LocalDevAuth.shouldAllowWithoutToken();
442
+ const user = this.options.onAuth ? await this.options.onAuth(accessToken) : null;
443
+ const effectiveUser = user || (isDev ? LocalDevAuth.getFallbackUser() : null);
444
+ if (effectiveUser && !streamListenCalled) {
445
+ authed = true;
446
+ streamListenCalled = true;
447
+ const currentUserId = effectiveUser?.id ?? 1;
448
+ const authPayload = {
449
+ user: {
450
+ id: currentUserId,
451
+ username: effectiveUser?.username || 'admin',
452
+ plan: 'pro',
453
+ },
454
+ project: {
455
+ permissions: {
456
+ read: [currentUserId],
457
+ write: [currentUserId],
458
+ admin: [currentUserId],
459
+ },
460
+ },
461
+ readOnly: false,
462
+ };
463
+ ws.send(`auth${JSON.stringify(authPayload)}`);
464
+ this.backend.listen(stream);
465
+ }
466
+ else if (!effectiveUser) {
467
+ ws.close(1008, 'invalid_token');
468
+ }
469
+ return;
470
+ }
471
+ for (const p of SPECIAL_PREFIXES) {
472
+ if (text.startsWith(p)) {
473
+ // selection 消息广播给其他连接(用于多人光标/选择)
474
+ if (p === 'selection' && this.wss) {
475
+ for (const client of this.wss.clients) {
476
+ if (client !== ws && client.readyState === WebSocket.OPEN)
477
+ client.send(text);
478
+ }
479
+ }
480
+ return;
481
+ }
482
+ }
483
+ if (text === 'ping') {
484
+ ws.send('pong');
485
+ return;
486
+ }
487
+ return;
488
+ }
489
+ // JSON:兼容 bulk subscribe / ping-pong / 主动 ensureDocExists
490
+ try {
491
+ const msg = JSON.parse(text);
492
+ if (msg?.a === 'bs') {
493
+ const collection = msg.c;
494
+ const ids = msg.b || [];
495
+ const results = {};
496
+ await Promise.all(ids.map(async (id) => {
497
+ const doc = await this.ensureDocExists(collection, id, 'bulkSubscribe');
498
+ if (doc.type)
499
+ results[id] = { v: doc.version, data: doc.data };
500
+ }));
501
+ ws.send(JSON.stringify({ a: 'bs', c: collection, data: results }));
502
+ return;
503
+ }
504
+ if (msg?.a === 'pp') {
505
+ ws.send(JSON.stringify({ a: 'pp' }));
506
+ return;
507
+ }
508
+ // 🔧 修复:添加 documents、settings、user_data collection 支持
509
+ if ((msg?.a === 'f' || msg?.a === 's') && (msg?.c === 'scenes' || msg?.c === 'assets' || msg?.c === 'documents' || msg?.c === 'settings' || msg?.c === 'user_data') && msg?.d != null) {
510
+ console.log(`[sharedb] Pre-creating doc for ${msg.c}/${msg.d} (action=${msg.a})`);
511
+ try {
512
+ await this.ensureDocExists(msg.c, msg.d, `ws:${msg.a}`);
513
+ }
514
+ catch {
515
+ // ignore
516
+ }
517
+ }
518
+ // 🔧 调试:打印转发逻辑
519
+ console.log(`[sharedb] Message received: a=${msg?.a}, c=${msg?.c}, d=${msg?.d}, authed=${authed}, hasMessageHandler=${!!messageHandler}`);
520
+ if (messageHandler && (msg?.a === 'hs' || authed)) {
521
+ console.log(`[sharedb] Forwarding message to ShareDB: ${msg?.a}/${msg?.c}/${msg?.d || 'N/A'}`);
522
+ messageHandler({ data: text });
523
+ }
524
+ else {
525
+ console.log(`[sharedb] ⚠️ Message NOT forwarded: authed=${authed}, hasMessageHandler=${!!messageHandler}`);
526
+ }
527
+ }
528
+ catch {
529
+ // ignore invalid json
530
+ }
531
+ });
532
+ ws.on('close', () => {
533
+ try {
534
+ stream.end();
535
+ }
536
+ catch {
537
+ // ignore
538
+ }
539
+ });
540
+ }
541
+ }
542
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/sharedb/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.test.d.ts","sourceRoot":"","sources":["../../src/sharedb/server.test.ts"],"names":[],"mappings":""}