action-lens 1.0.12 → 1.0.14
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.
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -294,6 +294,10 @@ var ActionLensRc = class {
|
|
|
294
294
|
eventBuffer = [];
|
|
295
295
|
flushThreshold = 50;
|
|
296
296
|
constructor(_userId, projectId, userMeta, metaData = {}, _db = null, prefix = "") {
|
|
297
|
+
if (!!this.originalUserId) {
|
|
298
|
+
console.warn("ActionLensRc\u306F\u4E00\u5EA6\u3060\u3051\u521D\u671F\u5316\u3057\u3066\u304F\u3060\u3055\u3044\u3002");
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
297
301
|
this.originalUserId = _userId;
|
|
298
302
|
this.db = _db || db;
|
|
299
303
|
(0, import_firestore3.getDoc)((0, import_firestore3.doc)((0, import_firestore3.collection)(this.db, `${prefix}project`), projectId)).then(async (_proj) => {
|
|
@@ -358,7 +362,7 @@ var ActionLensRc = class {
|
|
|
358
362
|
this.stopFnForStore = (0, import_rrweb2.record)({
|
|
359
363
|
collectFonts: true,
|
|
360
364
|
inlineImages: false,
|
|
361
|
-
sampling: { canvas: 500, mousemove:
|
|
365
|
+
sampling: { canvas: 500, mousemove: 500, scroll: 500 },
|
|
362
366
|
emit: (event) => {
|
|
363
367
|
const rec = {
|
|
364
368
|
id: (0, import_firestore3.doc)((0, import_firestore3.collection)(db2, `${prefix}ActionRecord`)).id,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/player.ts","../src/utils/index.ts","../src/record.ts","../src/utils/date.ts"],"sourcesContent":["export * from \"./player\";\nexport * from \"./record\";\nimport \"./style.css\";\nexport * from \"./utils/date\";\n","import {\n doc,\n collection,\n setDoc,\n addDoc,\n where,\n query,\n getDocs,\n orderBy,\n Firestore,\n getDoc,\n} from \"firebase/firestore\";\nimport {\n ActionRecord,\n ActionRecordSession,\n User,\n} from \"@ism-tech/actionlens-type\";\nimport { Replayer } from \"rrweb\";\nimport { db } from \"./utils\"; // dbのインポートパスを適宜変更してください\n\nexport class ActionLensPlayer {\n replayer: Replayer | null = null;\n overlayContainer: HTMLElement | null = null;\n playerStatus: \"playing\" | \"paused\" | \"stopped\" = \"stopped\";\n targetDivId: string;\n db: Firestore;\n prefix: string;\n userId: string | null = null;\n projectId: string | null = null;\n currentTime: number = 0; // 現在の再生時間\n totalTime: number = 0; // 再生中の時間を保持するための変数\n private setIntervalId: NodeJS.Timeout | null = null; // setTimeoutのIDを保持するための変数\n constructor(\n userId: string,\n targetDivId: string,\n projectId: string | null,\n _db: Firestore = db,\n prefix: string = \"\"\n ) {\n // 初期化処理が必要であればここに記述\n this.userId = userId;\n this.targetDivId = targetDivId;\n this.db = _db;\n this.prefix = prefix;\n this.projectId = projectId;\n }\n\n async replayRrwebSession(sessionId: string): Promise<void> {\n try {\n // 1. Firestoreからデータを取得\n\n const q = query(\n collection(this.db, `${this.prefix}ActionRecord`),\n where(\"sessionId\", \"==\", sessionId),\n orderBy(\"timeStamp\", \"asc\")\n );\n\n const querySnapshot = await getDocs(q);\n const events = querySnapshot.docs.map((doc) => {\n const data = doc.data() as ActionRecord;\n return JSON.parse(data.rrwebRecord);\n });\n console.log(\"events\", events);\n if (events.length === 0) {\n console.warn(\n `セッションID ${sessionId} のデータが見つかりませんでした。`\n );\n return;\n }\n\n const targetDiv = document.getElementById(this.targetDivId);\n if (!targetDiv) {\n throw new Error(\n `ID ${this.targetDivId} のdiv要素が見つかりませんでした。`\n );\n }\n\n // クラスを追加\n targetDiv.classList.add(\"replayer-container\");\n\n // 3. Replayerを初期化\n this.replayer = new Replayer(events, {\n root: targetDiv,\n UNSAFE_replayCanvas: false,\n props: {\n autoPlay: true,\n speed: 1,\n mouseTail: true,\n },\n className: \"_replayer-canvas\",\n } as any);\n\n // 4. カスタムイベントのリスナーを追加\n this.replayer.on(\"custom-event\", (event: any) => {\n console.log(\"Custom event:\", event);\n this.handleCustomEvent(event);\n });\n this.replayer.on(\"finish\", () => {\n console.log(\"Replay finished\");\n this.replayer?.pause(0);\n this.playerStatus = \"stopped\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n this.endTimeoutTimeline();\n });\n const { totalTime } = this.replayer.getMetaData();\n this.totalTime = totalTime;\n\n // iframeのスタイルを調整\n const iframes = targetDiv.querySelectorAll(\"iframe\");\n iframes.forEach((iframe) => {\n (iframe as HTMLElement).style.transform = \"translate(-50%, -50%)\";\n (iframe as HTMLElement).style.position = \"absolute\";\n (iframe as HTMLElement).style.left = \"50%\";\n (iframe as HTMLElement).style.top = \"50%\";\n });\n // replayer-mouse-tailにposition: absolute; を追加\n const mouseTailElements = document.querySelectorAll(\n \".replayer-mouse-tail\"\n );\n mouseTailElements.forEach((element) => {\n (element as HTMLElement).style.position = \"absolute\";\n (element as HTMLElement).style.left = \"50%\";\n (element as HTMLElement).style.top = \"50%\";\n (element as HTMLElement).style.transform = \"translate(-50%, -50%)\";\n (element as HTMLElement).style.zIndex = \"1000\"; // z-indexを追加\n });\n\n // 5. 再生開始\n\n this.replayer.play();\n this.playerStatus = \"playing\";\n console.log(`セッションID ${sessionId} の再生を開始しました。`);\n this.setTimeoutTimeline();\n } catch (error) {\n console.error(\"再生エラー:\", error);\n throw error;\n }\n }\n\n // カスタムイベントを処理\n private handleCustomEvent(event: any) {\n if (!event.data || !event.data.type) return;\n\n const { timestamp } = event;\n const timeString = new Date(timestamp).toISOString();\n\n switch (event.data.type) {\n case \"console\":\n const { method, args } = event.data;\n this.displayEvent(\n `[${timeString}] Console ${method}: ${args.join(\", \")}`,\n \"console\"\n );\n\n break;\n case \"navigation\":\n const { url } = event.data;\n this.displayEvent(`[${timeString}] Navigation to ${url}`, \"navigation\");\n break;\n case \"performance\":\n const { name, entryType, duration } = event.data;\n this.displayEvent(\n `[${timeString}] Performance ${entryType}: ${name} (${duration}ms)`,\n \"performance\"\n );\n break;\n default:\n console.warn(\"不明なカスタムイベント:\", event.data.type);\n }\n }\n\n // イベントをオーバーレイに表示\n private displayEvent(message: string, eventType: string) {\n if (!this.overlayContainer) return;\n\n const eventDiv = document.createElement(\"div\");\n eventDiv.style.padding = \"5px\";\n eventDiv.style.borderBottom = \"1px solid rgba(255, 255, 255, 0.2)\";\n\n // イベントタイプに応じた色\n const colors: { [key: string]: string } = {\n console: \"#00cc00\",\n navigation: \"#3399ff\",\n performance: \"#ff9900\",\n };\n eventDiv.style.color = colors[eventType] || \"white\";\n\n eventDiv.innerText = message;\n this.overlayContainer.appendChild(eventDiv);\n\n // 最新のイベントが表示されるようスクロール\n this.overlayContainer.scrollTop = this.overlayContainer.scrollHeight;\n\n // 5秒後にフェードアウト\n setTimeout(() => {\n eventDiv.style.transition = \"opacity 1s\";\n eventDiv.style.opacity = \"0\";\n setTimeout(() => eventDiv.remove(), 1000);\n }, 5000);\n }\n setReplayTime(time: number) {\n if (this.replayer) {\n this.replayer.pause(time);\n this.currentTime = time;\n this.playerStatus = \"stopped\";\n }\n }\n\n setTimeoutTimeline() {\n this.setIntervalId = setInterval(() => {\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }, 10);\n }\n endTimeoutTimeline() {\n if (this.setIntervalId) {\n clearTimeout(this.setIntervalId);\n this.setIntervalId = null;\n }\n }\n\n // 再生を停止\n stopReplay() {\n this.endTimeoutTimeline();\n if (this.replayer) {\n this.replayer.pause();\n this.playerStatus = \"stopped\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }\n }\n restartReplay() {\n this.setTimeoutTimeline();\n if (this.replayer) {\n const offset = this.replayer.getCurrentTime();\n console.log(\"offset\", offset);\n this.replayer.play(offset);\n this.playerStatus = \"playing\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }\n }\n getCurrentTime() {\n if (this.replayer) {\n return this.replayer.getCurrentTime();\n }\n return 0;\n }\n\n resetReplayer() {\n this.endTimeoutTimeline();\n this.playerStatus = \"stopped\";\n this.currentTime = 0;\n\n if (this.replayer) {\n this.replayer.pause();\n this.replayer.destroy();\n this.replayer = null;\n }\n if (this.overlayContainer) {\n this.overlayContainer.remove();\n this.overlayContainer = null;\n }\n }\n async fetchSessionList() {\n try {\n const q = query(\n collection(this.db, `${this.prefix}ActionRecordSession`),\n where(\"projectId\", \"==\", this.projectId),\n orderBy(\"startTime\", \"desc\")\n );\n const usersStore: { [userId: string]: User } = {};\n\n const querySnapshot = await getDocs(q);\n const promise = querySnapshot.docs.map(async (_doc) => {\n const data = _doc.data() as ActionRecordSession;\n if (!usersStore[data.userId]) {\n usersStore[data.userId] = (\n await getDoc(doc(this.db, `${this.prefix}user`, data.userId))\n ).data() as User;\n }\n\n return { ...data, userData: usersStore[data.userId] };\n });\n const sessions: (ActionRecordSession & { userData: User })[] =\n await Promise.all(promise);\n console.log(sessions);\n\n return sessions;\n } catch (error) {\n console.error(\"セッションリストの取得エラー:\", error);\n throw error;\n }\n }\n}\n","import { initializeApp } from \"firebase/app\";\nimport { getFirestore } from \"firebase/firestore\";\n\nconst firebaseConfig = {\n apiKey: \"AIzaSyCxreoOZivnjFIh2mJ6WXjS3ieQ11wsDW8\",\n authDomain: \"actionlens-b14ae.firebaseapp.com\",\n projectId: \"actionlens-b14ae\",\n storageBucket: \"actionlens-b14ae.firebasestorage.app\",\n messagingSenderId: \"36086339210\",\n appId: \"1:36086339210:web:36e16e8778aadd8c58ff73\",\n};\n\n// Initialize Firebase\nconst app = initializeApp(firebaseConfig);\n\nexport const db = getFirestore(app);\n","import { v4 as uuidv4 } from \"uuid\";\nimport { record, Replayer } from \"rrweb\";\nimport {\n Firestore,\n doc,\n collection,\n writeBatch,\n setDoc,\n getDoc,\n} from \"firebase/firestore\";\nimport { ActionRecord, Project, User } from \"@ism-tech/actionlens-type\";\nimport { db } from \"./utils/index\";\n\nexport class ActionLensRc {\n sessionId: string = uuidv4();\n stopFnForStore: any = null;\n userId: string | null = null;\n db: Firestore | null = null;\n prefix: string = \"\";\n userData: User | null = null;\n projectId: string | null = null;\n projectData: Project | null = null;\n organizationId: string | null = null;\n originalUserId: string | null = null;\n\n /** イベントバッファとコミット閾値 */\n private eventBuffer: ActionRecord[] = [];\n private readonly flushThreshold = 50;\n\n constructor(\n _userId: string | null,\n projectId: string | null,\n userMeta: { name: string; email: string } | null,\n metaData: Record<string, any> = {},\n _db: Firestore | null = null,\n prefix: string = \"\"\n ) {\n this.originalUserId = _userId;\n this.db = _db || db;\n\n // --- プロジェクト取得 ---\n getDoc(doc(collection(this.db, `${prefix}project`), projectId!))\n .then(async (_proj) => {\n this.projectData = _proj.data() as Project;\n this.organizationId = this.projectData?.organizationId || null;\n\n if (!this.db) {\n this.db = db;\n }\n\n // --- ユーザー取得・初期化 ---\n getDoc(doc(collection(this.db, `${prefix}user`), _userId!))\n .then(async (_usr) => {\n // 必要に応じてユーザーデータを作成/更新\n this.userId = `${this.organizationId}-${_userId}`;\n this.prefix = prefix;\n this.projectId = projectId;\n\n // 録画・ログキャプチャ開始\n this.startRrwebRecordingForStore();\n this.startConsoleRecording();\n // this.startTimelineRecording();\n })\n .catch((e) => console.error(\"ユーザーデータ取得エラー:\", e));\n })\n .catch((e) => console.error(\"プロジェクト取得エラー:\", e));\n }\n\n /** バッファ内イベントをまとめて Firestore に書き込む */\n private flushBuffer() {\n if (!this.db || this.eventBuffer.length === 0) return;\n const batch = writeBatch(this.db);\n this.eventBuffer.forEach((rec) => {\n const ref = doc(collection(this.db!, `${this.prefix}ActionRecord`));\n batch.set(ref, rec);\n });\n batch.commit().catch((e) => console.error(\"Batch commit error:\", e));\n this.eventBuffer = [];\n }\n\n /** コンソール呼び出しを rrweb カスタムイベントとして記録 */\n startConsoleRecording() {\n const methods = [\"log\", \"info\", \"warn\", \"error\", \"debug\", \"trace\"] as const;\n const original: Record<string, Function> = {};\n methods.forEach((m) => {\n original[m] = (console as any)[m].bind(console);\n (console as any)[m] = (...args: any[]) => {\n original[m](...args);\n record.addCustomEvent(\"console\", { method: m, args });\n this.updateActionRecordSession();\n };\n });\n }\n\n /** rrweb を使って画面操作をバッファ&バッチ保存 */\n startRrwebRecordingForStore() {\n if (this.stopFnForStore) return;\n const userId = this.userId || \"unknown\";\n const originalUserId = this.originalUserId || \"\";\n const sessionId = this.sessionId;\n const db = this.db!;\n const prefix = this.prefix;\n\n // セッション開始レコード\n setDoc(doc(collection(db, `${prefix}ActionRecordSession`), sessionId), {\n id: sessionId,\n startTime: new Date(),\n endTime: null,\n userId,\n projectId: this.projectId,\n organizationId: this.projectData?.organizationId || null,\n createAt: new Date(),\n updateAt: new Date(),\n createdBy: userId,\n updatedBy: userId,\n }).catch((e) => console.error(e));\n\n this.stopFnForStore = record({\n collectFonts: true,\n inlineImages: false,\n sampling: { canvas: 500, mousemove: false, scroll: 500 },\n emit: (event) => {\n const rec: ActionRecord = {\n id: doc(collection(db, `${prefix}ActionRecord`)).id,\n timeStamp: new Date(),\n userId,\n originalUserId,\n sessionId,\n type: \"rrweb\",\n rrwebRecord: JSON.stringify(event),\n createAt: new Date(),\n updateAt: new Date(),\n hidden: false,\n createdBy: userId,\n updatedBy: userId,\n hiddenBy: \"\",\n };\n // バッファ追加\n this.eventBuffer.push(rec);\n // 閾値到達で一括書き込み\n\n // セッション更新\n setDoc(\n doc(collection(db, `${prefix}ActionRecordSession`), sessionId),\n { endTime: new Date(), updateAt: new Date(), updatedBy: userId },\n { merge: true }\n ).catch((e) => console.error(e));\n },\n recordCanvas: false,\n });\n setInterval(() => {\n // 定期的にバッファをフラッシュ\n this.flushBuffer();\n }, 5000); // 5秒ごとにフラッシュ\n }\n\n /** 録画停止とバッファフラッシュ */\n stopRrwebRecordingForStore() {\n if (this.stopFnForStore) {\n this.stopFnForStore();\n this.stopFnForStore = null;\n this.flushBuffer();\n }\n }\n\n /** セッションの endTime を更新 */\n updateActionRecordSession() {\n if (!this.db || !this.sessionId || !this.userId) return;\n setDoc(\n doc(\n collection(this.db, `${this.prefix}ActionRecordSession`),\n this.sessionId\n ),\n { endTime: new Date(), updateAt: new Date(), updatedBy: this.userId },\n { merge: true }\n ).catch((e) => console.error(e));\n }\n\n // タイムライン(ナビゲーションとパフォーマンス)をキャプチャ\n startTimelineRecording() {\n try {\n const userId = this.userId || \"unknown\";\n const sessionId = this.sessionId;\n const db = this.db;\n const prefix = this.prefix;\n const _updateActionRecordSession = () => this.updateActionRecordSession();\n // ナビゲーション履歴(popstateイベント)\n window.addEventListener(\"popstate\", (event) => {\n if (!db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n\n const navigationEvent = {\n type: \"custom\",\n data: {\n type: \"navigation\",\n url: window.location.href,\n state: event.state,\n },\n timestamp: Date.now(),\n };\n\n const newDocRef = doc(collection(db, `${prefix}ActionRecord`));\n const record: ActionRecord = {\n id: newDocRef.id,\n timeStamp: new Date(),\n userId,\n type: \"navigation\",\n originalUserId: this.originalUserId ?? \"\",\n sessionId,\n rrwebRecord: JSON.stringify(navigationEvent),\n createAt: new Date(),\n updateAt: new Date(),\n hidden: false,\n createdBy: userId,\n updatedBy: userId,\n hiddenBy: \"\",\n };\n\n setDoc(newDocRef, record).catch((error) => {\n console.error(\"Error saving navigation event: \", error);\n });\n _updateActionRecordSession();\n });\n\n // パフォーマンスエントリ\n if (window.performance) {\n const observer = new PerformanceObserver((list) => {\n if (!db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n\n for (const entry of list.getEntries()) {\n const performanceEvent = {\n type: \"custom\",\n data: {\n type: \"performance\",\n name: entry.name,\n entryType: entry.entryType,\n startTime: entry.startTime,\n duration: entry.duration,\n },\n timestamp: Date.now(),\n };\n\n const newDocRef = doc(collection(db, `${prefix}ActionRecord`));\n const record: ActionRecord = {\n id: newDocRef.id,\n timeStamp: new Date(),\n userId,\n originalUserId: this.originalUserId ?? \"\",\n type: \"performance\",\n sessionId,\n rrwebRecord: JSON.stringify(performanceEvent),\n createAt: new Date(),\n updateAt: new Date(),\n hidden: false,\n createdBy: userId,\n updatedBy: userId,\n hiddenBy: \"\",\n };\n\n setDoc(newDocRef, record).catch((error) => {\n console.error(\"Error saving performance event: \", error);\n });\n }\n });\n\n observer.observe({ entryTypes: [\"resource\", \"navigation\", \"paint\"] });\n }\n } catch (error) {\n console.error(\"タイムライン録画エラー:\", error);\n throw error;\n }\n }\n}\n","import { Timestamp } from \"firebase/firestore\";\n// import { copy } from \"copy-anything\";\n/** Timestampの時はDateへの変更 */\nexport function convertTimestampToDate(\n timestamp: Timestamp | Date | null\n): Date | null {\n if (!timestamp) return null;\n /** string の場合(本来は来ないはずなのに) */\n if (typeof timestamp === \"string\") {\n const _string = new Date(timestamp);\n // console.log('convertTimestampToDate-string:', _string)\n if (isNaN(_string.getTime())) {\n return null;\n }\n return _string;\n }\n if (\"_seconds\" in timestamp && timestamp?._seconds) {\n return new Date(Number(timestamp._seconds) * 1000);\n }\n /** timestampの場合 */\n if (timestamp instanceof Timestamp) {\n const _timestamp = timestamp.toDate();\n // console.log('convertTimestampToDate-timestamp:', _timestamp)\n return _timestamp;\n }\n /** Dateの場合 */\n if (timestamp instanceof Date) {\n const _date = timestamp;\n // console.log('convertTimestampToDate-date:', _date)\n return _date;\n }\n // console.log('convertTimestampToDate-type:', typeof timestamp)\n // console.log('convertTimestampToDate-else:', timestamp)\n return timestamp;\n}\n\n/**\n * 時間を文字に変換\n * @param payload Date | Timestamp | string | null\n * @param format YYYY/MM/DD hh:mm:ss\n */\nexport const dateFormat = (\n payload:\n | Date\n | Timestamp\n | string\n | number\n | null\n | undefined\n | {\n _seconds: number;\n _nanoseconds: number;\n },\n format: string = \"YYYY/MM/DD\"\n) => {\n let date = payload;\n if (!date) return \"\";\n if (typeof date === \"string\") {\n if (date.length === 8 && /^\\d{8}$/.test(date)) {\n // 'YYYYMMDD'形式の対応\n const strYear = Number(date.slice(0, 4));\n const strMonth = Number(date.slice(4, 6)) - 1; // 月は0始まり\n const strDate = Number(date.slice(6, 8));\n date = new Date(strYear, strMonth, strDate);\n } else if (!/^(\\d{4}).([0-1]\\d).([0-3]\\d).*$/.test(date)) {\n return \"error\";\n } else {\n const strYear = Number(date.slice(0, 4));\n const strMonth = Number(date.slice(5, 7)) - 1;\n const strDate = Number(date.slice(8, 10));\n date = new Date(strYear, strMonth, strDate);\n }\n }\n if (typeof date === \"number\") {\n date = new Date(date);\n }\n if (isTimestamp(date)) {\n date = date.toDate();\n }\n if (date.hasOwnProperty(\"_seconds\") && date.hasOwnProperty(\"_nanoseconds\")) {\n date = new Date(\n // @ts-ignore\n date._seconds * 1000 + Math.floor(date._nanoseconds / 1000000)\n );\n }\n\n date = new Date(date as Date);\n\n format = format.replace(/YYYY/g, date.getFullYear().toString());\n format = format.replace(/MM/g, (\"0\" + (date.getMonth() + 1)).slice(-2));\n format = format.replace(/DD/g, (\"0\" + date.getDate()).slice(-2));\n format = format.replace(/hh/g, (\"0\" + date.getHours()).slice(-2));\n format = format.replace(/mm/g, (\"0\" + date.getMinutes()).slice(-2));\n format = format.replace(/ss/g, (\"0\" + date.getSeconds()).slice(-2));\n format = format.replace(/SSS/g, (\"00\" + date.getMilliseconds()).slice(-3));\n format = format.replace(\n /aaa/g,\n [\"日\", \"月\", \"火\", \"水\", \"木\", \"金\", \"土\"][date.getDay()]\n );\n // if (format.includes('-')) {\n // console.log('「-」includes warning')\n // }\n\n return format;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst isTimestamp = (payload: any): payload is Timestamp => {\n return payload.toDate !== undefined;\n};\n"],"mappings":"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","names":["import_firestore","doc","import_rrweb","import_firestore","uuidv4","db","record","import_firestore"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/player.ts","../src/utils/index.ts","../src/record.ts","../src/utils/date.ts"],"sourcesContent":["export * from \"./player\";\nexport * from \"./record\";\nimport \"./style.css\";\nexport * from \"./utils/date\";\n","import {\n doc,\n collection,\n setDoc,\n addDoc,\n where,\n query,\n getDocs,\n orderBy,\n Firestore,\n getDoc,\n} from \"firebase/firestore\";\nimport {\n ActionRecord,\n ActionRecordSession,\n User,\n} from \"@ism-tech/actionlens-type\";\nimport { Replayer } from \"rrweb\";\nimport { db } from \"./utils\"; // dbのインポートパスを適宜変更してください\n\nexport class ActionLensPlayer {\n replayer: Replayer | null = null;\n overlayContainer: HTMLElement | null = null;\n playerStatus: \"playing\" | \"paused\" | \"stopped\" = \"stopped\";\n targetDivId: string;\n db: Firestore;\n prefix: string;\n userId: string | null = null;\n projectId: string | null = null;\n currentTime: number = 0; // 現在の再生時間\n totalTime: number = 0; // 再生中の時間を保持するための変数\n private setIntervalId: NodeJS.Timeout | null = null; // setTimeoutのIDを保持するための変数\n constructor(\n userId: string,\n targetDivId: string,\n projectId: string | null,\n _db: Firestore = db,\n prefix: string = \"\"\n ) {\n // 初期化処理が必要であればここに記述\n this.userId = userId;\n this.targetDivId = targetDivId;\n this.db = _db;\n this.prefix = prefix;\n this.projectId = projectId;\n }\n\n async replayRrwebSession(sessionId: string): Promise<void> {\n try {\n // 1. Firestoreからデータを取得\n\n const q = query(\n collection(this.db, `${this.prefix}ActionRecord`),\n where(\"sessionId\", \"==\", sessionId),\n orderBy(\"timeStamp\", \"asc\")\n );\n\n const querySnapshot = await getDocs(q);\n const events = querySnapshot.docs.map((doc) => {\n const data = doc.data() as ActionRecord;\n return JSON.parse(data.rrwebRecord);\n });\n console.log(\"events\", events);\n if (events.length === 0) {\n console.warn(\n `セッションID ${sessionId} のデータが見つかりませんでした。`\n );\n return;\n }\n\n const targetDiv = document.getElementById(this.targetDivId);\n if (!targetDiv) {\n throw new Error(\n `ID ${this.targetDivId} のdiv要素が見つかりませんでした。`\n );\n }\n\n // クラスを追加\n targetDiv.classList.add(\"replayer-container\");\n\n // 3. Replayerを初期化\n this.replayer = new Replayer(events, {\n root: targetDiv,\n UNSAFE_replayCanvas: false,\n props: {\n autoPlay: true,\n speed: 1,\n mouseTail: true,\n },\n className: \"_replayer-canvas\",\n } as any);\n\n // 4. カスタムイベントのリスナーを追加\n this.replayer.on(\"custom-event\", (event: any) => {\n console.log(\"Custom event:\", event);\n this.handleCustomEvent(event);\n });\n this.replayer.on(\"finish\", () => {\n console.log(\"Replay finished\");\n this.replayer?.pause(0);\n this.playerStatus = \"stopped\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n this.endTimeoutTimeline();\n });\n const { totalTime } = this.replayer.getMetaData();\n this.totalTime = totalTime;\n\n // iframeのスタイルを調整\n const iframes = targetDiv.querySelectorAll(\"iframe\");\n iframes.forEach((iframe) => {\n (iframe as HTMLElement).style.transform = \"translate(-50%, -50%)\";\n (iframe as HTMLElement).style.position = \"absolute\";\n (iframe as HTMLElement).style.left = \"50%\";\n (iframe as HTMLElement).style.top = \"50%\";\n });\n // replayer-mouse-tailにposition: absolute; を追加\n const mouseTailElements = document.querySelectorAll(\n \".replayer-mouse-tail\"\n );\n mouseTailElements.forEach((element) => {\n (element as HTMLElement).style.position = \"absolute\";\n (element as HTMLElement).style.left = \"50%\";\n (element as HTMLElement).style.top = \"50%\";\n (element as HTMLElement).style.transform = \"translate(-50%, -50%)\";\n (element as HTMLElement).style.zIndex = \"1000\"; // z-indexを追加\n });\n\n // 5. 再生開始\n\n this.replayer.play();\n this.playerStatus = \"playing\";\n console.log(`セッションID ${sessionId} の再生を開始しました。`);\n this.setTimeoutTimeline();\n } catch (error) {\n console.error(\"再生エラー:\", error);\n throw error;\n }\n }\n\n // カスタムイベントを処理\n private handleCustomEvent(event: any) {\n if (!event.data || !event.data.type) return;\n\n const { timestamp } = event;\n const timeString = new Date(timestamp).toISOString();\n\n switch (event.data.type) {\n case \"console\":\n const { method, args } = event.data;\n this.displayEvent(\n `[${timeString}] Console ${method}: ${args.join(\", \")}`,\n \"console\"\n );\n\n break;\n case \"navigation\":\n const { url } = event.data;\n this.displayEvent(`[${timeString}] Navigation to ${url}`, \"navigation\");\n break;\n case \"performance\":\n const { name, entryType, duration } = event.data;\n this.displayEvent(\n `[${timeString}] Performance ${entryType}: ${name} (${duration}ms)`,\n \"performance\"\n );\n break;\n default:\n console.warn(\"不明なカスタムイベント:\", event.data.type);\n }\n }\n\n // イベントをオーバーレイに表示\n private displayEvent(message: string, eventType: string) {\n if (!this.overlayContainer) return;\n\n const eventDiv = document.createElement(\"div\");\n eventDiv.style.padding = \"5px\";\n eventDiv.style.borderBottom = \"1px solid rgba(255, 255, 255, 0.2)\";\n\n // イベントタイプに応じた色\n const colors: { [key: string]: string } = {\n console: \"#00cc00\",\n navigation: \"#3399ff\",\n performance: \"#ff9900\",\n };\n eventDiv.style.color = colors[eventType] || \"white\";\n\n eventDiv.innerText = message;\n this.overlayContainer.appendChild(eventDiv);\n\n // 最新のイベントが表示されるようスクロール\n this.overlayContainer.scrollTop = this.overlayContainer.scrollHeight;\n\n // 5秒後にフェードアウト\n setTimeout(() => {\n eventDiv.style.transition = \"opacity 1s\";\n eventDiv.style.opacity = \"0\";\n setTimeout(() => eventDiv.remove(), 1000);\n }, 5000);\n }\n setReplayTime(time: number) {\n if (this.replayer) {\n this.replayer.pause(time);\n this.currentTime = time;\n this.playerStatus = \"stopped\";\n }\n }\n\n setTimeoutTimeline() {\n this.setIntervalId = setInterval(() => {\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }, 10);\n }\n endTimeoutTimeline() {\n if (this.setIntervalId) {\n clearTimeout(this.setIntervalId);\n this.setIntervalId = null;\n }\n }\n\n // 再生を停止\n stopReplay() {\n this.endTimeoutTimeline();\n if (this.replayer) {\n this.replayer.pause();\n this.playerStatus = \"stopped\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }\n }\n restartReplay() {\n this.setTimeoutTimeline();\n if (this.replayer) {\n const offset = this.replayer.getCurrentTime();\n console.log(\"offset\", offset);\n this.replayer.play(offset);\n this.playerStatus = \"playing\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }\n }\n getCurrentTime() {\n if (this.replayer) {\n return this.replayer.getCurrentTime();\n }\n return 0;\n }\n\n resetReplayer() {\n this.endTimeoutTimeline();\n this.playerStatus = \"stopped\";\n this.currentTime = 0;\n\n if (this.replayer) {\n this.replayer.pause();\n this.replayer.destroy();\n this.replayer = null;\n }\n if (this.overlayContainer) {\n this.overlayContainer.remove();\n this.overlayContainer = null;\n }\n }\n async fetchSessionList() {\n try {\n const q = query(\n collection(this.db, `${this.prefix}ActionRecordSession`),\n where(\"projectId\", \"==\", this.projectId),\n orderBy(\"startTime\", \"desc\")\n );\n const usersStore: { [userId: string]: User } = {};\n\n const querySnapshot = await getDocs(q);\n const promise = querySnapshot.docs.map(async (_doc) => {\n const data = _doc.data() as ActionRecordSession;\n if (!usersStore[data.userId]) {\n usersStore[data.userId] = (\n await getDoc(doc(this.db, `${this.prefix}user`, data.userId))\n ).data() as User;\n }\n\n return { ...data, userData: usersStore[data.userId] };\n });\n const sessions: (ActionRecordSession & { userData: User })[] =\n await Promise.all(promise);\n console.log(sessions);\n\n return sessions;\n } catch (error) {\n console.error(\"セッションリストの取得エラー:\", error);\n throw error;\n }\n }\n}\n","import { initializeApp } from \"firebase/app\";\nimport { getFirestore } from \"firebase/firestore\";\n\nconst firebaseConfig = {\n apiKey: \"AIzaSyCxreoOZivnjFIh2mJ6WXjS3ieQ11wsDW8\",\n authDomain: \"actionlens-b14ae.firebaseapp.com\",\n projectId: \"actionlens-b14ae\",\n storageBucket: \"actionlens-b14ae.firebasestorage.app\",\n messagingSenderId: \"36086339210\",\n appId: \"1:36086339210:web:36e16e8778aadd8c58ff73\",\n};\n\n// Initialize Firebase\nconst app = initializeApp(firebaseConfig);\n\nexport const db = getFirestore(app);\n","import { v4 as uuidv4 } from \"uuid\";\nimport { record, Replayer } from \"rrweb\";\nimport {\n Firestore,\n doc,\n collection,\n writeBatch,\n setDoc,\n getDoc,\n} from \"firebase/firestore\";\nimport { ActionRecord, Project, User } from \"@ism-tech/actionlens-type\";\nimport { db } from \"./utils/index\";\n\nexport class ActionLensRc {\n sessionId: string = uuidv4();\n stopFnForStore: any = null;\n userId: string | null = null;\n db: Firestore | null = null;\n prefix: string = \"\";\n userData: User | null = null;\n projectId: string | null = null;\n projectData: Project | null = null;\n organizationId: string | null = null;\n originalUserId: string | null = null;\n\n /** イベントバッファとコミット閾値 */\n private eventBuffer: ActionRecord[] = [];\n private readonly flushThreshold = 50;\n\n constructor(\n _userId: string | null,\n projectId: string | null,\n userMeta: { name: string; email: string } | null,\n metaData: Record<string, any> = {},\n _db: Firestore | null = null,\n prefix: string = \"\"\n ) {\n if (!!this.originalUserId) {\n console.warn(\"ActionLensRcは一度だけ初期化してください。\");\n return;\n }\n this.originalUserId = _userId;\n this.db = _db || db;\n\n // --- プロジェクト取得 ---\n getDoc(doc(collection(this.db, `${prefix}project`), projectId!))\n .then(async (_proj) => {\n this.projectData = _proj.data() as Project;\n this.organizationId = this.projectData?.organizationId || null;\n\n if (!this.db) {\n this.db = db;\n }\n\n // --- ユーザー取得・初期化 ---\n getDoc(doc(collection(this.db, `${prefix}user`), _userId!))\n .then(async (_usr) => {\n // 必要に応じてユーザーデータを作成/更新\n this.userId = `${this.organizationId}-${_userId}`;\n this.prefix = prefix;\n this.projectId = projectId;\n\n // 録画・ログキャプチャ開始\n this.startRrwebRecordingForStore();\n this.startConsoleRecording();\n // this.startTimelineRecording();\n })\n .catch((e) => console.error(\"ユーザーデータ取得エラー:\", e));\n })\n .catch((e) => console.error(\"プロジェクト取得エラー:\", e));\n }\n\n /** バッファ内イベントをまとめて Firestore に書き込む */\n private flushBuffer() {\n if (!this.db || this.eventBuffer.length === 0) return;\n const batch = writeBatch(this.db);\n this.eventBuffer.forEach((rec) => {\n const ref = doc(collection(this.db!, `${this.prefix}ActionRecord`));\n batch.set(ref, rec);\n });\n batch.commit().catch((e) => console.error(\"Batch commit error:\", e));\n this.eventBuffer = [];\n }\n\n /** コンソール呼び出しを rrweb カスタムイベントとして記録 */\n startConsoleRecording() {\n const methods = [\"log\", \"info\", \"warn\", \"error\", \"debug\", \"trace\"] as const;\n const original: Record<string, Function> = {};\n methods.forEach((m) => {\n original[m] = (console as any)[m].bind(console);\n (console as any)[m] = (...args: any[]) => {\n original[m](...args);\n record.addCustomEvent(\"console\", { method: m, args });\n this.updateActionRecordSession();\n };\n });\n }\n\n /** rrweb を使って画面操作をバッファ&バッチ保存 */\n startRrwebRecordingForStore() {\n if (this.stopFnForStore) return;\n const userId = this.userId || \"unknown\";\n const originalUserId = this.originalUserId || \"\";\n const sessionId = this.sessionId;\n const db = this.db!;\n const prefix = this.prefix;\n\n // セッション開始レコード\n setDoc(doc(collection(db, `${prefix}ActionRecordSession`), sessionId), {\n id: sessionId,\n startTime: new Date(),\n endTime: null,\n userId,\n projectId: this.projectId,\n organizationId: this.projectData?.organizationId || null,\n createAt: new Date(),\n updateAt: new Date(),\n createdBy: userId,\n updatedBy: userId,\n }).catch((e) => console.error(e));\n\n this.stopFnForStore = record({\n collectFonts: true,\n inlineImages: false,\n sampling: { canvas: 500, mousemove: 500, scroll: 500 },\n emit: (event) => {\n const rec: ActionRecord = {\n id: doc(collection(db, `${prefix}ActionRecord`)).id,\n timeStamp: new Date(),\n userId,\n originalUserId,\n sessionId,\n type: \"rrweb\",\n rrwebRecord: JSON.stringify(event),\n createAt: new Date(),\n updateAt: new Date(),\n hidden: false,\n createdBy: userId,\n updatedBy: userId,\n hiddenBy: \"\",\n };\n // バッファ追加\n this.eventBuffer.push(rec);\n // 閾値到達で一括書き込み\n\n // セッション更新\n setDoc(\n doc(collection(db, `${prefix}ActionRecordSession`), sessionId),\n { endTime: new Date(), updateAt: new Date(), updatedBy: userId },\n { merge: true }\n ).catch((e) => console.error(e));\n },\n recordCanvas: false,\n });\n setInterval(() => {\n // 定期的にバッファをフラッシュ\n this.flushBuffer();\n }, 5000); // 5秒ごとにフラッシュ\n }\n\n /** 録画停止とバッファフラッシュ */\n stopRrwebRecordingForStore() {\n if (this.stopFnForStore) {\n this.stopFnForStore();\n this.stopFnForStore = null;\n this.flushBuffer();\n }\n }\n\n /** セッションの endTime を更新 */\n updateActionRecordSession() {\n if (!this.db || !this.sessionId || !this.userId) return;\n setDoc(\n doc(\n collection(this.db, `${this.prefix}ActionRecordSession`),\n this.sessionId\n ),\n { endTime: new Date(), updateAt: new Date(), updatedBy: this.userId },\n { merge: true }\n ).catch((e) => console.error(e));\n }\n\n // タイムライン(ナビゲーションとパフォーマンス)をキャプチャ\n startTimelineRecording() {\n try {\n const userId = this.userId || \"unknown\";\n const sessionId = this.sessionId;\n const db = this.db;\n const prefix = this.prefix;\n const _updateActionRecordSession = () => this.updateActionRecordSession();\n // ナビゲーション履歴(popstateイベント)\n window.addEventListener(\"popstate\", (event) => {\n if (!db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n\n const navigationEvent = {\n type: \"custom\",\n data: {\n type: \"navigation\",\n url: window.location.href,\n state: event.state,\n },\n timestamp: Date.now(),\n };\n\n const newDocRef = doc(collection(db, `${prefix}ActionRecord`));\n const record: ActionRecord = {\n id: newDocRef.id,\n timeStamp: new Date(),\n userId,\n type: \"navigation\",\n originalUserId: this.originalUserId ?? \"\",\n sessionId,\n rrwebRecord: JSON.stringify(navigationEvent),\n createAt: new Date(),\n updateAt: new Date(),\n hidden: false,\n createdBy: userId,\n updatedBy: userId,\n hiddenBy: \"\",\n };\n\n setDoc(newDocRef, record).catch((error) => {\n console.error(\"Error saving navigation event: \", error);\n });\n _updateActionRecordSession();\n });\n\n // パフォーマンスエントリ\n if (window.performance) {\n const observer = new PerformanceObserver((list) => {\n if (!db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n\n for (const entry of list.getEntries()) {\n const performanceEvent = {\n type: \"custom\",\n data: {\n type: \"performance\",\n name: entry.name,\n entryType: entry.entryType,\n startTime: entry.startTime,\n duration: entry.duration,\n },\n timestamp: Date.now(),\n };\n\n const newDocRef = doc(collection(db, `${prefix}ActionRecord`));\n const record: ActionRecord = {\n id: newDocRef.id,\n timeStamp: new Date(),\n userId,\n originalUserId: this.originalUserId ?? \"\",\n type: \"performance\",\n sessionId,\n rrwebRecord: JSON.stringify(performanceEvent),\n createAt: new Date(),\n updateAt: new Date(),\n hidden: false,\n createdBy: userId,\n updatedBy: userId,\n hiddenBy: \"\",\n };\n\n setDoc(newDocRef, record).catch((error) => {\n console.error(\"Error saving performance event: \", error);\n });\n }\n });\n\n observer.observe({ entryTypes: [\"resource\", \"navigation\", \"paint\"] });\n }\n } catch (error) {\n console.error(\"タイムライン録画エラー:\", error);\n throw error;\n }\n }\n}\n","import { Timestamp } from \"firebase/firestore\";\n// import { copy } from \"copy-anything\";\n/** Timestampの時はDateへの変更 */\nexport function convertTimestampToDate(\n timestamp: Timestamp | Date | null\n): Date | null {\n if (!timestamp) return null;\n /** string の場合(本来は来ないはずなのに) */\n if (typeof timestamp === \"string\") {\n const _string = new Date(timestamp);\n // console.log('convertTimestampToDate-string:', _string)\n if (isNaN(_string.getTime())) {\n return null;\n }\n return _string;\n }\n if (\"_seconds\" in timestamp && timestamp?._seconds) {\n return new Date(Number(timestamp._seconds) * 1000);\n }\n /** timestampの場合 */\n if (timestamp instanceof Timestamp) {\n const _timestamp = timestamp.toDate();\n // console.log('convertTimestampToDate-timestamp:', _timestamp)\n return _timestamp;\n }\n /** Dateの場合 */\n if (timestamp instanceof Date) {\n const _date = timestamp;\n // console.log('convertTimestampToDate-date:', _date)\n return _date;\n }\n // console.log('convertTimestampToDate-type:', typeof timestamp)\n // console.log('convertTimestampToDate-else:', timestamp)\n return timestamp;\n}\n\n/**\n * 時間を文字に変換\n * @param payload Date | Timestamp | string | null\n * @param format YYYY/MM/DD hh:mm:ss\n */\nexport const dateFormat = (\n payload:\n | Date\n | Timestamp\n | string\n | number\n | null\n | undefined\n | {\n _seconds: number;\n _nanoseconds: number;\n },\n format: string = \"YYYY/MM/DD\"\n) => {\n let date = payload;\n if (!date) return \"\";\n if (typeof date === \"string\") {\n if (date.length === 8 && /^\\d{8}$/.test(date)) {\n // 'YYYYMMDD'形式の対応\n const strYear = Number(date.slice(0, 4));\n const strMonth = Number(date.slice(4, 6)) - 1; // 月は0始まり\n const strDate = Number(date.slice(6, 8));\n date = new Date(strYear, strMonth, strDate);\n } else if (!/^(\\d{4}).([0-1]\\d).([0-3]\\d).*$/.test(date)) {\n return \"error\";\n } else {\n const strYear = Number(date.slice(0, 4));\n const strMonth = Number(date.slice(5, 7)) - 1;\n const strDate = Number(date.slice(8, 10));\n date = new Date(strYear, strMonth, strDate);\n }\n }\n if (typeof date === \"number\") {\n date = new Date(date);\n }\n if (isTimestamp(date)) {\n date = date.toDate();\n }\n if (date.hasOwnProperty(\"_seconds\") && date.hasOwnProperty(\"_nanoseconds\")) {\n date = new Date(\n // @ts-ignore\n date._seconds * 1000 + Math.floor(date._nanoseconds / 1000000)\n );\n }\n\n date = new Date(date as Date);\n\n format = format.replace(/YYYY/g, date.getFullYear().toString());\n format = format.replace(/MM/g, (\"0\" + (date.getMonth() + 1)).slice(-2));\n format = format.replace(/DD/g, (\"0\" + date.getDate()).slice(-2));\n format = format.replace(/hh/g, (\"0\" + date.getHours()).slice(-2));\n format = format.replace(/mm/g, (\"0\" + date.getMinutes()).slice(-2));\n format = format.replace(/ss/g, (\"0\" + date.getSeconds()).slice(-2));\n format = format.replace(/SSS/g, (\"00\" + date.getMilliseconds()).slice(-3));\n format = format.replace(\n /aaa/g,\n [\"日\", \"月\", \"火\", \"水\", \"木\", \"金\", \"土\"][date.getDay()]\n );\n // if (format.includes('-')) {\n // console.log('「-」includes warning')\n // }\n\n return format;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst isTimestamp = (payload: any): payload is Timestamp => {\n return payload.toDate !== undefined;\n};\n"],"mappings":"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","names":["import_firestore","doc","import_rrweb","import_firestore","uuidv4","db","record","import_firestore"]}
|
package/dist/index.mjs
CHANGED
|
@@ -279,6 +279,10 @@ var ActionLensRc = class {
|
|
|
279
279
|
eventBuffer = [];
|
|
280
280
|
flushThreshold = 50;
|
|
281
281
|
constructor(_userId, projectId, userMeta, metaData = {}, _db = null, prefix = "") {
|
|
282
|
+
if (!!this.originalUserId) {
|
|
283
|
+
console.warn("ActionLensRc\u306F\u4E00\u5EA6\u3060\u3051\u521D\u671F\u5316\u3057\u3066\u304F\u3060\u3055\u3044\u3002");
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
282
286
|
this.originalUserId = _userId;
|
|
283
287
|
this.db = _db || db;
|
|
284
288
|
getDoc2(doc2(collection2(this.db, `${prefix}project`), projectId)).then(async (_proj) => {
|
|
@@ -343,7 +347,7 @@ var ActionLensRc = class {
|
|
|
343
347
|
this.stopFnForStore = record({
|
|
344
348
|
collectFonts: true,
|
|
345
349
|
inlineImages: false,
|
|
346
|
-
sampling: { canvas: 500, mousemove:
|
|
350
|
+
sampling: { canvas: 500, mousemove: 500, scroll: 500 },
|
|
347
351
|
emit: (event) => {
|
|
348
352
|
const rec = {
|
|
349
353
|
id: doc2(collection2(db2, `${prefix}ActionRecord`)).id,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/player.ts","../src/utils/index.ts","../src/record.ts","../src/utils/date.ts"],"sourcesContent":["import {\n doc,\n collection,\n setDoc,\n addDoc,\n where,\n query,\n getDocs,\n orderBy,\n Firestore,\n getDoc,\n} from \"firebase/firestore\";\nimport {\n ActionRecord,\n ActionRecordSession,\n User,\n} from \"@ism-tech/actionlens-type\";\nimport { Replayer } from \"rrweb\";\nimport { db } from \"./utils\"; // dbのインポートパスを適宜変更してください\n\nexport class ActionLensPlayer {\n replayer: Replayer | null = null;\n overlayContainer: HTMLElement | null = null;\n playerStatus: \"playing\" | \"paused\" | \"stopped\" = \"stopped\";\n targetDivId: string;\n db: Firestore;\n prefix: string;\n userId: string | null = null;\n projectId: string | null = null;\n currentTime: number = 0; // 現在の再生時間\n totalTime: number = 0; // 再生中の時間を保持するための変数\n private setIntervalId: NodeJS.Timeout | null = null; // setTimeoutのIDを保持するための変数\n constructor(\n userId: string,\n targetDivId: string,\n projectId: string | null,\n _db: Firestore = db,\n prefix: string = \"\"\n ) {\n // 初期化処理が必要であればここに記述\n this.userId = userId;\n this.targetDivId = targetDivId;\n this.db = _db;\n this.prefix = prefix;\n this.projectId = projectId;\n }\n\n async replayRrwebSession(sessionId: string): Promise<void> {\n try {\n // 1. Firestoreからデータを取得\n\n const q = query(\n collection(this.db, `${this.prefix}ActionRecord`),\n where(\"sessionId\", \"==\", sessionId),\n orderBy(\"timeStamp\", \"asc\")\n );\n\n const querySnapshot = await getDocs(q);\n const events = querySnapshot.docs.map((doc) => {\n const data = doc.data() as ActionRecord;\n return JSON.parse(data.rrwebRecord);\n });\n console.log(\"events\", events);\n if (events.length === 0) {\n console.warn(\n `セッションID ${sessionId} のデータが見つかりませんでした。`\n );\n return;\n }\n\n const targetDiv = document.getElementById(this.targetDivId);\n if (!targetDiv) {\n throw new Error(\n `ID ${this.targetDivId} のdiv要素が見つかりませんでした。`\n );\n }\n\n // クラスを追加\n targetDiv.classList.add(\"replayer-container\");\n\n // 3. Replayerを初期化\n this.replayer = new Replayer(events, {\n root: targetDiv,\n UNSAFE_replayCanvas: false,\n props: {\n autoPlay: true,\n speed: 1,\n mouseTail: true,\n },\n className: \"_replayer-canvas\",\n } as any);\n\n // 4. カスタムイベントのリスナーを追加\n this.replayer.on(\"custom-event\", (event: any) => {\n console.log(\"Custom event:\", event);\n this.handleCustomEvent(event);\n });\n this.replayer.on(\"finish\", () => {\n console.log(\"Replay finished\");\n this.replayer?.pause(0);\n this.playerStatus = \"stopped\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n this.endTimeoutTimeline();\n });\n const { totalTime } = this.replayer.getMetaData();\n this.totalTime = totalTime;\n\n // iframeのスタイルを調整\n const iframes = targetDiv.querySelectorAll(\"iframe\");\n iframes.forEach((iframe) => {\n (iframe as HTMLElement).style.transform = \"translate(-50%, -50%)\";\n (iframe as HTMLElement).style.position = \"absolute\";\n (iframe as HTMLElement).style.left = \"50%\";\n (iframe as HTMLElement).style.top = \"50%\";\n });\n // replayer-mouse-tailにposition: absolute; を追加\n const mouseTailElements = document.querySelectorAll(\n \".replayer-mouse-tail\"\n );\n mouseTailElements.forEach((element) => {\n (element as HTMLElement).style.position = \"absolute\";\n (element as HTMLElement).style.left = \"50%\";\n (element as HTMLElement).style.top = \"50%\";\n (element as HTMLElement).style.transform = \"translate(-50%, -50%)\";\n (element as HTMLElement).style.zIndex = \"1000\"; // z-indexを追加\n });\n\n // 5. 再生開始\n\n this.replayer.play();\n this.playerStatus = \"playing\";\n console.log(`セッションID ${sessionId} の再生を開始しました。`);\n this.setTimeoutTimeline();\n } catch (error) {\n console.error(\"再生エラー:\", error);\n throw error;\n }\n }\n\n // カスタムイベントを処理\n private handleCustomEvent(event: any) {\n if (!event.data || !event.data.type) return;\n\n const { timestamp } = event;\n const timeString = new Date(timestamp).toISOString();\n\n switch (event.data.type) {\n case \"console\":\n const { method, args } = event.data;\n this.displayEvent(\n `[${timeString}] Console ${method}: ${args.join(\", \")}`,\n \"console\"\n );\n\n break;\n case \"navigation\":\n const { url } = event.data;\n this.displayEvent(`[${timeString}] Navigation to ${url}`, \"navigation\");\n break;\n case \"performance\":\n const { name, entryType, duration } = event.data;\n this.displayEvent(\n `[${timeString}] Performance ${entryType}: ${name} (${duration}ms)`,\n \"performance\"\n );\n break;\n default:\n console.warn(\"不明なカスタムイベント:\", event.data.type);\n }\n }\n\n // イベントをオーバーレイに表示\n private displayEvent(message: string, eventType: string) {\n if (!this.overlayContainer) return;\n\n const eventDiv = document.createElement(\"div\");\n eventDiv.style.padding = \"5px\";\n eventDiv.style.borderBottom = \"1px solid rgba(255, 255, 255, 0.2)\";\n\n // イベントタイプに応じた色\n const colors: { [key: string]: string } = {\n console: \"#00cc00\",\n navigation: \"#3399ff\",\n performance: \"#ff9900\",\n };\n eventDiv.style.color = colors[eventType] || \"white\";\n\n eventDiv.innerText = message;\n this.overlayContainer.appendChild(eventDiv);\n\n // 最新のイベントが表示されるようスクロール\n this.overlayContainer.scrollTop = this.overlayContainer.scrollHeight;\n\n // 5秒後にフェードアウト\n setTimeout(() => {\n eventDiv.style.transition = \"opacity 1s\";\n eventDiv.style.opacity = \"0\";\n setTimeout(() => eventDiv.remove(), 1000);\n }, 5000);\n }\n setReplayTime(time: number) {\n if (this.replayer) {\n this.replayer.pause(time);\n this.currentTime = time;\n this.playerStatus = \"stopped\";\n }\n }\n\n setTimeoutTimeline() {\n this.setIntervalId = setInterval(() => {\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }, 10);\n }\n endTimeoutTimeline() {\n if (this.setIntervalId) {\n clearTimeout(this.setIntervalId);\n this.setIntervalId = null;\n }\n }\n\n // 再生を停止\n stopReplay() {\n this.endTimeoutTimeline();\n if (this.replayer) {\n this.replayer.pause();\n this.playerStatus = \"stopped\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }\n }\n restartReplay() {\n this.setTimeoutTimeline();\n if (this.replayer) {\n const offset = this.replayer.getCurrentTime();\n console.log(\"offset\", offset);\n this.replayer.play(offset);\n this.playerStatus = \"playing\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }\n }\n getCurrentTime() {\n if (this.replayer) {\n return this.replayer.getCurrentTime();\n }\n return 0;\n }\n\n resetReplayer() {\n this.endTimeoutTimeline();\n this.playerStatus = \"stopped\";\n this.currentTime = 0;\n\n if (this.replayer) {\n this.replayer.pause();\n this.replayer.destroy();\n this.replayer = null;\n }\n if (this.overlayContainer) {\n this.overlayContainer.remove();\n this.overlayContainer = null;\n }\n }\n async fetchSessionList() {\n try {\n const q = query(\n collection(this.db, `${this.prefix}ActionRecordSession`),\n where(\"projectId\", \"==\", this.projectId),\n orderBy(\"startTime\", \"desc\")\n );\n const usersStore: { [userId: string]: User } = {};\n\n const querySnapshot = await getDocs(q);\n const promise = querySnapshot.docs.map(async (_doc) => {\n const data = _doc.data() as ActionRecordSession;\n if (!usersStore[data.userId]) {\n usersStore[data.userId] = (\n await getDoc(doc(this.db, `${this.prefix}user`, data.userId))\n ).data() as User;\n }\n\n return { ...data, userData: usersStore[data.userId] };\n });\n const sessions: (ActionRecordSession & { userData: User })[] =\n await Promise.all(promise);\n console.log(sessions);\n\n return sessions;\n } catch (error) {\n console.error(\"セッションリストの取得エラー:\", error);\n throw error;\n }\n }\n}\n","import { initializeApp } from \"firebase/app\";\nimport { getFirestore } from \"firebase/firestore\";\n\nconst firebaseConfig = {\n apiKey: \"AIzaSyCxreoOZivnjFIh2mJ6WXjS3ieQ11wsDW8\",\n authDomain: \"actionlens-b14ae.firebaseapp.com\",\n projectId: \"actionlens-b14ae\",\n storageBucket: \"actionlens-b14ae.firebasestorage.app\",\n messagingSenderId: \"36086339210\",\n appId: \"1:36086339210:web:36e16e8778aadd8c58ff73\",\n};\n\n// Initialize Firebase\nconst app = initializeApp(firebaseConfig);\n\nexport const db = getFirestore(app);\n","import { v4 as uuidv4 } from \"uuid\";\nimport { record, Replayer } from \"rrweb\";\nimport {\n Firestore,\n doc,\n collection,\n writeBatch,\n setDoc,\n getDoc,\n} from \"firebase/firestore\";\nimport { ActionRecord, Project, User } from \"@ism-tech/actionlens-type\";\nimport { db } from \"./utils/index\";\n\nexport class ActionLensRc {\n sessionId: string = uuidv4();\n stopFnForStore: any = null;\n userId: string | null = null;\n db: Firestore | null = null;\n prefix: string = \"\";\n userData: User | null = null;\n projectId: string | null = null;\n projectData: Project | null = null;\n organizationId: string | null = null;\n originalUserId: string | null = null;\n\n /** イベントバッファとコミット閾値 */\n private eventBuffer: ActionRecord[] = [];\n private readonly flushThreshold = 50;\n\n constructor(\n _userId: string | null,\n projectId: string | null,\n userMeta: { name: string; email: string } | null,\n metaData: Record<string, any> = {},\n _db: Firestore | null = null,\n prefix: string = \"\"\n ) {\n this.originalUserId = _userId;\n this.db = _db || db;\n\n // --- プロジェクト取得 ---\n getDoc(doc(collection(this.db, `${prefix}project`), projectId!))\n .then(async (_proj) => {\n this.projectData = _proj.data() as Project;\n this.organizationId = this.projectData?.organizationId || null;\n\n if (!this.db) {\n this.db = db;\n }\n\n // --- ユーザー取得・初期化 ---\n getDoc(doc(collection(this.db, `${prefix}user`), _userId!))\n .then(async (_usr) => {\n // 必要に応じてユーザーデータを作成/更新\n this.userId = `${this.organizationId}-${_userId}`;\n this.prefix = prefix;\n this.projectId = projectId;\n\n // 録画・ログキャプチャ開始\n this.startRrwebRecordingForStore();\n this.startConsoleRecording();\n // this.startTimelineRecording();\n })\n .catch((e) => console.error(\"ユーザーデータ取得エラー:\", e));\n })\n .catch((e) => console.error(\"プロジェクト取得エラー:\", e));\n }\n\n /** バッファ内イベントをまとめて Firestore に書き込む */\n private flushBuffer() {\n if (!this.db || this.eventBuffer.length === 0) return;\n const batch = writeBatch(this.db);\n this.eventBuffer.forEach((rec) => {\n const ref = doc(collection(this.db!, `${this.prefix}ActionRecord`));\n batch.set(ref, rec);\n });\n batch.commit().catch((e) => console.error(\"Batch commit error:\", e));\n this.eventBuffer = [];\n }\n\n /** コンソール呼び出しを rrweb カスタムイベントとして記録 */\n startConsoleRecording() {\n const methods = [\"log\", \"info\", \"warn\", \"error\", \"debug\", \"trace\"] as const;\n const original: Record<string, Function> = {};\n methods.forEach((m) => {\n original[m] = (console as any)[m].bind(console);\n (console as any)[m] = (...args: any[]) => {\n original[m](...args);\n record.addCustomEvent(\"console\", { method: m, args });\n this.updateActionRecordSession();\n };\n });\n }\n\n /** rrweb を使って画面操作をバッファ&バッチ保存 */\n startRrwebRecordingForStore() {\n if (this.stopFnForStore) return;\n const userId = this.userId || \"unknown\";\n const originalUserId = this.originalUserId || \"\";\n const sessionId = this.sessionId;\n const db = this.db!;\n const prefix = this.prefix;\n\n // セッション開始レコード\n setDoc(doc(collection(db, `${prefix}ActionRecordSession`), sessionId), {\n id: sessionId,\n startTime: new Date(),\n endTime: null,\n userId,\n projectId: this.projectId,\n organizationId: this.projectData?.organizationId || null,\n createAt: new Date(),\n updateAt: new Date(),\n createdBy: userId,\n updatedBy: userId,\n }).catch((e) => console.error(e));\n\n this.stopFnForStore = record({\n collectFonts: true,\n inlineImages: false,\n sampling: { canvas: 500, mousemove: false, scroll: 500 },\n emit: (event) => {\n const rec: ActionRecord = {\n id: doc(collection(db, `${prefix}ActionRecord`)).id,\n timeStamp: new Date(),\n userId,\n originalUserId,\n sessionId,\n type: \"rrweb\",\n rrwebRecord: JSON.stringify(event),\n createAt: new Date(),\n updateAt: new Date(),\n hidden: false,\n createdBy: userId,\n updatedBy: userId,\n hiddenBy: \"\",\n };\n // バッファ追加\n this.eventBuffer.push(rec);\n // 閾値到達で一括書き込み\n\n // セッション更新\n setDoc(\n doc(collection(db, `${prefix}ActionRecordSession`), sessionId),\n { endTime: new Date(), updateAt: new Date(), updatedBy: userId },\n { merge: true }\n ).catch((e) => console.error(e));\n },\n recordCanvas: false,\n });\n setInterval(() => {\n // 定期的にバッファをフラッシュ\n this.flushBuffer();\n }, 5000); // 5秒ごとにフラッシュ\n }\n\n /** 録画停止とバッファフラッシュ */\n stopRrwebRecordingForStore() {\n if (this.stopFnForStore) {\n this.stopFnForStore();\n this.stopFnForStore = null;\n this.flushBuffer();\n }\n }\n\n /** セッションの endTime を更新 */\n updateActionRecordSession() {\n if (!this.db || !this.sessionId || !this.userId) return;\n setDoc(\n doc(\n collection(this.db, `${this.prefix}ActionRecordSession`),\n this.sessionId\n ),\n { endTime: new Date(), updateAt: new Date(), updatedBy: this.userId },\n { merge: true }\n ).catch((e) => console.error(e));\n }\n\n // タイムライン(ナビゲーションとパフォーマンス)をキャプチャ\n startTimelineRecording() {\n try {\n const userId = this.userId || \"unknown\";\n const sessionId = this.sessionId;\n const db = this.db;\n const prefix = this.prefix;\n const _updateActionRecordSession = () => this.updateActionRecordSession();\n // ナビゲーション履歴(popstateイベント)\n window.addEventListener(\"popstate\", (event) => {\n if (!db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n\n const navigationEvent = {\n type: \"custom\",\n data: {\n type: \"navigation\",\n url: window.location.href,\n state: event.state,\n },\n timestamp: Date.now(),\n };\n\n const newDocRef = doc(collection(db, `${prefix}ActionRecord`));\n const record: ActionRecord = {\n id: newDocRef.id,\n timeStamp: new Date(),\n userId,\n type: \"navigation\",\n originalUserId: this.originalUserId ?? \"\",\n sessionId,\n rrwebRecord: JSON.stringify(navigationEvent),\n createAt: new Date(),\n updateAt: new Date(),\n hidden: false,\n createdBy: userId,\n updatedBy: userId,\n hiddenBy: \"\",\n };\n\n setDoc(newDocRef, record).catch((error) => {\n console.error(\"Error saving navigation event: \", error);\n });\n _updateActionRecordSession();\n });\n\n // パフォーマンスエントリ\n if (window.performance) {\n const observer = new PerformanceObserver((list) => {\n if (!db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n\n for (const entry of list.getEntries()) {\n const performanceEvent = {\n type: \"custom\",\n data: {\n type: \"performance\",\n name: entry.name,\n entryType: entry.entryType,\n startTime: entry.startTime,\n duration: entry.duration,\n },\n timestamp: Date.now(),\n };\n\n const newDocRef = doc(collection(db, `${prefix}ActionRecord`));\n const record: ActionRecord = {\n id: newDocRef.id,\n timeStamp: new Date(),\n userId,\n originalUserId: this.originalUserId ?? \"\",\n type: \"performance\",\n sessionId,\n rrwebRecord: JSON.stringify(performanceEvent),\n createAt: new Date(),\n updateAt: new Date(),\n hidden: false,\n createdBy: userId,\n updatedBy: userId,\n hiddenBy: \"\",\n };\n\n setDoc(newDocRef, record).catch((error) => {\n console.error(\"Error saving performance event: \", error);\n });\n }\n });\n\n observer.observe({ entryTypes: [\"resource\", \"navigation\", \"paint\"] });\n }\n } catch (error) {\n console.error(\"タイムライン録画エラー:\", error);\n throw error;\n }\n }\n}\n","import { Timestamp } from \"firebase/firestore\";\n// import { copy } from \"copy-anything\";\n/** Timestampの時はDateへの変更 */\nexport function convertTimestampToDate(\n timestamp: Timestamp | Date | null\n): Date | null {\n if (!timestamp) return null;\n /** string の場合(本来は来ないはずなのに) */\n if (typeof timestamp === \"string\") {\n const _string = new Date(timestamp);\n // console.log('convertTimestampToDate-string:', _string)\n if (isNaN(_string.getTime())) {\n return null;\n }\n return _string;\n }\n if (\"_seconds\" in timestamp && timestamp?._seconds) {\n return new Date(Number(timestamp._seconds) * 1000);\n }\n /** timestampの場合 */\n if (timestamp instanceof Timestamp) {\n const _timestamp = timestamp.toDate();\n // console.log('convertTimestampToDate-timestamp:', _timestamp)\n return _timestamp;\n }\n /** Dateの場合 */\n if (timestamp instanceof Date) {\n const _date = timestamp;\n // console.log('convertTimestampToDate-date:', _date)\n return _date;\n }\n // console.log('convertTimestampToDate-type:', typeof timestamp)\n // console.log('convertTimestampToDate-else:', timestamp)\n return timestamp;\n}\n\n/**\n * 時間を文字に変換\n * @param payload Date | Timestamp | string | null\n * @param format YYYY/MM/DD hh:mm:ss\n */\nexport const dateFormat = (\n payload:\n | Date\n | Timestamp\n | string\n | number\n | null\n | undefined\n | {\n _seconds: number;\n _nanoseconds: number;\n },\n format: string = \"YYYY/MM/DD\"\n) => {\n let date = payload;\n if (!date) return \"\";\n if (typeof date === \"string\") {\n if (date.length === 8 && /^\\d{8}$/.test(date)) {\n // 'YYYYMMDD'形式の対応\n const strYear = Number(date.slice(0, 4));\n const strMonth = Number(date.slice(4, 6)) - 1; // 月は0始まり\n const strDate = Number(date.slice(6, 8));\n date = new Date(strYear, strMonth, strDate);\n } else if (!/^(\\d{4}).([0-1]\\d).([0-3]\\d).*$/.test(date)) {\n return \"error\";\n } else {\n const strYear = Number(date.slice(0, 4));\n const strMonth = Number(date.slice(5, 7)) - 1;\n const strDate = Number(date.slice(8, 10));\n date = new Date(strYear, strMonth, strDate);\n }\n }\n if (typeof date === \"number\") {\n date = new Date(date);\n }\n if (isTimestamp(date)) {\n date = date.toDate();\n }\n if (date.hasOwnProperty(\"_seconds\") && date.hasOwnProperty(\"_nanoseconds\")) {\n date = new Date(\n // @ts-ignore\n date._seconds * 1000 + Math.floor(date._nanoseconds / 1000000)\n );\n }\n\n date = new Date(date as Date);\n\n format = format.replace(/YYYY/g, date.getFullYear().toString());\n format = format.replace(/MM/g, (\"0\" + (date.getMonth() + 1)).slice(-2));\n format = format.replace(/DD/g, (\"0\" + date.getDate()).slice(-2));\n format = format.replace(/hh/g, (\"0\" + date.getHours()).slice(-2));\n format = format.replace(/mm/g, (\"0\" + date.getMinutes()).slice(-2));\n format = format.replace(/ss/g, (\"0\" + date.getSeconds()).slice(-2));\n format = format.replace(/SSS/g, (\"00\" + date.getMilliseconds()).slice(-3));\n format = format.replace(\n /aaa/g,\n [\"日\", \"月\", \"火\", \"水\", \"木\", \"金\", \"土\"][date.getDay()]\n );\n // if (format.includes('-')) {\n // console.log('「-」includes warning')\n // }\n\n return format;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst isTimestamp = (payload: any): payload is Timestamp => {\n return payload.toDate !== undefined;\n};\n"],"mappings":"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","names":["doc","doc","collection","setDoc","getDoc","getDoc","doc","collection","db","setDoc","record"]}
|
|
1
|
+
{"version":3,"sources":["../src/player.ts","../src/utils/index.ts","../src/record.ts","../src/utils/date.ts"],"sourcesContent":["import {\n doc,\n collection,\n setDoc,\n addDoc,\n where,\n query,\n getDocs,\n orderBy,\n Firestore,\n getDoc,\n} from \"firebase/firestore\";\nimport {\n ActionRecord,\n ActionRecordSession,\n User,\n} from \"@ism-tech/actionlens-type\";\nimport { Replayer } from \"rrweb\";\nimport { db } from \"./utils\"; // dbのインポートパスを適宜変更してください\n\nexport class ActionLensPlayer {\n replayer: Replayer | null = null;\n overlayContainer: HTMLElement | null = null;\n playerStatus: \"playing\" | \"paused\" | \"stopped\" = \"stopped\";\n targetDivId: string;\n db: Firestore;\n prefix: string;\n userId: string | null = null;\n projectId: string | null = null;\n currentTime: number = 0; // 現在の再生時間\n totalTime: number = 0; // 再生中の時間を保持するための変数\n private setIntervalId: NodeJS.Timeout | null = null; // setTimeoutのIDを保持するための変数\n constructor(\n userId: string,\n targetDivId: string,\n projectId: string | null,\n _db: Firestore = db,\n prefix: string = \"\"\n ) {\n // 初期化処理が必要であればここに記述\n this.userId = userId;\n this.targetDivId = targetDivId;\n this.db = _db;\n this.prefix = prefix;\n this.projectId = projectId;\n }\n\n async replayRrwebSession(sessionId: string): Promise<void> {\n try {\n // 1. Firestoreからデータを取得\n\n const q = query(\n collection(this.db, `${this.prefix}ActionRecord`),\n where(\"sessionId\", \"==\", sessionId),\n orderBy(\"timeStamp\", \"asc\")\n );\n\n const querySnapshot = await getDocs(q);\n const events = querySnapshot.docs.map((doc) => {\n const data = doc.data() as ActionRecord;\n return JSON.parse(data.rrwebRecord);\n });\n console.log(\"events\", events);\n if (events.length === 0) {\n console.warn(\n `セッションID ${sessionId} のデータが見つかりませんでした。`\n );\n return;\n }\n\n const targetDiv = document.getElementById(this.targetDivId);\n if (!targetDiv) {\n throw new Error(\n `ID ${this.targetDivId} のdiv要素が見つかりませんでした。`\n );\n }\n\n // クラスを追加\n targetDiv.classList.add(\"replayer-container\");\n\n // 3. Replayerを初期化\n this.replayer = new Replayer(events, {\n root: targetDiv,\n UNSAFE_replayCanvas: false,\n props: {\n autoPlay: true,\n speed: 1,\n mouseTail: true,\n },\n className: \"_replayer-canvas\",\n } as any);\n\n // 4. カスタムイベントのリスナーを追加\n this.replayer.on(\"custom-event\", (event: any) => {\n console.log(\"Custom event:\", event);\n this.handleCustomEvent(event);\n });\n this.replayer.on(\"finish\", () => {\n console.log(\"Replay finished\");\n this.replayer?.pause(0);\n this.playerStatus = \"stopped\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n this.endTimeoutTimeline();\n });\n const { totalTime } = this.replayer.getMetaData();\n this.totalTime = totalTime;\n\n // iframeのスタイルを調整\n const iframes = targetDiv.querySelectorAll(\"iframe\");\n iframes.forEach((iframe) => {\n (iframe as HTMLElement).style.transform = \"translate(-50%, -50%)\";\n (iframe as HTMLElement).style.position = \"absolute\";\n (iframe as HTMLElement).style.left = \"50%\";\n (iframe as HTMLElement).style.top = \"50%\";\n });\n // replayer-mouse-tailにposition: absolute; を追加\n const mouseTailElements = document.querySelectorAll(\n \".replayer-mouse-tail\"\n );\n mouseTailElements.forEach((element) => {\n (element as HTMLElement).style.position = \"absolute\";\n (element as HTMLElement).style.left = \"50%\";\n (element as HTMLElement).style.top = \"50%\";\n (element as HTMLElement).style.transform = \"translate(-50%, -50%)\";\n (element as HTMLElement).style.zIndex = \"1000\"; // z-indexを追加\n });\n\n // 5. 再生開始\n\n this.replayer.play();\n this.playerStatus = \"playing\";\n console.log(`セッションID ${sessionId} の再生を開始しました。`);\n this.setTimeoutTimeline();\n } catch (error) {\n console.error(\"再生エラー:\", error);\n throw error;\n }\n }\n\n // カスタムイベントを処理\n private handleCustomEvent(event: any) {\n if (!event.data || !event.data.type) return;\n\n const { timestamp } = event;\n const timeString = new Date(timestamp).toISOString();\n\n switch (event.data.type) {\n case \"console\":\n const { method, args } = event.data;\n this.displayEvent(\n `[${timeString}] Console ${method}: ${args.join(\", \")}`,\n \"console\"\n );\n\n break;\n case \"navigation\":\n const { url } = event.data;\n this.displayEvent(`[${timeString}] Navigation to ${url}`, \"navigation\");\n break;\n case \"performance\":\n const { name, entryType, duration } = event.data;\n this.displayEvent(\n `[${timeString}] Performance ${entryType}: ${name} (${duration}ms)`,\n \"performance\"\n );\n break;\n default:\n console.warn(\"不明なカスタムイベント:\", event.data.type);\n }\n }\n\n // イベントをオーバーレイに表示\n private displayEvent(message: string, eventType: string) {\n if (!this.overlayContainer) return;\n\n const eventDiv = document.createElement(\"div\");\n eventDiv.style.padding = \"5px\";\n eventDiv.style.borderBottom = \"1px solid rgba(255, 255, 255, 0.2)\";\n\n // イベントタイプに応じた色\n const colors: { [key: string]: string } = {\n console: \"#00cc00\",\n navigation: \"#3399ff\",\n performance: \"#ff9900\",\n };\n eventDiv.style.color = colors[eventType] || \"white\";\n\n eventDiv.innerText = message;\n this.overlayContainer.appendChild(eventDiv);\n\n // 最新のイベントが表示されるようスクロール\n this.overlayContainer.scrollTop = this.overlayContainer.scrollHeight;\n\n // 5秒後にフェードアウト\n setTimeout(() => {\n eventDiv.style.transition = \"opacity 1s\";\n eventDiv.style.opacity = \"0\";\n setTimeout(() => eventDiv.remove(), 1000);\n }, 5000);\n }\n setReplayTime(time: number) {\n if (this.replayer) {\n this.replayer.pause(time);\n this.currentTime = time;\n this.playerStatus = \"stopped\";\n }\n }\n\n setTimeoutTimeline() {\n this.setIntervalId = setInterval(() => {\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }, 10);\n }\n endTimeoutTimeline() {\n if (this.setIntervalId) {\n clearTimeout(this.setIntervalId);\n this.setIntervalId = null;\n }\n }\n\n // 再生を停止\n stopReplay() {\n this.endTimeoutTimeline();\n if (this.replayer) {\n this.replayer.pause();\n this.playerStatus = \"stopped\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }\n }\n restartReplay() {\n this.setTimeoutTimeline();\n if (this.replayer) {\n const offset = this.replayer.getCurrentTime();\n console.log(\"offset\", offset);\n this.replayer.play(offset);\n this.playerStatus = \"playing\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }\n }\n getCurrentTime() {\n if (this.replayer) {\n return this.replayer.getCurrentTime();\n }\n return 0;\n }\n\n resetReplayer() {\n this.endTimeoutTimeline();\n this.playerStatus = \"stopped\";\n this.currentTime = 0;\n\n if (this.replayer) {\n this.replayer.pause();\n this.replayer.destroy();\n this.replayer = null;\n }\n if (this.overlayContainer) {\n this.overlayContainer.remove();\n this.overlayContainer = null;\n }\n }\n async fetchSessionList() {\n try {\n const q = query(\n collection(this.db, `${this.prefix}ActionRecordSession`),\n where(\"projectId\", \"==\", this.projectId),\n orderBy(\"startTime\", \"desc\")\n );\n const usersStore: { [userId: string]: User } = {};\n\n const querySnapshot = await getDocs(q);\n const promise = querySnapshot.docs.map(async (_doc) => {\n const data = _doc.data() as ActionRecordSession;\n if (!usersStore[data.userId]) {\n usersStore[data.userId] = (\n await getDoc(doc(this.db, `${this.prefix}user`, data.userId))\n ).data() as User;\n }\n\n return { ...data, userData: usersStore[data.userId] };\n });\n const sessions: (ActionRecordSession & { userData: User })[] =\n await Promise.all(promise);\n console.log(sessions);\n\n return sessions;\n } catch (error) {\n console.error(\"セッションリストの取得エラー:\", error);\n throw error;\n }\n }\n}\n","import { initializeApp } from \"firebase/app\";\nimport { getFirestore } from \"firebase/firestore\";\n\nconst firebaseConfig = {\n apiKey: \"AIzaSyCxreoOZivnjFIh2mJ6WXjS3ieQ11wsDW8\",\n authDomain: \"actionlens-b14ae.firebaseapp.com\",\n projectId: \"actionlens-b14ae\",\n storageBucket: \"actionlens-b14ae.firebasestorage.app\",\n messagingSenderId: \"36086339210\",\n appId: \"1:36086339210:web:36e16e8778aadd8c58ff73\",\n};\n\n// Initialize Firebase\nconst app = initializeApp(firebaseConfig);\n\nexport const db = getFirestore(app);\n","import { v4 as uuidv4 } from \"uuid\";\nimport { record, Replayer } from \"rrweb\";\nimport {\n Firestore,\n doc,\n collection,\n writeBatch,\n setDoc,\n getDoc,\n} from \"firebase/firestore\";\nimport { ActionRecord, Project, User } from \"@ism-tech/actionlens-type\";\nimport { db } from \"./utils/index\";\n\nexport class ActionLensRc {\n sessionId: string = uuidv4();\n stopFnForStore: any = null;\n userId: string | null = null;\n db: Firestore | null = null;\n prefix: string = \"\";\n userData: User | null = null;\n projectId: string | null = null;\n projectData: Project | null = null;\n organizationId: string | null = null;\n originalUserId: string | null = null;\n\n /** イベントバッファとコミット閾値 */\n private eventBuffer: ActionRecord[] = [];\n private readonly flushThreshold = 50;\n\n constructor(\n _userId: string | null,\n projectId: string | null,\n userMeta: { name: string; email: string } | null,\n metaData: Record<string, any> = {},\n _db: Firestore | null = null,\n prefix: string = \"\"\n ) {\n if (!!this.originalUserId) {\n console.warn(\"ActionLensRcは一度だけ初期化してください。\");\n return;\n }\n this.originalUserId = _userId;\n this.db = _db || db;\n\n // --- プロジェクト取得 ---\n getDoc(doc(collection(this.db, `${prefix}project`), projectId!))\n .then(async (_proj) => {\n this.projectData = _proj.data() as Project;\n this.organizationId = this.projectData?.organizationId || null;\n\n if (!this.db) {\n this.db = db;\n }\n\n // --- ユーザー取得・初期化 ---\n getDoc(doc(collection(this.db, `${prefix}user`), _userId!))\n .then(async (_usr) => {\n // 必要に応じてユーザーデータを作成/更新\n this.userId = `${this.organizationId}-${_userId}`;\n this.prefix = prefix;\n this.projectId = projectId;\n\n // 録画・ログキャプチャ開始\n this.startRrwebRecordingForStore();\n this.startConsoleRecording();\n // this.startTimelineRecording();\n })\n .catch((e) => console.error(\"ユーザーデータ取得エラー:\", e));\n })\n .catch((e) => console.error(\"プロジェクト取得エラー:\", e));\n }\n\n /** バッファ内イベントをまとめて Firestore に書き込む */\n private flushBuffer() {\n if (!this.db || this.eventBuffer.length === 0) return;\n const batch = writeBatch(this.db);\n this.eventBuffer.forEach((rec) => {\n const ref = doc(collection(this.db!, `${this.prefix}ActionRecord`));\n batch.set(ref, rec);\n });\n batch.commit().catch((e) => console.error(\"Batch commit error:\", e));\n this.eventBuffer = [];\n }\n\n /** コンソール呼び出しを rrweb カスタムイベントとして記録 */\n startConsoleRecording() {\n const methods = [\"log\", \"info\", \"warn\", \"error\", \"debug\", \"trace\"] as const;\n const original: Record<string, Function> = {};\n methods.forEach((m) => {\n original[m] = (console as any)[m].bind(console);\n (console as any)[m] = (...args: any[]) => {\n original[m](...args);\n record.addCustomEvent(\"console\", { method: m, args });\n this.updateActionRecordSession();\n };\n });\n }\n\n /** rrweb を使って画面操作をバッファ&バッチ保存 */\n startRrwebRecordingForStore() {\n if (this.stopFnForStore) return;\n const userId = this.userId || \"unknown\";\n const originalUserId = this.originalUserId || \"\";\n const sessionId = this.sessionId;\n const db = this.db!;\n const prefix = this.prefix;\n\n // セッション開始レコード\n setDoc(doc(collection(db, `${prefix}ActionRecordSession`), sessionId), {\n id: sessionId,\n startTime: new Date(),\n endTime: null,\n userId,\n projectId: this.projectId,\n organizationId: this.projectData?.organizationId || null,\n createAt: new Date(),\n updateAt: new Date(),\n createdBy: userId,\n updatedBy: userId,\n }).catch((e) => console.error(e));\n\n this.stopFnForStore = record({\n collectFonts: true,\n inlineImages: false,\n sampling: { canvas: 500, mousemove: 500, scroll: 500 },\n emit: (event) => {\n const rec: ActionRecord = {\n id: doc(collection(db, `${prefix}ActionRecord`)).id,\n timeStamp: new Date(),\n userId,\n originalUserId,\n sessionId,\n type: \"rrweb\",\n rrwebRecord: JSON.stringify(event),\n createAt: new Date(),\n updateAt: new Date(),\n hidden: false,\n createdBy: userId,\n updatedBy: userId,\n hiddenBy: \"\",\n };\n // バッファ追加\n this.eventBuffer.push(rec);\n // 閾値到達で一括書き込み\n\n // セッション更新\n setDoc(\n doc(collection(db, `${prefix}ActionRecordSession`), sessionId),\n { endTime: new Date(), updateAt: new Date(), updatedBy: userId },\n { merge: true }\n ).catch((e) => console.error(e));\n },\n recordCanvas: false,\n });\n setInterval(() => {\n // 定期的にバッファをフラッシュ\n this.flushBuffer();\n }, 5000); // 5秒ごとにフラッシュ\n }\n\n /** 録画停止とバッファフラッシュ */\n stopRrwebRecordingForStore() {\n if (this.stopFnForStore) {\n this.stopFnForStore();\n this.stopFnForStore = null;\n this.flushBuffer();\n }\n }\n\n /** セッションの endTime を更新 */\n updateActionRecordSession() {\n if (!this.db || !this.sessionId || !this.userId) return;\n setDoc(\n doc(\n collection(this.db, `${this.prefix}ActionRecordSession`),\n this.sessionId\n ),\n { endTime: new Date(), updateAt: new Date(), updatedBy: this.userId },\n { merge: true }\n ).catch((e) => console.error(e));\n }\n\n // タイムライン(ナビゲーションとパフォーマンス)をキャプチャ\n startTimelineRecording() {\n try {\n const userId = this.userId || \"unknown\";\n const sessionId = this.sessionId;\n const db = this.db;\n const prefix = this.prefix;\n const _updateActionRecordSession = () => this.updateActionRecordSession();\n // ナビゲーション履歴(popstateイベント)\n window.addEventListener(\"popstate\", (event) => {\n if (!db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n\n const navigationEvent = {\n type: \"custom\",\n data: {\n type: \"navigation\",\n url: window.location.href,\n state: event.state,\n },\n timestamp: Date.now(),\n };\n\n const newDocRef = doc(collection(db, `${prefix}ActionRecord`));\n const record: ActionRecord = {\n id: newDocRef.id,\n timeStamp: new Date(),\n userId,\n type: \"navigation\",\n originalUserId: this.originalUserId ?? \"\",\n sessionId,\n rrwebRecord: JSON.stringify(navigationEvent),\n createAt: new Date(),\n updateAt: new Date(),\n hidden: false,\n createdBy: userId,\n updatedBy: userId,\n hiddenBy: \"\",\n };\n\n setDoc(newDocRef, record).catch((error) => {\n console.error(\"Error saving navigation event: \", error);\n });\n _updateActionRecordSession();\n });\n\n // パフォーマンスエントリ\n if (window.performance) {\n const observer = new PerformanceObserver((list) => {\n if (!db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n\n for (const entry of list.getEntries()) {\n const performanceEvent = {\n type: \"custom\",\n data: {\n type: \"performance\",\n name: entry.name,\n entryType: entry.entryType,\n startTime: entry.startTime,\n duration: entry.duration,\n },\n timestamp: Date.now(),\n };\n\n const newDocRef = doc(collection(db, `${prefix}ActionRecord`));\n const record: ActionRecord = {\n id: newDocRef.id,\n timeStamp: new Date(),\n userId,\n originalUserId: this.originalUserId ?? \"\",\n type: \"performance\",\n sessionId,\n rrwebRecord: JSON.stringify(performanceEvent),\n createAt: new Date(),\n updateAt: new Date(),\n hidden: false,\n createdBy: userId,\n updatedBy: userId,\n hiddenBy: \"\",\n };\n\n setDoc(newDocRef, record).catch((error) => {\n console.error(\"Error saving performance event: \", error);\n });\n }\n });\n\n observer.observe({ entryTypes: [\"resource\", \"navigation\", \"paint\"] });\n }\n } catch (error) {\n console.error(\"タイムライン録画エラー:\", error);\n throw error;\n }\n }\n}\n","import { Timestamp } from \"firebase/firestore\";\n// import { copy } from \"copy-anything\";\n/** Timestampの時はDateへの変更 */\nexport function convertTimestampToDate(\n timestamp: Timestamp | Date | null\n): Date | null {\n if (!timestamp) return null;\n /** string の場合(本来は来ないはずなのに) */\n if (typeof timestamp === \"string\") {\n const _string = new Date(timestamp);\n // console.log('convertTimestampToDate-string:', _string)\n if (isNaN(_string.getTime())) {\n return null;\n }\n return _string;\n }\n if (\"_seconds\" in timestamp && timestamp?._seconds) {\n return new Date(Number(timestamp._seconds) * 1000);\n }\n /** timestampの場合 */\n if (timestamp instanceof Timestamp) {\n const _timestamp = timestamp.toDate();\n // console.log('convertTimestampToDate-timestamp:', _timestamp)\n return _timestamp;\n }\n /** Dateの場合 */\n if (timestamp instanceof Date) {\n const _date = timestamp;\n // console.log('convertTimestampToDate-date:', _date)\n return _date;\n }\n // console.log('convertTimestampToDate-type:', typeof timestamp)\n // console.log('convertTimestampToDate-else:', timestamp)\n return timestamp;\n}\n\n/**\n * 時間を文字に変換\n * @param payload Date | Timestamp | string | null\n * @param format YYYY/MM/DD hh:mm:ss\n */\nexport const dateFormat = (\n payload:\n | Date\n | Timestamp\n | string\n | number\n | null\n | undefined\n | {\n _seconds: number;\n _nanoseconds: number;\n },\n format: string = \"YYYY/MM/DD\"\n) => {\n let date = payload;\n if (!date) return \"\";\n if (typeof date === \"string\") {\n if (date.length === 8 && /^\\d{8}$/.test(date)) {\n // 'YYYYMMDD'形式の対応\n const strYear = Number(date.slice(0, 4));\n const strMonth = Number(date.slice(4, 6)) - 1; // 月は0始まり\n const strDate = Number(date.slice(6, 8));\n date = new Date(strYear, strMonth, strDate);\n } else if (!/^(\\d{4}).([0-1]\\d).([0-3]\\d).*$/.test(date)) {\n return \"error\";\n } else {\n const strYear = Number(date.slice(0, 4));\n const strMonth = Number(date.slice(5, 7)) - 1;\n const strDate = Number(date.slice(8, 10));\n date = new Date(strYear, strMonth, strDate);\n }\n }\n if (typeof date === \"number\") {\n date = new Date(date);\n }\n if (isTimestamp(date)) {\n date = date.toDate();\n }\n if (date.hasOwnProperty(\"_seconds\") && date.hasOwnProperty(\"_nanoseconds\")) {\n date = new Date(\n // @ts-ignore\n date._seconds * 1000 + Math.floor(date._nanoseconds / 1000000)\n );\n }\n\n date = new Date(date as Date);\n\n format = format.replace(/YYYY/g, date.getFullYear().toString());\n format = format.replace(/MM/g, (\"0\" + (date.getMonth() + 1)).slice(-2));\n format = format.replace(/DD/g, (\"0\" + date.getDate()).slice(-2));\n format = format.replace(/hh/g, (\"0\" + date.getHours()).slice(-2));\n format = format.replace(/mm/g, (\"0\" + date.getMinutes()).slice(-2));\n format = format.replace(/ss/g, (\"0\" + date.getSeconds()).slice(-2));\n format = format.replace(/SSS/g, (\"00\" + date.getMilliseconds()).slice(-3));\n format = format.replace(\n /aaa/g,\n [\"日\", \"月\", \"火\", \"水\", \"木\", \"金\", \"土\"][date.getDay()]\n );\n // if (format.includes('-')) {\n // console.log('「-」includes warning')\n // }\n\n return format;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst isTimestamp = (payload: any): payload is Timestamp => {\n return payload.toDate !== undefined;\n};\n"],"mappings":"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","names":["doc","doc","collection","setDoc","getDoc","getDoc","doc","collection","db","setDoc","record"]}
|
package/package.json
CHANGED