From cb17e94ad8c0756803888014852b3a126aa8210a Mon Sep 17 00:00:00 2001
From: zhengyiming <540361168@qq.com>
Date: 星期二, 01 七月 2025 17:31:02 +0800
Subject: [PATCH] fix: 江佑保系统健壮性修复

---
 src/utils/record.ts |   91 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 91 insertions(+), 0 deletions(-)

diff --git a/src/utils/record.ts b/src/utils/record.ts
new file mode 100644
index 0000000..1c4c87e
--- /dev/null
+++ b/src/utils/record.ts
@@ -0,0 +1,91 @@
+import * as rrweb from 'rrweb';
+import { guid } from './common';
+import { eventWithTime, listenerHandler } from '@rrweb/types';
+import { storageLocal } from './storage';
+
+export class Recorder {
+  // 鐢熸垚浼氳瘽ID锛堢敤浜庢爣璇嗕竴娆℃姇淇濇祦绋嬶級
+  sessionId = guid();
+  // 瀛樺偍褰曞埗浜嬩欢鐨勬暟缁�
+  events = [];
+
+  stopFn: () => void;
+
+  // 鍒濆鍖栧綍鍒跺櫒
+  init() {
+    this.stopFn = rrweb.record({
+      emit: (event) => {
+        // 鏀堕泦浜嬩欢锛堝彲閫夋嫨瀹炴椂鍙戦�佸埌鍚庣锛�
+        this.events.push(event);
+
+        // 瀹氭湡鍙戦�佷簨浠跺埌鍚庣锛堥伩鍏嶅唴瀛樺崰鐢ㄨ繃澶э級
+        if (this.events.length % 100 === 0) {
+          this.sendEventsToBackend(this.events.splice(0, 100), this.sessionId);
+        }
+      },
+      // 鍙�夐厤缃細蹇界暐鏁忔劅鍏冪礌
+      blockClass: 'rr-block', // 涓烘晱鎰熷厓绱犳坊鍔犳class
+      ignoreClass: 'rr-ignore', // 瀹屽叏蹇界暐鐨勫厓绱�
+    });
+  }
+
+  // 缁撴潫褰曞埗锛堜緥濡傛彁浜ゆ姇淇濊〃鍗曟椂锛�
+  stopRecordingAndSave() {
+    this.stopFn?.();
+    // 鍙戦�佸墿浣欎簨浠跺埌鍚庣
+    if (this.events.length > 0) {
+      this.sendEventsToBackend(this.events, this.sessionId);
+    }
+    // 瀛樺偍浼氳瘽ID锛堝叧鑱斿埌鐢ㄦ埛鎶曚繚璁板綍锛�
+    this.saveSessionIdToUserRecord(this.sessionId);
+  }
+
+  saveSessionIdToUserRecord(sessionId: string) {}
+
+  async sendEventsToBackend(events: eventWithTime[], sessionId: string) {
+    try {
+      const body = JSON.stringify({
+        sessionId,
+        events,
+        timestamp: new Date().toISOString(),
+      });
+      console.log('body: ', body);
+      const storageEvents = storageLocal.getItem(`events`) || {};
+      storageEvents[sessionId] = events;
+      storageLocal.setItem(`events`, storageEvents);
+      // await fetch('/api/recordings', {
+      //   method: 'POST',
+      //   headers: {
+      //     'Content-Type': 'application/json',
+      //   },
+      //   body: ,
+      // });
+    } catch (error) {
+      console.error('Failed to send recording events:', error);
+      // 鍙疄鐜版湰鍦板瓨鍌ㄤ綔涓洪檷绾ф柟妗�
+    }
+  }
+
+  async replaySession(sessionId: string) {
+    // 浠庡悗绔幏鍙栧綍鍒朵簨浠�
+    // const response = await fetch(`/api/recordings/${sessionId}`);
+    // const { events } = await response.json();
+    const storageEvents = storageLocal.getItem(`events`) || {};
+    if (!storageEvents[sessionId]) {
+      return;
+    }
+
+    // 鍒濆鍖栧洖鏀惧櫒
+    const player = new rrweb.Replayer(storageEvents[sessionId], {
+      root: document.getElementById('replay-container'),
+    });
+
+    // 鍙�夛細鎺у埗鍥炴斁閫熷害
+    player.play(1.0); // 1鍊嶉��
+
+    // 鍙�夛細鐩戝惉鍥炴斁浜嬩欢
+    player.on('play', () => console.log('Replay started'));
+    player.on('pause', () => console.log('Replay paused'));
+    player.on('finish', () => console.log('Replay finished'));
+  }
+}

--
Gitblit v1.9.1