action-lens 1.0.81 → 1.0.83
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 +50 -34
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +50 -34
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -143,6 +143,12 @@ var ActionLensPlayer = class {
|
|
|
143
143
|
this.currentTime = this.replayer?.getCurrentTime() || 0;
|
|
144
144
|
this.endTimeoutTimeline();
|
|
145
145
|
});
|
|
146
|
+
this.replayer.on("event-cast", (event) => {
|
|
147
|
+
console.log("Event cast:", event);
|
|
148
|
+
if (event.type === 4 && event.data.href) {
|
|
149
|
+
this.currentUrl = event.data.href;
|
|
150
|
+
}
|
|
151
|
+
});
|
|
146
152
|
this.replayer.on("resize", (e) => {
|
|
147
153
|
const { width, height } = e;
|
|
148
154
|
this.width = width;
|
|
@@ -589,33 +595,35 @@ var ActionLensRc = class {
|
|
|
589
595
|
for (const entry of list.getEntries()) {
|
|
590
596
|
if (entry.entryType === "resource") {
|
|
591
597
|
const resourceEntry = entry;
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
598
|
+
if (resourceEntry.initiatorType !== "xmlhttprequest" && resourceEntry.initiatorType !== "fetch") {
|
|
599
|
+
import_rrweb2.record.addCustomEvent("network_resource", {
|
|
600
|
+
name: resourceEntry.name,
|
|
601
|
+
entryType: resourceEntry.entryType,
|
|
602
|
+
initiatorType: resourceEntry.initiatorType,
|
|
603
|
+
// css, script, img, font など
|
|
604
|
+
nextHopProtocol: resourceEntry.nextHopProtocol,
|
|
605
|
+
encodedBodySize: resourceEntry.encodedBodySize,
|
|
606
|
+
decodedBodySize: resourceEntry.decodedBodySize,
|
|
607
|
+
transferSize: resourceEntry.transferSize,
|
|
608
|
+
duration: resourceEntry.duration,
|
|
609
|
+
startTime: resourceEntry.startTime,
|
|
610
|
+
fetchStart: resourceEntry.fetchStart,
|
|
611
|
+
domainLookupStart: resourceEntry.domainLookupStart,
|
|
612
|
+
domainLookupEnd: resourceEntry.domainLookupEnd,
|
|
613
|
+
connectStart: resourceEntry.connectStart,
|
|
614
|
+
connectEnd: resourceEntry.connectEnd,
|
|
615
|
+
secureConnectionStart: resourceEntry.secureConnectionStart,
|
|
616
|
+
requestStart: resourceEntry.requestStart,
|
|
617
|
+
responseStart: resourceEntry.responseStart,
|
|
618
|
+
responseEnd: resourceEntry.responseEnd,
|
|
619
|
+
workerStart: resourceEntry.workerStart,
|
|
620
|
+
redirectStart: resourceEntry.redirectStart,
|
|
621
|
+
redirectEnd: resourceEntry.redirectEnd,
|
|
622
|
+
// responseStatus is experimental, may not be available
|
|
623
|
+
responseStatus: resourceEntry.responseStatus || void 0,
|
|
624
|
+
serverTiming: resourceEntry.serverTiming
|
|
625
|
+
});
|
|
626
|
+
}
|
|
619
627
|
} else {
|
|
620
628
|
import_rrweb2.record.addCustomEvent("performance", {
|
|
621
629
|
name: entry.name,
|
|
@@ -847,7 +855,6 @@ var ActionLensRc = class {
|
|
|
847
855
|
const data = doc3.data();
|
|
848
856
|
const ipAddress = data?.ipAddress || "";
|
|
849
857
|
const placeData = await getPlaceFromIp(ipAddress);
|
|
850
|
-
console.log("placeData", placeData);
|
|
851
858
|
await (0, import_firestore3.updateDoc)(docRef, { place: placeData });
|
|
852
859
|
}
|
|
853
860
|
}).catch((error) => {
|
|
@@ -857,16 +864,26 @@ var ActionLensRc = class {
|
|
|
857
864
|
packFn: import_packer2.pack,
|
|
858
865
|
collectFonts: true,
|
|
859
866
|
inlineImages: false,
|
|
867
|
+
checkoutEveryNth: 500,
|
|
868
|
+
recordCanvas: true,
|
|
869
|
+
recordCrossOriginIframes: true,
|
|
860
870
|
sampling: {
|
|
861
|
-
canvas:
|
|
862
|
-
mousemove:
|
|
863
|
-
mousemoveCallback:
|
|
871
|
+
canvas: 1e3,
|
|
872
|
+
mousemove: 1e3,
|
|
873
|
+
mousemoveCallback: 1e3,
|
|
874
|
+
scroll: 150,
|
|
875
|
+
// do not emit twice in 150ms
|
|
876
|
+
// set the interval of media interaction event
|
|
877
|
+
media: 800,
|
|
878
|
+
// set the timing of record input
|
|
879
|
+
input: "last"
|
|
880
|
+
// When input mulitple characters, only record the final input
|
|
864
881
|
},
|
|
865
882
|
emit: async (event) => {
|
|
866
883
|
try {
|
|
867
884
|
const deffTime = (/* @__PURE__ */ new Date()).getTime() - pinTime;
|
|
868
885
|
rrwebRecords.push(JSON.stringify(event));
|
|
869
|
-
if (rrwebRecords.length >=
|
|
886
|
+
if (rrwebRecords.length >= 200 || deffTime >= 1e4 && rrwebRecords.length > 0) {
|
|
870
887
|
pinTime = (/* @__PURE__ */ new Date()).getTime();
|
|
871
888
|
const record2 = {
|
|
872
889
|
id: "",
|
|
@@ -892,8 +909,7 @@ var ActionLensRc = class {
|
|
|
892
909
|
console.error("rrweb\u30A4\u30D9\u30F3\u30C8\u4FDD\u5B58\u30A8\u30E9\u30FC:", error);
|
|
893
910
|
throw error;
|
|
894
911
|
}
|
|
895
|
-
}
|
|
896
|
-
recordCanvas: false
|
|
912
|
+
}
|
|
897
913
|
});
|
|
898
914
|
this.startConsoleRecording();
|
|
899
915
|
this.startTimelineRecording();
|
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"],"sourcesContent":["export * from \"./player\";\nexport * from \"./record\";\nimport \"./style.css\";\n","import {\n doc,\n collection,\n setDoc,\n addDoc,\n where,\n query,\n getDocs,\n orderBy,\n Firestore,\n getDoc,\n limit,\n} from \"firebase/firestore\";\nimport {\n ActionRecord,\n ActionRecordSession,\n AuthUser,\n Project,\n Session,\n User,\n} from \"@ism-tech/actionlens-type\";\nimport { Replayer } from \"rrweb\";\nimport { db } from \"./utils\"; // dbのインポートパスを適宜変更してください\n\nimport { unpack } from \"@rrweb/packer\";\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 recordTime: number = 0; // レコードの時間\n totalTime: number = 0; // 再生中の時間を保持するための変数\n user: AuthUser | null = null; // ユーザーデータを保持するための変数\n private setIntervalId: NodeJS.Timeout | null = null; // setTimeoutのIDを保持するための変数\n width: number = 0; // プレイヤーの幅\n height: number = 0; // プレイヤーの高さ\n sessions: (ActionRecordSession & { userData: User<\"customer\"> })[] = []; // セッションのリスト\n currentUrl: string | null = null; // 現在のURLを保持するための変数\n startTime: number = 0; // セッションの開始時間\n sessionInfo: ActionRecordSession | null = null; // セッション情報を保持するための変数\n constructor(\n userId: string,\n targetDivId: string,\n\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.initialize(userId);\n }\n\n async initialize(userId: string) {\n const user = await getDoc(doc(this.db, `${this.prefix}authUser`, userId));\n if (!user.exists()) {\n throw new Error(`User with ID ${userId} does not exist.`);\n }\n const userData = user.data() as AuthUser;\n this.user = userData; // ユーザーデータを保持\n this.projectId = userData.projectIds?.[0] || \"\"; // プロジェクトIDを取得\n if (!this.projectId) {\n throw new Error(`Project ID for user ${userId} does not exist.`);\n }\n }\n\n async replayRrwebSession(sessionId: string): Promise<any[]> {\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.flatMap((doc) => {\n const data = doc.data() as ActionRecord;\n return data.rrwebRecord\n ? JSON.parse(data.rrwebRecord)\n : data.rrwebRecords\n ? data.rrwebRecords?.map((r) => JSON.parse(r)) || []\n : [];\n });\n\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 unpackFn: unpack,\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 this.width = this.replayer.wrapper.clientWidth;\n this.height = this.replayer.wrapper.clientHeight;\n\n // 4. カスタムイベントのリスナーを追加\n this.replayer.on(\"custom-event\", (event: any) => {\n this.handleCustomEvent(event);\n });\n\n this.replayer.on(\"finish\", () => {\n this.replayer?.pause(0);\n this.playerStatus = \"stopped\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n this.endTimeoutTimeline();\n });\n this.replayer.on(\"resize\", (e) => {\n const { width, height } = e as { width: number; height: number };\n\n this.width = width;\n this.height = height;\n });\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\n this.setTimeoutTimeline();\n return events.map((e) => unpack(e));\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.currentUrl = url;\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 }\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 this.recordTime =\n Number(this.replayer?.getMetaData()?.startTime) + this.currentTime;\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\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 fetchProjectList() {\n try {\n if (!this.userId) {\n console.warn(\"User ID is not initialized.\");\n return [];\n }\n if (!this.user) {\n this.user = (\n await getDoc(doc(this.db, `${this.prefix}authUser`, this.userId))\n ).data() as AuthUser | null;\n if (!this.user) {\n console.warn(`User with ID ${this.userId} does not exist.`);\n\n return [];\n }\n }\n console.log(\"fetchProjectList\", this.user);\n const projectIds = this.user.projectIds || [];\n if (projectIds.length === 0) {\n console.warn(\"No project IDs found for the user.\");\n return [];\n }\n const promise = projectIds.flatMap(async (projectId) => {\n const projectDoc = await getDoc(\n doc(this.db, `${this.prefix}project`, projectId)\n );\n if (!projectDoc.exists()) {\n console.warn(`Project with ID ${projectId} does not exist.`);\n return null;\n }\n return projectDoc.data() as Project;\n });\n const projectPromises: (Project | null)[] = await Promise.all(promise);\n return projectPromises.filter((project) => project !== null);\n } catch (e) {\n console.error(\"プロジェクトリストの取得エラー:\", e);\n throw e;\n }\n }\n\n async fetchSessionList(projectId: string, limitNum: number = 20) {\n try {\n const q = query(\n collection(this.db, `${this.prefix}ActionRecordSession`),\n where(\"projectId\", \"==\", projectId),\n where(\"recordTime\", \">=\", 10),\n orderBy(\"startTime\", \"desc\"),\n limit(limitNum)\n );\n const usersStore: { [userId: string]: User<\"customer\"> } = {};\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<\"customer\">;\n }\n\n return { ...data, userData: usersStore[data.userId] };\n });\n const sessions: (ActionRecordSession & { userData: User<\"customer\"> })[] =\n await Promise.all(promise);\n console.log(sessions);\n this.sessions = sessions;\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\nexport const 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\nexport const 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 setDoc,\n collection,\n getDoc,\n getFirestore,\n updateDoc,\n} from \"firebase/firestore\";\nimport {\n ActionRecord,\n ActionRecordSession,\n Project,\n User,\n} from \"@ism-tech/actionlens-type\";\nimport { db, app } from \"./utils/index\";\nimport { pack } from \"@rrweb/packer\";\nimport { httpsCallable, getFunctions } from \"firebase/functions\";\n\nconst functions = getFunctions(app);\n\nconst setSessionDetail = httpsCallable(functions, \"setSessionDetail\");\nexport class ActionLensRc {\n sessionId: string = uuidv4();\n stopFnForStore: any = null;\n userId: string | null = \"anonymous\"; // ユーザーIDはプロジェクトIDと組み合わせて一意にする\n db: Firestore | null = null;\n prefix: string = \"\";\n userData: User<\"customer\"> | null = null;\n projectId: string | null = null;\n projectData: Project | null = null;\n organizationId: string | null = null;\n originalUserId: string | null = null; // 元のユーザーID(外部システムのIDなど)\n userMeta: { name?: string; email?: string } = {};\n metaData: Record<string, any> = {};\n\n constructor() {\n this.db = db; // Firestoreの初期化\n }\n\n async init(\n projectId: string | null,\n _db: Firestore | null = null,\n prefix: string = \"\"\n ) {\n try {\n if (!projectId) {\n console.error(\"projectIdがNULLです\");\n return;\n }\n this.projectId = projectId;\n\n this.prefix = prefix;\n\n if (!this.db && _db) {\n console.error(\"Firestoreが初期化されていません\");\n this.db = _db;\n }\n if (!this.db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n\n if (!this.projectId) {\n console.error(\"projectIdが設定されていません\");\n return;\n }\n const _doc = await getDoc(\n doc(collection(this.db, `${this.prefix}project`), this.projectId)\n );\n this.projectData = _doc.data() as Project;\n const projectData = this.projectData;\n this.organizationId = projectData?.organizationId || \"\";\n\n if (!this.projectData) {\n await setDoc(\n doc(collection(this.db, `${this.prefix}project`), this.projectId),\n {\n id: this.projectId,\n name: this.projectId,\n organizationId: \"\",\n isActivate: false, // デフォルトでアクティブに設定\n createAt: new Date(),\n updateAt: new Date(),\n createdBy: this.originalUserId,\n updatedBy: this.originalUserId,\n } as Project,\n { merge: true }\n );\n\n console.warn(\"プロジェクトが存在しません\");\n return;\n }\n if (!this.projectData?.isActivate) {\n console.warn(\"プロジェクトは非アクティブです。録画を開始できません。\");\n return;\n }\n\n await this.startRrwebRecordingForStore();\n\n // this.startTimelineRecording();\n return;\n } catch (error) {\n console.error(\"初期化中にエラーが発生しました:\", error);\n return;\n }\n }\n\n async setUser(\n _userId: string | null,\n userMeta: { name: string; email: string },\n metaData: Record<string, any> = {}\n ) {\n if (!this.db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n if (!this.projectData) {\n console.error(\"プロジェクトデータが設定されていません\");\n return;\n }\n this.originalUserId = _userId; // 元のユーザーIDを保存\n this.userMeta = userMeta;\n this.metaData = metaData;\n\n if (!_userId) {\n console.error(\"userIdがNULLです\");\n return;\n }\n\n this.userId = this.projectData.id + \"-\" + this.originalUserId;\n this.prefix = this.prefix;\n this.projectId = this.projectId;\n const user = await getDoc(\n doc(collection(this.db, `${this.prefix}user`), this.userId)\n );\n\n if (!this.db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n\n const userData = user.data() as User<\"customer\">;\n\n if (!userData?.id || !user.exists()) {\n await setDoc(\n doc(\n collection(this.db, `${this.prefix}user`),\n this.projectData.id + \"-\" + this.originalUserId\n ),\n {\n ...(this.userMeta || {}),\n metaData: this.metaData,\n id: this.userId,\n originalUserId: this.originalUserId,\n type: \"customer\",\n organizationId: this.projectData?.organizationId || \"\",\n projectIds: [this.projectId],\n createAt: new Date(),\n updateAt: new Date(),\n createdBy: this.userId,\n updatedBy: this.userId,\n hidden: false,\n hiddenBy: \"\",\n } as User<\"customer\">,\n { merge: true }\n );\n this.userData = {\n ...(this.userMeta || {}),\n metaData: this.metaData,\n id: this.userId,\n originalUserId: this.originalUserId,\n type: \"customer\",\n organizationId: this.projectData?.organizationId || \"\",\n projectIds: [this.projectId],\n createAt: new Date(),\n updateAt: new Date(),\n createdBy: this.userId,\n updatedBy: this.userId,\n hidden: false,\n hiddenBy: \"\",\n } as User<\"customer\">;\n } else {\n this.userData = user.data() as User<\"customer\">;\n\n if (!this.userData?.projectIds?.includes(this.projectId || \"\")) {\n await setDoc(\n doc(\n collection(this.db, `${this.prefix}user`),\n this.projectData.id + \"-\" + this.originalUserId\n ),\n {\n projectIds: [...(this.userData?.projectIds || []), this.projectId],\n updateAt: new Date(),\n updatedBy: this.userId,\n } as Partial<User<\"customer\">>,\n { merge: true }\n );\n }\n\n if (this.userData?.organizationId !== this.projectData.organizationId) {\n await setDoc(\n doc(\n collection(this.db, `${this.prefix}user`),\n this.projectData.id + \"-\" + this.originalUserId\n ),\n {\n organizationId: this.projectData.organizationId\n ? this.projectData.organizationId\n : this.userData?.organizationId,\n updateAt: new Date(),\n updatedBy: this.userId,\n } as Partial<User<\"customer\">>,\n { merge: true }\n );\n }\n }\n const ActionRecordSessionRef = doc(\n collection(this.db, `${this.prefix}ActionRecordSession`),\n this.sessionId\n );\n await setDoc(\n ActionRecordSessionRef,\n {\n userId: this.projectData.id + \"-\" + this.originalUserId,\n originalUserId: this.originalUserId,\n userName: this.userMeta.name || \"anonymous\",\n userEmail: this.userMeta.email || \"\",\n userMeta: this.userMeta,\n updatedBy: this.userId,\n } as Partial<ActionRecordSession>,\n { merge: true }\n );\n return;\n }\n\n // コンソールログをキャプチャ\n startConsoleRecording() {\n try {\n const originalConsole = { ...console };\n const consoleMethods = [\n \"log\",\n \"info\",\n \"warn\",\n \"error\",\n \"debug\",\n \"trace\",\n \"navigation\",\n ] as const;\n\n consoleMethods.forEach((method) => {\n // 型安全なオーバーライド\n (console as any)[method] = (...args: any[]) => {\n // 元のメソッドを呼び出し\n (originalConsole as any)[method](...args);\n\n record.addCustomEvent(\"console\", { method, args });\n };\n });\n } catch (error) {\n console.error(\"コンソール録画エラー:\", error);\n throw error;\n }\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 // ナビゲーション履歴(popstateイベント)\n window.addEventListener(\"popstate\", (event) => {\n if (!db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n\n record.addCustomEvent(\"navigation\", {\n url: window.location.href,\n state: event.state,\n });\n });\n\n // パフォーマンスエントリ\n if (window.performance) {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.entryType === \"resource\") {\n const resourceEntry = entry as PerformanceResourceTiming;\n record.addCustomEvent(\"network_resource\", {\n name: resourceEntry.name,\n entryType: resourceEntry.entryType,\n initiatorType: resourceEntry.initiatorType, // websocket, script, document, font, xmlhttprequest, fetch, preflight etc.\n nextHopProtocol: resourceEntry.nextHopProtocol,\n encodedBodySize: resourceEntry.encodedBodySize,\n decodedBodySize: resourceEntry.decodedBodySize,\n transferSize: resourceEntry.transferSize,\n duration: resourceEntry.duration,\n startTime: resourceEntry.startTime,\n fetchStart: resourceEntry.fetchStart,\n domainLookupStart: resourceEntry.domainLookupStart,\n domainLookupEnd: resourceEntry.domainLookupEnd,\n connectStart: resourceEntry.connectStart,\n connectEnd: resourceEntry.connectEnd,\n secureConnectionStart: resourceEntry.secureConnectionStart,\n requestStart: resourceEntry.requestStart,\n responseStart: resourceEntry.responseStart,\n responseEnd: resourceEntry.responseEnd,\n workerStart: resourceEntry.workerStart,\n redirectStart: resourceEntry.redirectStart,\n redirectEnd: resourceEntry.redirectEnd,\n // responseStatus is experimental, may not be available\n responseStatus:\n (resourceEntry as any).responseStatus || undefined,\n serverTiming: resourceEntry.serverTiming,\n });\n } else {\n record.addCustomEvent(\"performance\", {\n name: entry.name,\n entryType: entry.entryType,\n startTime: entry.startTime,\n duration: entry.duration,\n });\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 // ネットワークリクエストをキャプチャ(新規追加)\n startNetworkRecording() {\n try {\n // fetch APIをフック\n const originalFetch = window.fetch;\n window.fetch = (...args: Parameters<typeof fetch>) => {\n const startTime = Date.now();\n let input = args[0];\n let init = args[1] as RequestInit | undefined;\n\n let urlStr: string;\n let method: string = \"GET\";\n let requestBody: BodyInit | null | undefined;\n\n if (input instanceof Request) {\n urlStr = input.url;\n method = input.method;\n requestBody = input.body;\n } else {\n urlStr = input instanceof URL ? input.href : input.toString();\n method = init?.method || \"GET\";\n requestBody = init?.body;\n }\n\n // リクエストをrrwebのカスタムイベントとして記録\n record.addCustomEvent(\"network_request\", {\n type: \"fetch\",\n method,\n url: urlStr,\n requestBody,\n startTime,\n status: \"pending\", // 初期状態は保留中\n });\n\n return originalFetch(...args)\n .then((response) => {\n const endTime = Date.now();\n const duration = endTime - startTime;\n\n // レスポンスを記録(ボディは非同期で読むため、cloneして扱う)\n const clonedResponse = response.clone();\n clonedResponse\n .text()\n .then((responseBody) => {\n record.addCustomEvent(\"network_response\", {\n type: \"fetch\",\n url: urlStr,\n status: response.status,\n statusText: response.statusText,\n responseBody,\n duration,\n endTime,\n });\n })\n .catch((err) => {\n console.error(\n \"ネットワークレスポンスボディ読み込みエラー:\",\n err\n );\n });\n\n return response;\n })\n .catch((error) => {\n const endTime = Date.now();\n const duration = endTime - startTime;\n\n record.addCustomEvent(\"network_error\", {\n type: \"fetch\",\n url: urlStr,\n error: error.message,\n duration,\n endTime,\n });\n\n throw error;\n });\n };\n\n // XMLHttpRequestをフック\n const OriginalXMLHttpRequest = window.XMLHttpRequest;\n class HookedXMLHttpRequest extends OriginalXMLHttpRequest {\n private _method?: string;\n private _url?: string;\n private _startTime?: number;\n\n static readonly UNSENT = 0;\n static readonly OPENED = 1;\n static readonly HEADERS_RECEIVED = 2;\n static readonly LOADING = 3;\n static readonly DONE = 4;\n\n open(\n method: string,\n url: string | URL,\n async = true,\n username: string | null = null,\n password: string | null = null\n ) {\n this._method = method;\n this._url = url.toString();\n this._startTime = Date.now();\n // リクエストを記録\n record.addCustomEvent(\"network_request\", {\n type: \"xhr\",\n method,\n url: this._url,\n startTime: this._startTime,\n status: \"pending\", // 初期状態は保留中\n });\n return super.open(method, url, async, username, password);\n }\n\n send(body?: any) {\n this.addEventListener(\"load\", () => {\n const endTime = Date.now();\n const duration = endTime - (this._startTime || 0);\n\n record.addCustomEvent(\"network_response\", {\n type: \"xhr\",\n url: this._url,\n status: this.status,\n statusText: this.statusText,\n responseBody: this.responseText,\n duration,\n endTime,\n });\n });\n\n this.addEventListener(\"error\", () => {\n const endTime = Date.now();\n const duration = endTime - (this._startTime || 0);\n\n record.addCustomEvent(\"network_error\", {\n type: \"xhr\",\n url: this._url,\n error: \"XHR error\",\n duration,\n endTime,\n });\n });\n\n return super.send(body);\n }\n }\n window.XMLHttpRequest = HookedXMLHttpRequest;\n\n // WebSocketをフック\n const OriginalWebSocket = window.WebSocket;\n window.WebSocket = class HookedWebSocket extends OriginalWebSocket {\n constructor(url: string | URL, protocols?: string | string[]) {\n super(url, protocols);\n const wsUrl = url.toString();\n record.addCustomEvent(\"network_websocket_open\", {\n type: \"websocket\",\n url: wsUrl,\n startTime: Date.now(),\n });\n\n this.addEventListener(\"message\", (event) => {\n record.addCustomEvent(\"network_websocket_message\", {\n type: \"websocket\",\n url: wsUrl,\n data: event.data,\n time: Date.now(),\n });\n });\n\n this.addEventListener(\"close\", (event) => {\n record.addCustomEvent(\"network_websocket_close\", {\n type: \"websocket\",\n url: wsUrl,\n code: event.code,\n reason: event.reason,\n endTime: Date.now(),\n });\n });\n\n this.addEventListener(\"error\", (event) => {\n record.addCustomEvent(\"network_websocket_error\", {\n type: \"websocket\",\n url: wsUrl,\n error: \"WebSocket error\",\n time: Date.now(),\n });\n });\n }\n\n send(data: any) {\n record.addCustomEvent(\"network_websocket_send\", {\n type: \"websocket\",\n url: this.url,\n data,\n time: Date.now(),\n });\n return super.send(data);\n }\n };\n } catch (error) {\n console.error(\"ネットワーク録画エラー:\", error);\n throw error;\n }\n }\n\n async startRrwebRecordingForStore() {\n try {\n if (this.stopFnForStore) return;\n\n const _sessionId = this.sessionId;\n const userId = this.userId || \"anonymous\";\n const originalUserId = this.originalUserId || \"\";\n const _db = this.db;\n const prefix = this.prefix;\n let rrwebRecords: string[] = [];\n let pinTime = new Date().getTime();\n if (!this.db || !_db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n // rrwebの録画を開始\n // このセッションの開始時間を記録\n const ActionRecordSessionRef = doc(\n collection(this.db, `${prefix}ActionRecordSession`),\n _sessionId\n );\n await setDoc(ActionRecordSessionRef, {\n id: _sessionId,\n startTime: new Date(),\n endTime: new Date(),\n recordTime: 0, // 初期値は0\n userId,\n projectId: this.projectId || \"\",\n organizationId: this.projectData?.organizationId || \"\",\n createAt: new Date(),\n updateAt: new Date(),\n createdBy: userId,\n updatedBy: userId,\n });\n try {\n console.log(\"setSessionDetail関数を呼び出します\", this.sessionId);\n await setSessionDetail({ sessionId: this.sessionId });\n } catch (error) {\n console.error(\"setSessionDetail関数の呼び出しに失敗:\", error);\n }\n const docRef = doc(\n collection(this.db, \"ActionRecordSession\"),\n this.sessionId\n );\n await getDoc(docRef)\n .then(async (doc) => {\n if (doc.exists()) {\n const data = doc.data() as ActionRecordSession;\n const ipAddress = data?.ipAddress || \"\";\n const placeData = await getPlaceFromIp(ipAddress);\n console.log(\"placeData\", placeData);\n await updateDoc(docRef, { place: placeData });\n }\n })\n .catch((error) => {\n console.error(\"IPアドレスの取得に失敗:\", error);\n });\n\n this.stopFnForStore = record({\n packFn: pack,\n collectFonts: true,\n inlineImages: false,\n sampling: {\n canvas: 500,\n mousemove: 500,\n mousemoveCallback: 500,\n },\n\n emit: async (event) => {\n try {\n const deffTime = new Date().getTime() - pinTime;\n rrwebRecords.push(JSON.stringify(event));\n if (\n rrwebRecords.length >= 100 ||\n (deffTime >= 5000 && rrwebRecords.length > 0)\n ) {\n pinTime = new Date().getTime(); // リセット\n const record: ActionRecord = {\n id: \"\",\n timeStamp: new Date(),\n userId,\n originalUserId,\n type: \"rrweb\",\n sessionId: _sessionId,\n rrwebRecords: rrwebRecords,\n createAt: new Date(),\n updateAt: new Date(),\n hidden: false,\n createdBy: userId,\n updatedBy: userId,\n hiddenBy: \"\",\n };\n rrwebRecords = []; // リセット\n const newDocRef = doc(collection(_db, `${prefix}ActionRecord`));\n record.id = newDocRef.id; // 新しいIDを生成\n\n await setDoc(newDocRef, record);\n // 送信後にリセット\n }\n } catch (error) {\n console.error(\"rrwebイベント保存エラー:\", error);\n throw error;\n }\n },\n recordCanvas: false,\n });\n this.startConsoleRecording();\n this.startTimelineRecording();\n this.startNetworkRecording(); // ネットワーク録画を追加で開始\n } catch (error) {\n console.error(\"rrweb録画エラー:\", error);\n throw error;\n }\n }\n\n stopRrwebRecordingForStore() {\n try {\n if (this.stopFnForStore) {\n this.stopFnForStore();\n this.stopFnForStore = null;\n }\n } catch (error) {\n console.error(\"rrweb録画停止エラー:\", error);\n throw error;\n }\n }\n async updateActionRecordSession() {\n try {\n if (!this.db || !this.sessionId || !this.userId) {\n console.error(\n \"Firestoreが初期化されていません、またはsessionId、userIdが設定されていません\"\n );\n return;\n }\n const ActionRecordSessionRef = doc(\n collection(this.db, `${this.prefix}ActionRecordSession`),\n this.sessionId\n );\n await setDoc(\n ActionRecordSessionRef,\n {\n endTime: new Date(),\n updateAt: new Date(),\n updatedBy: this.userId,\n },\n { merge: true }\n ).catch((error) => {\n console.error(\"Error updating ActionRecordSession: \", error);\n });\n } catch (error) {\n console.error(\"ActionRecordSession更新エラー:\", error);\n throw error;\n }\n }\n}\n\nexport const ActionLens = new ActionLensRc();\n\nconst getPlaceFromIp = async (ip: string) => {\n try {\n const response = await fetch(`https://ipapi.co/${ip}/json/`);\n if (!response.ok) {\n throw new Error(`IP情報取得エラー: ${response.statusText}`);\n }\n const data = await response.json();\n return {\n city: data.city,\n region: data.region,\n country: data.country_name,\n latitude: data.latitude,\n longitude: data.longitude,\n };\n } catch (error) {\n console.error(\"IP情報取得エラー:\", error);\n return null;\n }\n};\n"],"mappings":"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","names":["import_firestore","doc","import_rrweb","import_firestore","import_packer","uuidv4","db","doc","record"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/player.ts","../src/utils/index.ts","../src/record.ts"],"sourcesContent":["export * from \"./player\";\nexport * from \"./record\";\nimport \"./style.css\";\n","import {\n doc,\n collection,\n setDoc,\n addDoc,\n where,\n query,\n getDocs,\n orderBy,\n Firestore,\n getDoc,\n limit,\n} from \"firebase/firestore\";\nimport {\n ActionRecord,\n ActionRecordSession,\n AuthUser,\n Project,\n Session,\n User,\n} from \"@ism-tech/actionlens-type\";\nimport { Replayer } from \"rrweb\";\nimport { db } from \"./utils\"; // dbのインポートパスを適宜変更してください\n\nimport { unpack } from \"@rrweb/packer\";\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 recordTime: number = 0; // レコードの時間\n totalTime: number = 0; // 再生中の時間を保持するための変数\n user: AuthUser | null = null; // ユーザーデータを保持するための変数\n private setIntervalId: NodeJS.Timeout | null = null; // setTimeoutのIDを保持するための変数\n width: number = 0; // プレイヤーの幅\n height: number = 0; // プレイヤーの高さ\n sessions: (ActionRecordSession & { userData: User<\"customer\"> })[] = []; // セッションのリスト\n currentUrl: string | null = null; // 現在のURLを保持するための変数\n startTime: number = 0; // セッションの開始時間\n sessionInfo: ActionRecordSession | null = null; // セッション情報を保持するための変数\n constructor(\n userId: string,\n targetDivId: string,\n\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.initialize(userId);\n }\n\n async initialize(userId: string) {\n const user = await getDoc(doc(this.db, `${this.prefix}authUser`, userId));\n if (!user.exists()) {\n throw new Error(`User with ID ${userId} does not exist.`);\n }\n const userData = user.data() as AuthUser;\n this.user = userData; // ユーザーデータを保持\n this.projectId = userData.projectIds?.[0] || \"\"; // プロジェクトIDを取得\n if (!this.projectId) {\n throw new Error(`Project ID for user ${userId} does not exist.`);\n }\n }\n\n async replayRrwebSession(sessionId: string): Promise<any[]> {\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.flatMap((doc) => {\n const data = doc.data() as ActionRecord;\n return data.rrwebRecord\n ? JSON.parse(data.rrwebRecord)\n : data.rrwebRecords\n ? data.rrwebRecords?.map((r) => JSON.parse(r)) || []\n : [];\n });\n\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 unpackFn: unpack,\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 this.width = this.replayer.wrapper.clientWidth;\n this.height = this.replayer.wrapper.clientHeight;\n\n // 4. カスタムイベントのリスナーを追加\n this.replayer.on(\"custom-event\", (event: any) => {\n this.handleCustomEvent(event);\n });\n\n this.replayer.on(\"finish\", () => {\n this.replayer?.pause(0);\n this.playerStatus = \"stopped\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n this.endTimeoutTimeline();\n });\n this.replayer.on(\"event-cast\", (event: any) => {\n console.log(\"Event cast:\", event);\n if (event.type === 4 && event.data.href) {\n this.currentUrl = event.data.href;\n }\n });\n this.replayer.on(\"resize\", (e) => {\n const { width, height } = e as { width: number; height: number };\n\n this.width = width;\n this.height = height;\n });\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\n this.setTimeoutTimeline();\n return events.map((e) => unpack(e));\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.currentUrl = url;\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 }\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 this.recordTime =\n Number(this.replayer?.getMetaData()?.startTime) + this.currentTime;\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\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 fetchProjectList() {\n try {\n if (!this.userId) {\n console.warn(\"User ID is not initialized.\");\n return [];\n }\n if (!this.user) {\n this.user = (\n await getDoc(doc(this.db, `${this.prefix}authUser`, this.userId))\n ).data() as AuthUser | null;\n if (!this.user) {\n console.warn(`User with ID ${this.userId} does not exist.`);\n\n return [];\n }\n }\n console.log(\"fetchProjectList\", this.user);\n const projectIds = this.user.projectIds || [];\n if (projectIds.length === 0) {\n console.warn(\"No project IDs found for the user.\");\n return [];\n }\n const promise = projectIds.flatMap(async (projectId) => {\n const projectDoc = await getDoc(\n doc(this.db, `${this.prefix}project`, projectId)\n );\n if (!projectDoc.exists()) {\n console.warn(`Project with ID ${projectId} does not exist.`);\n return null;\n }\n return projectDoc.data() as Project;\n });\n const projectPromises: (Project | null)[] = await Promise.all(promise);\n return projectPromises.filter((project) => project !== null);\n } catch (e) {\n console.error(\"プロジェクトリストの取得エラー:\", e);\n throw e;\n }\n }\n\n async fetchSessionList(projectId: string, limitNum: number = 20) {\n try {\n const q = query(\n collection(this.db, `${this.prefix}ActionRecordSession`),\n where(\"projectId\", \"==\", projectId),\n where(\"recordTime\", \">=\", 10),\n orderBy(\"startTime\", \"desc\"),\n limit(limitNum)\n );\n const usersStore: { [userId: string]: User<\"customer\"> } = {};\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<\"customer\">;\n }\n\n return { ...data, userData: usersStore[data.userId] };\n });\n const sessions: (ActionRecordSession & { userData: User<\"customer\"> })[] =\n await Promise.all(promise);\n console.log(sessions);\n this.sessions = sessions;\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\nexport const 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\nexport const 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 setDoc,\n collection,\n getDoc,\n getFirestore,\n updateDoc,\n} from \"firebase/firestore\";\nimport {\n ActionRecord,\n ActionRecordSession,\n Project,\n User,\n} from \"@ism-tech/actionlens-type\";\nimport { db, app } from \"./utils/index\";\nimport { pack } from \"@rrweb/packer\";\nimport { httpsCallable, getFunctions } from \"firebase/functions\";\n\nconst functions = getFunctions(app);\n\nconst setSessionDetail = httpsCallable(functions, \"setSessionDetail\");\nexport class ActionLensRc {\n sessionId: string = uuidv4();\n stopFnForStore: any = null;\n userId: string | null = \"anonymous\"; // ユーザーIDはプロジェクトIDと組み合わせて一意にする\n db: Firestore | null = null;\n prefix: string = \"\";\n userData: User<\"customer\"> | null = null;\n projectId: string | null = null;\n projectData: Project | null = null;\n organizationId: string | null = null;\n originalUserId: string | null = null; // 元のユーザーID(外部システムのIDなど)\n userMeta: { name?: string; email?: string } = {};\n metaData: Record<string, any> = {};\n\n constructor() {\n this.db = db; // Firestoreの初期化\n }\n\n async init(\n projectId: string | null,\n _db: Firestore | null = null,\n prefix: string = \"\"\n ) {\n try {\n if (!projectId) {\n console.error(\"projectIdがNULLです\");\n return;\n }\n this.projectId = projectId;\n\n this.prefix = prefix;\n\n if (!this.db && _db) {\n console.error(\"Firestoreが初期化されていません\");\n this.db = _db;\n }\n if (!this.db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n\n if (!this.projectId) {\n console.error(\"projectIdが設定されていません\");\n return;\n }\n const _doc = await getDoc(\n doc(collection(this.db, `${this.prefix}project`), this.projectId)\n );\n this.projectData = _doc.data() as Project;\n const projectData = this.projectData;\n this.organizationId = projectData?.organizationId || \"\";\n\n if (!this.projectData) {\n await setDoc(\n doc(collection(this.db, `${this.prefix}project`), this.projectId),\n {\n id: this.projectId,\n name: this.projectId,\n organizationId: \"\",\n isActivate: false, // デフォルトでアクティブに設定\n createAt: new Date(),\n updateAt: new Date(),\n createdBy: this.originalUserId,\n updatedBy: this.originalUserId,\n } as Project,\n { merge: true }\n );\n\n console.warn(\"プロジェクトが存在しません\");\n return;\n }\n if (!this.projectData?.isActivate) {\n console.warn(\"プロジェクトは非アクティブです。録画を開始できません。\");\n return;\n }\n\n await this.startRrwebRecordingForStore();\n\n // this.startTimelineRecording();\n return;\n } catch (error) {\n console.error(\"初期化中にエラーが発生しました:\", error);\n return;\n }\n }\n\n async setUser(\n _userId: string | null,\n userMeta: { name: string; email: string },\n metaData: Record<string, any> = {}\n ) {\n if (!this.db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n if (!this.projectData) {\n console.error(\"プロジェクトデータが設定されていません\");\n return;\n }\n this.originalUserId = _userId; // 元のユーザーIDを保存\n this.userMeta = userMeta;\n this.metaData = metaData;\n\n if (!_userId) {\n console.error(\"userIdがNULLです\");\n return;\n }\n\n this.userId = this.projectData.id + \"-\" + this.originalUserId;\n this.prefix = this.prefix;\n this.projectId = this.projectId;\n const user = await getDoc(\n doc(collection(this.db, `${this.prefix}user`), this.userId)\n );\n\n if (!this.db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n\n const userData = user.data() as User<\"customer\">;\n\n if (!userData?.id || !user.exists()) {\n await setDoc(\n doc(\n collection(this.db, `${this.prefix}user`),\n this.projectData.id + \"-\" + this.originalUserId\n ),\n {\n ...(this.userMeta || {}),\n metaData: this.metaData,\n id: this.userId,\n originalUserId: this.originalUserId,\n type: \"customer\",\n organizationId: this.projectData?.organizationId || \"\",\n projectIds: [this.projectId],\n createAt: new Date(),\n updateAt: new Date(),\n createdBy: this.userId,\n updatedBy: this.userId,\n hidden: false,\n hiddenBy: \"\",\n } as User<\"customer\">,\n { merge: true }\n );\n this.userData = {\n ...(this.userMeta || {}),\n metaData: this.metaData,\n id: this.userId,\n originalUserId: this.originalUserId,\n type: \"customer\",\n organizationId: this.projectData?.organizationId || \"\",\n projectIds: [this.projectId],\n createAt: new Date(),\n updateAt: new Date(),\n createdBy: this.userId,\n updatedBy: this.userId,\n hidden: false,\n hiddenBy: \"\",\n } as User<\"customer\">;\n } else {\n this.userData = user.data() as User<\"customer\">;\n\n if (!this.userData?.projectIds?.includes(this.projectId || \"\")) {\n await setDoc(\n doc(\n collection(this.db, `${this.prefix}user`),\n this.projectData.id + \"-\" + this.originalUserId\n ),\n {\n projectIds: [...(this.userData?.projectIds || []), this.projectId],\n updateAt: new Date(),\n updatedBy: this.userId,\n } as Partial<User<\"customer\">>,\n { merge: true }\n );\n }\n\n if (this.userData?.organizationId !== this.projectData.organizationId) {\n await setDoc(\n doc(\n collection(this.db, `${this.prefix}user`),\n this.projectData.id + \"-\" + this.originalUserId\n ),\n {\n organizationId: this.projectData.organizationId\n ? this.projectData.organizationId\n : this.userData?.organizationId,\n updateAt: new Date(),\n updatedBy: this.userId,\n } as Partial<User<\"customer\">>,\n { merge: true }\n );\n }\n }\n const ActionRecordSessionRef = doc(\n collection(this.db, `${this.prefix}ActionRecordSession`),\n this.sessionId\n );\n await setDoc(\n ActionRecordSessionRef,\n {\n userId: this.projectData.id + \"-\" + this.originalUserId,\n originalUserId: this.originalUserId,\n userName: this.userMeta.name || \"anonymous\",\n userEmail: this.userMeta.email || \"\",\n userMeta: this.userMeta,\n updatedBy: this.userId,\n } as Partial<ActionRecordSession>,\n { merge: true }\n );\n return;\n }\n\n // コンソールログをキャプチャ\n startConsoleRecording() {\n try {\n const originalConsole = { ...console };\n const consoleMethods = [\n \"log\",\n \"info\",\n \"warn\",\n \"error\",\n \"debug\",\n \"trace\",\n \"navigation\",\n ] as const;\n\n consoleMethods.forEach((method) => {\n // 型安全なオーバーライド\n (console as any)[method] = (...args: any[]) => {\n // 元のメソッドを呼び出し\n (originalConsole as any)[method](...args);\n\n record.addCustomEvent(\"console\", { method, args });\n };\n });\n } catch (error) {\n console.error(\"コンソール録画エラー:\", error);\n throw error;\n }\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 // ナビゲーション履歴(popstateイベント)\n window.addEventListener(\"popstate\", (event) => {\n if (!db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n\n record.addCustomEvent(\"navigation\", {\n url: window.location.href,\n state: event.state,\n });\n });\n\n // パフォーマンスエントリ\n if (window.performance) {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.entryType === \"resource\") {\n const resourceEntry = entry as PerformanceResourceTiming;\n // 新規追加: XHR/Fetch以外(CSS, JS, images, fontsなど)のみ記録\n // initiatorTypeでフィルタリング(XHR: \"xmlhttprequest\", Fetch: \"fetch\")\n if (\n resourceEntry.initiatorType !== \"xmlhttprequest\" &&\n resourceEntry.initiatorType !== \"fetch\"\n ) {\n record.addCustomEvent(\"network_resource\", {\n name: resourceEntry.name,\n entryType: resourceEntry.entryType,\n initiatorType: resourceEntry.initiatorType, // css, script, img, font など\n nextHopProtocol: resourceEntry.nextHopProtocol,\n encodedBodySize: resourceEntry.encodedBodySize,\n decodedBodySize: resourceEntry.decodedBodySize,\n transferSize: resourceEntry.transferSize,\n duration: resourceEntry.duration,\n startTime: resourceEntry.startTime,\n fetchStart: resourceEntry.fetchStart,\n domainLookupStart: resourceEntry.domainLookupStart,\n domainLookupEnd: resourceEntry.domainLookupEnd,\n connectStart: resourceEntry.connectStart,\n connectEnd: resourceEntry.connectEnd,\n secureConnectionStart: resourceEntry.secureConnectionStart,\n requestStart: resourceEntry.requestStart,\n responseStart: resourceEntry.responseStart,\n responseEnd: resourceEntry.responseEnd,\n workerStart: resourceEntry.workerStart,\n redirectStart: resourceEntry.redirectStart,\n redirectEnd: resourceEntry.redirectEnd,\n // responseStatus is experimental, may not be available\n responseStatus:\n (resourceEntry as any).responseStatus || undefined,\n serverTiming: resourceEntry.serverTiming,\n });\n }\n } else {\n record.addCustomEvent(\"performance\", {\n name: entry.name,\n entryType: entry.entryType,\n startTime: entry.startTime,\n duration: entry.duration,\n });\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 // ネットワークリクエストをキャプチャ(新規追加)\n startNetworkRecording() {\n try {\n // fetch APIをフック\n const originalFetch = window.fetch;\n window.fetch = (...args: Parameters<typeof fetch>) => {\n const startTime = Date.now();\n let input = args[0];\n let init = args[1] as RequestInit | undefined;\n\n let urlStr: string;\n let method: string = \"GET\";\n let requestBody: BodyInit | null | undefined;\n\n if (input instanceof Request) {\n urlStr = input.url;\n method = input.method;\n requestBody = input.body;\n } else {\n urlStr = input instanceof URL ? input.href : input.toString();\n method = init?.method || \"GET\";\n requestBody = init?.body;\n }\n\n // リクエストをrrwebのカスタムイベントとして記録\n record.addCustomEvent(\"network_request\", {\n type: \"fetch\",\n method,\n url: urlStr,\n requestBody,\n startTime,\n status: \"pending\", // 初期状態は保留中\n });\n\n return originalFetch(...args)\n .then((response) => {\n const endTime = Date.now();\n const duration = endTime - startTime;\n\n // レスポンスを記録(ボディは非同期で読むため、cloneして扱う)\n const clonedResponse = response.clone();\n clonedResponse\n .text()\n .then((responseBody) => {\n record.addCustomEvent(\"network_response\", {\n type: \"fetch\",\n url: urlStr,\n status: response.status,\n statusText: response.statusText,\n responseBody,\n duration,\n endTime,\n });\n })\n .catch((err) => {\n console.error(\n \"ネットワークレスポンスボディ読み込みエラー:\",\n err\n );\n });\n\n return response;\n })\n .catch((error) => {\n const endTime = Date.now();\n const duration = endTime - startTime;\n\n record.addCustomEvent(\"network_error\", {\n type: \"fetch\",\n url: urlStr,\n error: error.message,\n duration,\n endTime,\n });\n\n throw error;\n });\n };\n\n // XMLHttpRequestをフック\n const OriginalXMLHttpRequest = window.XMLHttpRequest;\n class HookedXMLHttpRequest extends OriginalXMLHttpRequest {\n private _method?: string;\n private _url?: string;\n private _startTime?: number;\n\n static readonly UNSENT = 0;\n static readonly OPENED = 1;\n static readonly HEADERS_RECEIVED = 2;\n static readonly LOADING = 3;\n static readonly DONE = 4;\n\n open(\n method: string,\n url: string | URL,\n async = true,\n username: string | null = null,\n password: string | null = null\n ) {\n this._method = method;\n this._url = url.toString();\n this._startTime = Date.now();\n // リクエストを記録\n record.addCustomEvent(\"network_request\", {\n type: \"xhr\",\n method,\n url: this._url,\n startTime: this._startTime,\n status: \"pending\", // 初期状態は保留中\n });\n return super.open(method, url, async, username, password);\n }\n\n send(body?: any) {\n this.addEventListener(\"load\", () => {\n const endTime = Date.now();\n const duration = endTime - (this._startTime || 0);\n\n record.addCustomEvent(\"network_response\", {\n type: \"xhr\",\n url: this._url,\n status: this.status,\n statusText: this.statusText,\n responseBody: this.responseText,\n duration,\n endTime,\n });\n });\n\n this.addEventListener(\"error\", () => {\n const endTime = Date.now();\n const duration = endTime - (this._startTime || 0);\n\n record.addCustomEvent(\"network_error\", {\n type: \"xhr\",\n url: this._url,\n error: \"XHR error\",\n duration,\n endTime,\n });\n });\n\n return super.send(body);\n }\n }\n window.XMLHttpRequest = HookedXMLHttpRequest;\n\n // WebSocketをフック\n const OriginalWebSocket = window.WebSocket;\n window.WebSocket = class HookedWebSocket extends OriginalWebSocket {\n constructor(url: string | URL, protocols?: string | string[]) {\n super(url, protocols);\n const wsUrl = url.toString();\n record.addCustomEvent(\"network_websocket_open\", {\n type: \"websocket\",\n url: wsUrl,\n startTime: Date.now(),\n });\n\n this.addEventListener(\"message\", (event) => {\n record.addCustomEvent(\"network_websocket_message\", {\n type: \"websocket\",\n url: wsUrl,\n data: event.data,\n time: Date.now(),\n });\n });\n\n this.addEventListener(\"close\", (event) => {\n record.addCustomEvent(\"network_websocket_close\", {\n type: \"websocket\",\n url: wsUrl,\n code: event.code,\n reason: event.reason,\n endTime: Date.now(),\n });\n });\n\n this.addEventListener(\"error\", (event) => {\n record.addCustomEvent(\"network_websocket_error\", {\n type: \"websocket\",\n url: wsUrl,\n error: \"WebSocket error\",\n time: Date.now(),\n });\n });\n }\n\n send(data: any) {\n record.addCustomEvent(\"network_websocket_send\", {\n type: \"websocket\",\n url: this.url,\n data,\n time: Date.now(),\n });\n return super.send(data);\n }\n };\n } catch (error) {\n console.error(\"ネットワーク録画エラー:\", error);\n throw error;\n }\n }\n\n async startRrwebRecordingForStore() {\n try {\n if (this.stopFnForStore) return;\n\n const _sessionId = this.sessionId;\n const userId = this.userId || \"anonymous\";\n const originalUserId = this.originalUserId || \"\";\n const _db = this.db;\n const prefix = this.prefix;\n let rrwebRecords: string[] = [];\n let pinTime = new Date().getTime();\n if (!this.db || !_db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n // rrwebの録画を開始\n // このセッションの開始時間を記録\n const ActionRecordSessionRef = doc(\n collection(this.db, `${prefix}ActionRecordSession`),\n _sessionId\n );\n await setDoc(ActionRecordSessionRef, {\n id: _sessionId,\n startTime: new Date(),\n endTime: new Date(),\n recordTime: 0, // 初期値は0\n userId,\n projectId: this.projectId || \"\",\n organizationId: this.projectData?.organizationId || \"\",\n createAt: new Date(),\n updateAt: new Date(),\n createdBy: userId,\n updatedBy: userId,\n });\n try {\n console.log(\"setSessionDetail関数を呼び出します\", this.sessionId);\n await setSessionDetail({ sessionId: this.sessionId });\n } catch (error) {\n console.error(\"setSessionDetail関数の呼び出しに失敗:\", error);\n }\n const docRef = doc(\n collection(this.db, \"ActionRecordSession\"),\n this.sessionId\n );\n await getDoc(docRef)\n .then(async (doc) => {\n if (doc.exists()) {\n const data = doc.data() as ActionRecordSession;\n const ipAddress = data?.ipAddress || \"\";\n const placeData = await getPlaceFromIp(ipAddress);\n\n await updateDoc(docRef, { place: placeData });\n }\n })\n .catch((error) => {\n console.error(\"IPアドレスの取得に失敗:\", error);\n });\n\n this.stopFnForStore = record({\n packFn: pack,\n collectFonts: true,\n inlineImages: false,\n checkoutEveryNth: 500,\n recordCanvas: true,\n recordCrossOriginIframes: true,\n sampling: {\n canvas: 1000,\n mousemove: 1000,\n mousemoveCallback: 1000,\n scroll: 150, // do not emit twice in 150ms\n // set the interval of media interaction event\n media: 800,\n // set the timing of record input\n input: \"last\", // When input mulitple characters, only record the final input\n },\n\n emit: async (event) => {\n try {\n const deffTime = new Date().getTime() - pinTime;\n rrwebRecords.push(JSON.stringify(event));\n if (\n rrwebRecords.length >= 200 ||\n (deffTime >= 10000 && rrwebRecords.length > 0)\n ) {\n pinTime = new Date().getTime(); // リセット\n const record: ActionRecord = {\n id: \"\",\n timeStamp: new Date(),\n userId,\n originalUserId,\n type: \"rrweb\",\n sessionId: _sessionId,\n rrwebRecords: rrwebRecords,\n createAt: new Date(),\n updateAt: new Date(),\n hidden: false,\n createdBy: userId,\n updatedBy: userId,\n hiddenBy: \"\",\n };\n rrwebRecords = []; // リセット\n const newDocRef = doc(collection(_db, `${prefix}ActionRecord`));\n record.id = newDocRef.id; // 新しいIDを生成\n\n await setDoc(newDocRef, record);\n // 送信後にリセット\n }\n } catch (error) {\n console.error(\"rrwebイベント保存エラー:\", error);\n throw error;\n }\n },\n });\n this.startConsoleRecording();\n this.startTimelineRecording();\n this.startNetworkRecording(); // ネットワーク録画を追加で開始\n } catch (error) {\n console.error(\"rrweb録画エラー:\", error);\n throw error;\n }\n }\n\n stopRrwebRecordingForStore() {\n try {\n if (this.stopFnForStore) {\n this.stopFnForStore();\n this.stopFnForStore = null;\n }\n } catch (error) {\n console.error(\"rrweb録画停止エラー:\", error);\n throw error;\n }\n }\n async updateActionRecordSession() {\n try {\n if (!this.db || !this.sessionId || !this.userId) {\n console.error(\n \"Firestoreが初期化されていません、またはsessionId、userIdが設定されていません\"\n );\n return;\n }\n const ActionRecordSessionRef = doc(\n collection(this.db, `${this.prefix}ActionRecordSession`),\n this.sessionId\n );\n await setDoc(\n ActionRecordSessionRef,\n {\n endTime: new Date(),\n updateAt: new Date(),\n updatedBy: this.userId,\n },\n { merge: true }\n ).catch((error) => {\n console.error(\"Error updating ActionRecordSession: \", error);\n });\n } catch (error) {\n console.error(\"ActionRecordSession更新エラー:\", error);\n throw error;\n }\n }\n}\n\nexport const ActionLens = new ActionLensRc();\n\nconst getPlaceFromIp = async (ip: string) => {\n try {\n const response = await fetch(`https://ipapi.co/${ip}/json/`);\n if (!response.ok) {\n throw new Error(`IP情報取得エラー: ${response.statusText}`);\n }\n const data = await response.json();\n return {\n city: data.city,\n region: data.region,\n country: data.country_name,\n latitude: data.latitude,\n longitude: data.longitude,\n };\n } catch (error) {\n console.error(\"IP情報取得エラー:\", error);\n return null;\n }\n};\n"],"mappings":"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","names":["import_firestore","doc","import_rrweb","import_firestore","import_packer","uuidv4","db","doc","record"]}
|
package/dist/index.mjs
CHANGED
|
@@ -124,6 +124,12 @@ var ActionLensPlayer = class {
|
|
|
124
124
|
this.currentTime = this.replayer?.getCurrentTime() || 0;
|
|
125
125
|
this.endTimeoutTimeline();
|
|
126
126
|
});
|
|
127
|
+
this.replayer.on("event-cast", (event) => {
|
|
128
|
+
console.log("Event cast:", event);
|
|
129
|
+
if (event.type === 4 && event.data.href) {
|
|
130
|
+
this.currentUrl = event.data.href;
|
|
131
|
+
}
|
|
132
|
+
});
|
|
127
133
|
this.replayer.on("resize", (e) => {
|
|
128
134
|
const { width, height } = e;
|
|
129
135
|
this.width = width;
|
|
@@ -576,33 +582,35 @@ var ActionLensRc = class {
|
|
|
576
582
|
for (const entry of list.getEntries()) {
|
|
577
583
|
if (entry.entryType === "resource") {
|
|
578
584
|
const resourceEntry = entry;
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
585
|
+
if (resourceEntry.initiatorType !== "xmlhttprequest" && resourceEntry.initiatorType !== "fetch") {
|
|
586
|
+
record.addCustomEvent("network_resource", {
|
|
587
|
+
name: resourceEntry.name,
|
|
588
|
+
entryType: resourceEntry.entryType,
|
|
589
|
+
initiatorType: resourceEntry.initiatorType,
|
|
590
|
+
// css, script, img, font など
|
|
591
|
+
nextHopProtocol: resourceEntry.nextHopProtocol,
|
|
592
|
+
encodedBodySize: resourceEntry.encodedBodySize,
|
|
593
|
+
decodedBodySize: resourceEntry.decodedBodySize,
|
|
594
|
+
transferSize: resourceEntry.transferSize,
|
|
595
|
+
duration: resourceEntry.duration,
|
|
596
|
+
startTime: resourceEntry.startTime,
|
|
597
|
+
fetchStart: resourceEntry.fetchStart,
|
|
598
|
+
domainLookupStart: resourceEntry.domainLookupStart,
|
|
599
|
+
domainLookupEnd: resourceEntry.domainLookupEnd,
|
|
600
|
+
connectStart: resourceEntry.connectStart,
|
|
601
|
+
connectEnd: resourceEntry.connectEnd,
|
|
602
|
+
secureConnectionStart: resourceEntry.secureConnectionStart,
|
|
603
|
+
requestStart: resourceEntry.requestStart,
|
|
604
|
+
responseStart: resourceEntry.responseStart,
|
|
605
|
+
responseEnd: resourceEntry.responseEnd,
|
|
606
|
+
workerStart: resourceEntry.workerStart,
|
|
607
|
+
redirectStart: resourceEntry.redirectStart,
|
|
608
|
+
redirectEnd: resourceEntry.redirectEnd,
|
|
609
|
+
// responseStatus is experimental, may not be available
|
|
610
|
+
responseStatus: resourceEntry.responseStatus || void 0,
|
|
611
|
+
serverTiming: resourceEntry.serverTiming
|
|
612
|
+
});
|
|
613
|
+
}
|
|
606
614
|
} else {
|
|
607
615
|
record.addCustomEvent("performance", {
|
|
608
616
|
name: entry.name,
|
|
@@ -834,7 +842,6 @@ var ActionLensRc = class {
|
|
|
834
842
|
const data = doc3.data();
|
|
835
843
|
const ipAddress = data?.ipAddress || "";
|
|
836
844
|
const placeData = await getPlaceFromIp(ipAddress);
|
|
837
|
-
console.log("placeData", placeData);
|
|
838
845
|
await updateDoc(docRef, { place: placeData });
|
|
839
846
|
}
|
|
840
847
|
}).catch((error) => {
|
|
@@ -844,16 +851,26 @@ var ActionLensRc = class {
|
|
|
844
851
|
packFn: pack,
|
|
845
852
|
collectFonts: true,
|
|
846
853
|
inlineImages: false,
|
|
854
|
+
checkoutEveryNth: 500,
|
|
855
|
+
recordCanvas: true,
|
|
856
|
+
recordCrossOriginIframes: true,
|
|
847
857
|
sampling: {
|
|
848
|
-
canvas:
|
|
849
|
-
mousemove:
|
|
850
|
-
mousemoveCallback:
|
|
858
|
+
canvas: 1e3,
|
|
859
|
+
mousemove: 1e3,
|
|
860
|
+
mousemoveCallback: 1e3,
|
|
861
|
+
scroll: 150,
|
|
862
|
+
// do not emit twice in 150ms
|
|
863
|
+
// set the interval of media interaction event
|
|
864
|
+
media: 800,
|
|
865
|
+
// set the timing of record input
|
|
866
|
+
input: "last"
|
|
867
|
+
// When input mulitple characters, only record the final input
|
|
851
868
|
},
|
|
852
869
|
emit: async (event) => {
|
|
853
870
|
try {
|
|
854
871
|
const deffTime = (/* @__PURE__ */ new Date()).getTime() - pinTime;
|
|
855
872
|
rrwebRecords.push(JSON.stringify(event));
|
|
856
|
-
if (rrwebRecords.length >=
|
|
873
|
+
if (rrwebRecords.length >= 200 || deffTime >= 1e4 && rrwebRecords.length > 0) {
|
|
857
874
|
pinTime = (/* @__PURE__ */ new Date()).getTime();
|
|
858
875
|
const record2 = {
|
|
859
876
|
id: "",
|
|
@@ -879,8 +896,7 @@ var ActionLensRc = class {
|
|
|
879
896
|
console.error("rrweb\u30A4\u30D9\u30F3\u30C8\u4FDD\u5B58\u30A8\u30E9\u30FC:", error);
|
|
880
897
|
throw error;
|
|
881
898
|
}
|
|
882
|
-
}
|
|
883
|
-
recordCanvas: false
|
|
899
|
+
}
|
|
884
900
|
});
|
|
885
901
|
this.startConsoleRecording();
|
|
886
902
|
this.startTimelineRecording();
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/player.ts","../src/utils/index.ts","../src/record.ts"],"sourcesContent":["import {\n doc,\n collection,\n setDoc,\n addDoc,\n where,\n query,\n getDocs,\n orderBy,\n Firestore,\n getDoc,\n limit,\n} from \"firebase/firestore\";\nimport {\n ActionRecord,\n ActionRecordSession,\n AuthUser,\n Project,\n Session,\n User,\n} from \"@ism-tech/actionlens-type\";\nimport { Replayer } from \"rrweb\";\nimport { db } from \"./utils\"; // dbのインポートパスを適宜変更してください\n\nimport { unpack } from \"@rrweb/packer\";\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 recordTime: number = 0; // レコードの時間\n totalTime: number = 0; // 再生中の時間を保持するための変数\n user: AuthUser | null = null; // ユーザーデータを保持するための変数\n private setIntervalId: NodeJS.Timeout | null = null; // setTimeoutのIDを保持するための変数\n width: number = 0; // プレイヤーの幅\n height: number = 0; // プレイヤーの高さ\n sessions: (ActionRecordSession & { userData: User<\"customer\"> })[] = []; // セッションのリスト\n currentUrl: string | null = null; // 現在のURLを保持するための変数\n startTime: number = 0; // セッションの開始時間\n sessionInfo: ActionRecordSession | null = null; // セッション情報を保持するための変数\n constructor(\n userId: string,\n targetDivId: string,\n\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.initialize(userId);\n }\n\n async initialize(userId: string) {\n const user = await getDoc(doc(this.db, `${this.prefix}authUser`, userId));\n if (!user.exists()) {\n throw new Error(`User with ID ${userId} does not exist.`);\n }\n const userData = user.data() as AuthUser;\n this.user = userData; // ユーザーデータを保持\n this.projectId = userData.projectIds?.[0] || \"\"; // プロジェクトIDを取得\n if (!this.projectId) {\n throw new Error(`Project ID for user ${userId} does not exist.`);\n }\n }\n\n async replayRrwebSession(sessionId: string): Promise<any[]> {\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.flatMap((doc) => {\n const data = doc.data() as ActionRecord;\n return data.rrwebRecord\n ? JSON.parse(data.rrwebRecord)\n : data.rrwebRecords\n ? data.rrwebRecords?.map((r) => JSON.parse(r)) || []\n : [];\n });\n\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 unpackFn: unpack,\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 this.width = this.replayer.wrapper.clientWidth;\n this.height = this.replayer.wrapper.clientHeight;\n\n // 4. カスタムイベントのリスナーを追加\n this.replayer.on(\"custom-event\", (event: any) => {\n this.handleCustomEvent(event);\n });\n\n this.replayer.on(\"finish\", () => {\n this.replayer?.pause(0);\n this.playerStatus = \"stopped\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n this.endTimeoutTimeline();\n });\n this.replayer.on(\"resize\", (e) => {\n const { width, height } = e as { width: number; height: number };\n\n this.width = width;\n this.height = height;\n });\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\n this.setTimeoutTimeline();\n return events.map((e) => unpack(e));\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.currentUrl = url;\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 }\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 this.recordTime =\n Number(this.replayer?.getMetaData()?.startTime) + this.currentTime;\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\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 fetchProjectList() {\n try {\n if (!this.userId) {\n console.warn(\"User ID is not initialized.\");\n return [];\n }\n if (!this.user) {\n this.user = (\n await getDoc(doc(this.db, `${this.prefix}authUser`, this.userId))\n ).data() as AuthUser | null;\n if (!this.user) {\n console.warn(`User with ID ${this.userId} does not exist.`);\n\n return [];\n }\n }\n console.log(\"fetchProjectList\", this.user);\n const projectIds = this.user.projectIds || [];\n if (projectIds.length === 0) {\n console.warn(\"No project IDs found for the user.\");\n return [];\n }\n const promise = projectIds.flatMap(async (projectId) => {\n const projectDoc = await getDoc(\n doc(this.db, `${this.prefix}project`, projectId)\n );\n if (!projectDoc.exists()) {\n console.warn(`Project with ID ${projectId} does not exist.`);\n return null;\n }\n return projectDoc.data() as Project;\n });\n const projectPromises: (Project | null)[] = await Promise.all(promise);\n return projectPromises.filter((project) => project !== null);\n } catch (e) {\n console.error(\"プロジェクトリストの取得エラー:\", e);\n throw e;\n }\n }\n\n async fetchSessionList(projectId: string, limitNum: number = 20) {\n try {\n const q = query(\n collection(this.db, `${this.prefix}ActionRecordSession`),\n where(\"projectId\", \"==\", projectId),\n where(\"recordTime\", \">=\", 10),\n orderBy(\"startTime\", \"desc\"),\n limit(limitNum)\n );\n const usersStore: { [userId: string]: User<\"customer\"> } = {};\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<\"customer\">;\n }\n\n return { ...data, userData: usersStore[data.userId] };\n });\n const sessions: (ActionRecordSession & { userData: User<\"customer\"> })[] =\n await Promise.all(promise);\n console.log(sessions);\n this.sessions = sessions;\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\nexport const 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\nexport const 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 setDoc,\n collection,\n getDoc,\n getFirestore,\n updateDoc,\n} from \"firebase/firestore\";\nimport {\n ActionRecord,\n ActionRecordSession,\n Project,\n User,\n} from \"@ism-tech/actionlens-type\";\nimport { db, app } from \"./utils/index\";\nimport { pack } from \"@rrweb/packer\";\nimport { httpsCallable, getFunctions } from \"firebase/functions\";\n\nconst functions = getFunctions(app);\n\nconst setSessionDetail = httpsCallable(functions, \"setSessionDetail\");\nexport class ActionLensRc {\n sessionId: string = uuidv4();\n stopFnForStore: any = null;\n userId: string | null = \"anonymous\"; // ユーザーIDはプロジェクトIDと組み合わせて一意にする\n db: Firestore | null = null;\n prefix: string = \"\";\n userData: User<\"customer\"> | null = null;\n projectId: string | null = null;\n projectData: Project | null = null;\n organizationId: string | null = null;\n originalUserId: string | null = null; // 元のユーザーID(外部システムのIDなど)\n userMeta: { name?: string; email?: string } = {};\n metaData: Record<string, any> = {};\n\n constructor() {\n this.db = db; // Firestoreの初期化\n }\n\n async init(\n projectId: string | null,\n _db: Firestore | null = null,\n prefix: string = \"\"\n ) {\n try {\n if (!projectId) {\n console.error(\"projectIdがNULLです\");\n return;\n }\n this.projectId = projectId;\n\n this.prefix = prefix;\n\n if (!this.db && _db) {\n console.error(\"Firestoreが初期化されていません\");\n this.db = _db;\n }\n if (!this.db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n\n if (!this.projectId) {\n console.error(\"projectIdが設定されていません\");\n return;\n }\n const _doc = await getDoc(\n doc(collection(this.db, `${this.prefix}project`), this.projectId)\n );\n this.projectData = _doc.data() as Project;\n const projectData = this.projectData;\n this.organizationId = projectData?.organizationId || \"\";\n\n if (!this.projectData) {\n await setDoc(\n doc(collection(this.db, `${this.prefix}project`), this.projectId),\n {\n id: this.projectId,\n name: this.projectId,\n organizationId: \"\",\n isActivate: false, // デフォルトでアクティブに設定\n createAt: new Date(),\n updateAt: new Date(),\n createdBy: this.originalUserId,\n updatedBy: this.originalUserId,\n } as Project,\n { merge: true }\n );\n\n console.warn(\"プロジェクトが存在しません\");\n return;\n }\n if (!this.projectData?.isActivate) {\n console.warn(\"プロジェクトは非アクティブです。録画を開始できません。\");\n return;\n }\n\n await this.startRrwebRecordingForStore();\n\n // this.startTimelineRecording();\n return;\n } catch (error) {\n console.error(\"初期化中にエラーが発生しました:\", error);\n return;\n }\n }\n\n async setUser(\n _userId: string | null,\n userMeta: { name: string; email: string },\n metaData: Record<string, any> = {}\n ) {\n if (!this.db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n if (!this.projectData) {\n console.error(\"プロジェクトデータが設定されていません\");\n return;\n }\n this.originalUserId = _userId; // 元のユーザーIDを保存\n this.userMeta = userMeta;\n this.metaData = metaData;\n\n if (!_userId) {\n console.error(\"userIdがNULLです\");\n return;\n }\n\n this.userId = this.projectData.id + \"-\" + this.originalUserId;\n this.prefix = this.prefix;\n this.projectId = this.projectId;\n const user = await getDoc(\n doc(collection(this.db, `${this.prefix}user`), this.userId)\n );\n\n if (!this.db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n\n const userData = user.data() as User<\"customer\">;\n\n if (!userData?.id || !user.exists()) {\n await setDoc(\n doc(\n collection(this.db, `${this.prefix}user`),\n this.projectData.id + \"-\" + this.originalUserId\n ),\n {\n ...(this.userMeta || {}),\n metaData: this.metaData,\n id: this.userId,\n originalUserId: this.originalUserId,\n type: \"customer\",\n organizationId: this.projectData?.organizationId || \"\",\n projectIds: [this.projectId],\n createAt: new Date(),\n updateAt: new Date(),\n createdBy: this.userId,\n updatedBy: this.userId,\n hidden: false,\n hiddenBy: \"\",\n } as User<\"customer\">,\n { merge: true }\n );\n this.userData = {\n ...(this.userMeta || {}),\n metaData: this.metaData,\n id: this.userId,\n originalUserId: this.originalUserId,\n type: \"customer\",\n organizationId: this.projectData?.organizationId || \"\",\n projectIds: [this.projectId],\n createAt: new Date(),\n updateAt: new Date(),\n createdBy: this.userId,\n updatedBy: this.userId,\n hidden: false,\n hiddenBy: \"\",\n } as User<\"customer\">;\n } else {\n this.userData = user.data() as User<\"customer\">;\n\n if (!this.userData?.projectIds?.includes(this.projectId || \"\")) {\n await setDoc(\n doc(\n collection(this.db, `${this.prefix}user`),\n this.projectData.id + \"-\" + this.originalUserId\n ),\n {\n projectIds: [...(this.userData?.projectIds || []), this.projectId],\n updateAt: new Date(),\n updatedBy: this.userId,\n } as Partial<User<\"customer\">>,\n { merge: true }\n );\n }\n\n if (this.userData?.organizationId !== this.projectData.organizationId) {\n await setDoc(\n doc(\n collection(this.db, `${this.prefix}user`),\n this.projectData.id + \"-\" + this.originalUserId\n ),\n {\n organizationId: this.projectData.organizationId\n ? this.projectData.organizationId\n : this.userData?.organizationId,\n updateAt: new Date(),\n updatedBy: this.userId,\n } as Partial<User<\"customer\">>,\n { merge: true }\n );\n }\n }\n const ActionRecordSessionRef = doc(\n collection(this.db, `${this.prefix}ActionRecordSession`),\n this.sessionId\n );\n await setDoc(\n ActionRecordSessionRef,\n {\n userId: this.projectData.id + \"-\" + this.originalUserId,\n originalUserId: this.originalUserId,\n userName: this.userMeta.name || \"anonymous\",\n userEmail: this.userMeta.email || \"\",\n userMeta: this.userMeta,\n updatedBy: this.userId,\n } as Partial<ActionRecordSession>,\n { merge: true }\n );\n return;\n }\n\n // コンソールログをキャプチャ\n startConsoleRecording() {\n try {\n const originalConsole = { ...console };\n const consoleMethods = [\n \"log\",\n \"info\",\n \"warn\",\n \"error\",\n \"debug\",\n \"trace\",\n \"navigation\",\n ] as const;\n\n consoleMethods.forEach((method) => {\n // 型安全なオーバーライド\n (console as any)[method] = (...args: any[]) => {\n // 元のメソッドを呼び出し\n (originalConsole as any)[method](...args);\n\n record.addCustomEvent(\"console\", { method, args });\n };\n });\n } catch (error) {\n console.error(\"コンソール録画エラー:\", error);\n throw error;\n }\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 // ナビゲーション履歴(popstateイベント)\n window.addEventListener(\"popstate\", (event) => {\n if (!db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n\n record.addCustomEvent(\"navigation\", {\n url: window.location.href,\n state: event.state,\n });\n });\n\n // パフォーマンスエントリ\n if (window.performance) {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.entryType === \"resource\") {\n const resourceEntry = entry as PerformanceResourceTiming;\n record.addCustomEvent(\"network_resource\", {\n name: resourceEntry.name,\n entryType: resourceEntry.entryType,\n initiatorType: resourceEntry.initiatorType, // websocket, script, document, font, xmlhttprequest, fetch, preflight etc.\n nextHopProtocol: resourceEntry.nextHopProtocol,\n encodedBodySize: resourceEntry.encodedBodySize,\n decodedBodySize: resourceEntry.decodedBodySize,\n transferSize: resourceEntry.transferSize,\n duration: resourceEntry.duration,\n startTime: resourceEntry.startTime,\n fetchStart: resourceEntry.fetchStart,\n domainLookupStart: resourceEntry.domainLookupStart,\n domainLookupEnd: resourceEntry.domainLookupEnd,\n connectStart: resourceEntry.connectStart,\n connectEnd: resourceEntry.connectEnd,\n secureConnectionStart: resourceEntry.secureConnectionStart,\n requestStart: resourceEntry.requestStart,\n responseStart: resourceEntry.responseStart,\n responseEnd: resourceEntry.responseEnd,\n workerStart: resourceEntry.workerStart,\n redirectStart: resourceEntry.redirectStart,\n redirectEnd: resourceEntry.redirectEnd,\n // responseStatus is experimental, may not be available\n responseStatus:\n (resourceEntry as any).responseStatus || undefined,\n serverTiming: resourceEntry.serverTiming,\n });\n } else {\n record.addCustomEvent(\"performance\", {\n name: entry.name,\n entryType: entry.entryType,\n startTime: entry.startTime,\n duration: entry.duration,\n });\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 // ネットワークリクエストをキャプチャ(新規追加)\n startNetworkRecording() {\n try {\n // fetch APIをフック\n const originalFetch = window.fetch;\n window.fetch = (...args: Parameters<typeof fetch>) => {\n const startTime = Date.now();\n let input = args[0];\n let init = args[1] as RequestInit | undefined;\n\n let urlStr: string;\n let method: string = \"GET\";\n let requestBody: BodyInit | null | undefined;\n\n if (input instanceof Request) {\n urlStr = input.url;\n method = input.method;\n requestBody = input.body;\n } else {\n urlStr = input instanceof URL ? input.href : input.toString();\n method = init?.method || \"GET\";\n requestBody = init?.body;\n }\n\n // リクエストをrrwebのカスタムイベントとして記録\n record.addCustomEvent(\"network_request\", {\n type: \"fetch\",\n method,\n url: urlStr,\n requestBody,\n startTime,\n status: \"pending\", // 初期状態は保留中\n });\n\n return originalFetch(...args)\n .then((response) => {\n const endTime = Date.now();\n const duration = endTime - startTime;\n\n // レスポンスを記録(ボディは非同期で読むため、cloneして扱う)\n const clonedResponse = response.clone();\n clonedResponse\n .text()\n .then((responseBody) => {\n record.addCustomEvent(\"network_response\", {\n type: \"fetch\",\n url: urlStr,\n status: response.status,\n statusText: response.statusText,\n responseBody,\n duration,\n endTime,\n });\n })\n .catch((err) => {\n console.error(\n \"ネットワークレスポンスボディ読み込みエラー:\",\n err\n );\n });\n\n return response;\n })\n .catch((error) => {\n const endTime = Date.now();\n const duration = endTime - startTime;\n\n record.addCustomEvent(\"network_error\", {\n type: \"fetch\",\n url: urlStr,\n error: error.message,\n duration,\n endTime,\n });\n\n throw error;\n });\n };\n\n // XMLHttpRequestをフック\n const OriginalXMLHttpRequest = window.XMLHttpRequest;\n class HookedXMLHttpRequest extends OriginalXMLHttpRequest {\n private _method?: string;\n private _url?: string;\n private _startTime?: number;\n\n static readonly UNSENT = 0;\n static readonly OPENED = 1;\n static readonly HEADERS_RECEIVED = 2;\n static readonly LOADING = 3;\n static readonly DONE = 4;\n\n open(\n method: string,\n url: string | URL,\n async = true,\n username: string | null = null,\n password: string | null = null\n ) {\n this._method = method;\n this._url = url.toString();\n this._startTime = Date.now();\n // リクエストを記録\n record.addCustomEvent(\"network_request\", {\n type: \"xhr\",\n method,\n url: this._url,\n startTime: this._startTime,\n status: \"pending\", // 初期状態は保留中\n });\n return super.open(method, url, async, username, password);\n }\n\n send(body?: any) {\n this.addEventListener(\"load\", () => {\n const endTime = Date.now();\n const duration = endTime - (this._startTime || 0);\n\n record.addCustomEvent(\"network_response\", {\n type: \"xhr\",\n url: this._url,\n status: this.status,\n statusText: this.statusText,\n responseBody: this.responseText,\n duration,\n endTime,\n });\n });\n\n this.addEventListener(\"error\", () => {\n const endTime = Date.now();\n const duration = endTime - (this._startTime || 0);\n\n record.addCustomEvent(\"network_error\", {\n type: \"xhr\",\n url: this._url,\n error: \"XHR error\",\n duration,\n endTime,\n });\n });\n\n return super.send(body);\n }\n }\n window.XMLHttpRequest = HookedXMLHttpRequest;\n\n // WebSocketをフック\n const OriginalWebSocket = window.WebSocket;\n window.WebSocket = class HookedWebSocket extends OriginalWebSocket {\n constructor(url: string | URL, protocols?: string | string[]) {\n super(url, protocols);\n const wsUrl = url.toString();\n record.addCustomEvent(\"network_websocket_open\", {\n type: \"websocket\",\n url: wsUrl,\n startTime: Date.now(),\n });\n\n this.addEventListener(\"message\", (event) => {\n record.addCustomEvent(\"network_websocket_message\", {\n type: \"websocket\",\n url: wsUrl,\n data: event.data,\n time: Date.now(),\n });\n });\n\n this.addEventListener(\"close\", (event) => {\n record.addCustomEvent(\"network_websocket_close\", {\n type: \"websocket\",\n url: wsUrl,\n code: event.code,\n reason: event.reason,\n endTime: Date.now(),\n });\n });\n\n this.addEventListener(\"error\", (event) => {\n record.addCustomEvent(\"network_websocket_error\", {\n type: \"websocket\",\n url: wsUrl,\n error: \"WebSocket error\",\n time: Date.now(),\n });\n });\n }\n\n send(data: any) {\n record.addCustomEvent(\"network_websocket_send\", {\n type: \"websocket\",\n url: this.url,\n data,\n time: Date.now(),\n });\n return super.send(data);\n }\n };\n } catch (error) {\n console.error(\"ネットワーク録画エラー:\", error);\n throw error;\n }\n }\n\n async startRrwebRecordingForStore() {\n try {\n if (this.stopFnForStore) return;\n\n const _sessionId = this.sessionId;\n const userId = this.userId || \"anonymous\";\n const originalUserId = this.originalUserId || \"\";\n const _db = this.db;\n const prefix = this.prefix;\n let rrwebRecords: string[] = [];\n let pinTime = new Date().getTime();\n if (!this.db || !_db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n // rrwebの録画を開始\n // このセッションの開始時間を記録\n const ActionRecordSessionRef = doc(\n collection(this.db, `${prefix}ActionRecordSession`),\n _sessionId\n );\n await setDoc(ActionRecordSessionRef, {\n id: _sessionId,\n startTime: new Date(),\n endTime: new Date(),\n recordTime: 0, // 初期値は0\n userId,\n projectId: this.projectId || \"\",\n organizationId: this.projectData?.organizationId || \"\",\n createAt: new Date(),\n updateAt: new Date(),\n createdBy: userId,\n updatedBy: userId,\n });\n try {\n console.log(\"setSessionDetail関数を呼び出します\", this.sessionId);\n await setSessionDetail({ sessionId: this.sessionId });\n } catch (error) {\n console.error(\"setSessionDetail関数の呼び出しに失敗:\", error);\n }\n const docRef = doc(\n collection(this.db, \"ActionRecordSession\"),\n this.sessionId\n );\n await getDoc(docRef)\n .then(async (doc) => {\n if (doc.exists()) {\n const data = doc.data() as ActionRecordSession;\n const ipAddress = data?.ipAddress || \"\";\n const placeData = await getPlaceFromIp(ipAddress);\n console.log(\"placeData\", placeData);\n await updateDoc(docRef, { place: placeData });\n }\n })\n .catch((error) => {\n console.error(\"IPアドレスの取得に失敗:\", error);\n });\n\n this.stopFnForStore = record({\n packFn: pack,\n collectFonts: true,\n inlineImages: false,\n sampling: {\n canvas: 500,\n mousemove: 500,\n mousemoveCallback: 500,\n },\n\n emit: async (event) => {\n try {\n const deffTime = new Date().getTime() - pinTime;\n rrwebRecords.push(JSON.stringify(event));\n if (\n rrwebRecords.length >= 100 ||\n (deffTime >= 5000 && rrwebRecords.length > 0)\n ) {\n pinTime = new Date().getTime(); // リセット\n const record: ActionRecord = {\n id: \"\",\n timeStamp: new Date(),\n userId,\n originalUserId,\n type: \"rrweb\",\n sessionId: _sessionId,\n rrwebRecords: rrwebRecords,\n createAt: new Date(),\n updateAt: new Date(),\n hidden: false,\n createdBy: userId,\n updatedBy: userId,\n hiddenBy: \"\",\n };\n rrwebRecords = []; // リセット\n const newDocRef = doc(collection(_db, `${prefix}ActionRecord`));\n record.id = newDocRef.id; // 新しいIDを生成\n\n await setDoc(newDocRef, record);\n // 送信後にリセット\n }\n } catch (error) {\n console.error(\"rrwebイベント保存エラー:\", error);\n throw error;\n }\n },\n recordCanvas: false,\n });\n this.startConsoleRecording();\n this.startTimelineRecording();\n this.startNetworkRecording(); // ネットワーク録画を追加で開始\n } catch (error) {\n console.error(\"rrweb録画エラー:\", error);\n throw error;\n }\n }\n\n stopRrwebRecordingForStore() {\n try {\n if (this.stopFnForStore) {\n this.stopFnForStore();\n this.stopFnForStore = null;\n }\n } catch (error) {\n console.error(\"rrweb録画停止エラー:\", error);\n throw error;\n }\n }\n async updateActionRecordSession() {\n try {\n if (!this.db || !this.sessionId || !this.userId) {\n console.error(\n \"Firestoreが初期化されていません、またはsessionId、userIdが設定されていません\"\n );\n return;\n }\n const ActionRecordSessionRef = doc(\n collection(this.db, `${this.prefix}ActionRecordSession`),\n this.sessionId\n );\n await setDoc(\n ActionRecordSessionRef,\n {\n endTime: new Date(),\n updateAt: new Date(),\n updatedBy: this.userId,\n },\n { merge: true }\n ).catch((error) => {\n console.error(\"Error updating ActionRecordSession: \", error);\n });\n } catch (error) {\n console.error(\"ActionRecordSession更新エラー:\", error);\n throw error;\n }\n }\n}\n\nexport const ActionLens = new ActionLensRc();\n\nconst getPlaceFromIp = async (ip: string) => {\n try {\n const response = await fetch(`https://ipapi.co/${ip}/json/`);\n if (!response.ok) {\n throw new Error(`IP情報取得エラー: ${response.statusText}`);\n }\n const data = await response.json();\n return {\n city: data.city,\n region: data.region,\n country: data.country_name,\n latitude: data.latitude,\n longitude: data.longitude,\n };\n } catch (error) {\n console.error(\"IP情報取得エラー:\", error);\n return null;\n }\n};\n"],"mappings":"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","names":["doc","doc","setDoc","collection","getDoc","getDoc","doc","collection","setDoc","db","record"]}
|
|
1
|
+
{"version":3,"sources":["../src/player.ts","../src/utils/index.ts","../src/record.ts"],"sourcesContent":["import {\n doc,\n collection,\n setDoc,\n addDoc,\n where,\n query,\n getDocs,\n orderBy,\n Firestore,\n getDoc,\n limit,\n} from \"firebase/firestore\";\nimport {\n ActionRecord,\n ActionRecordSession,\n AuthUser,\n Project,\n Session,\n User,\n} from \"@ism-tech/actionlens-type\";\nimport { Replayer } from \"rrweb\";\nimport { db } from \"./utils\"; // dbのインポートパスを適宜変更してください\n\nimport { unpack } from \"@rrweb/packer\";\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 recordTime: number = 0; // レコードの時間\n totalTime: number = 0; // 再生中の時間を保持するための変数\n user: AuthUser | null = null; // ユーザーデータを保持するための変数\n private setIntervalId: NodeJS.Timeout | null = null; // setTimeoutのIDを保持するための変数\n width: number = 0; // プレイヤーの幅\n height: number = 0; // プレイヤーの高さ\n sessions: (ActionRecordSession & { userData: User<\"customer\"> })[] = []; // セッションのリスト\n currentUrl: string | null = null; // 現在のURLを保持するための変数\n startTime: number = 0; // セッションの開始時間\n sessionInfo: ActionRecordSession | null = null; // セッション情報を保持するための変数\n constructor(\n userId: string,\n targetDivId: string,\n\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.initialize(userId);\n }\n\n async initialize(userId: string) {\n const user = await getDoc(doc(this.db, `${this.prefix}authUser`, userId));\n if (!user.exists()) {\n throw new Error(`User with ID ${userId} does not exist.`);\n }\n const userData = user.data() as AuthUser;\n this.user = userData; // ユーザーデータを保持\n this.projectId = userData.projectIds?.[0] || \"\"; // プロジェクトIDを取得\n if (!this.projectId) {\n throw new Error(`Project ID for user ${userId} does not exist.`);\n }\n }\n\n async replayRrwebSession(sessionId: string): Promise<any[]> {\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.flatMap((doc) => {\n const data = doc.data() as ActionRecord;\n return data.rrwebRecord\n ? JSON.parse(data.rrwebRecord)\n : data.rrwebRecords\n ? data.rrwebRecords?.map((r) => JSON.parse(r)) || []\n : [];\n });\n\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 unpackFn: unpack,\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 this.width = this.replayer.wrapper.clientWidth;\n this.height = this.replayer.wrapper.clientHeight;\n\n // 4. カスタムイベントのリスナーを追加\n this.replayer.on(\"custom-event\", (event: any) => {\n this.handleCustomEvent(event);\n });\n\n this.replayer.on(\"finish\", () => {\n this.replayer?.pause(0);\n this.playerStatus = \"stopped\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n this.endTimeoutTimeline();\n });\n this.replayer.on(\"event-cast\", (event: any) => {\n console.log(\"Event cast:\", event);\n if (event.type === 4 && event.data.href) {\n this.currentUrl = event.data.href;\n }\n });\n this.replayer.on(\"resize\", (e) => {\n const { width, height } = e as { width: number; height: number };\n\n this.width = width;\n this.height = height;\n });\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\n this.setTimeoutTimeline();\n return events.map((e) => unpack(e));\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.currentUrl = url;\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 }\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 this.recordTime =\n Number(this.replayer?.getMetaData()?.startTime) + this.currentTime;\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\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 fetchProjectList() {\n try {\n if (!this.userId) {\n console.warn(\"User ID is not initialized.\");\n return [];\n }\n if (!this.user) {\n this.user = (\n await getDoc(doc(this.db, `${this.prefix}authUser`, this.userId))\n ).data() as AuthUser | null;\n if (!this.user) {\n console.warn(`User with ID ${this.userId} does not exist.`);\n\n return [];\n }\n }\n console.log(\"fetchProjectList\", this.user);\n const projectIds = this.user.projectIds || [];\n if (projectIds.length === 0) {\n console.warn(\"No project IDs found for the user.\");\n return [];\n }\n const promise = projectIds.flatMap(async (projectId) => {\n const projectDoc = await getDoc(\n doc(this.db, `${this.prefix}project`, projectId)\n );\n if (!projectDoc.exists()) {\n console.warn(`Project with ID ${projectId} does not exist.`);\n return null;\n }\n return projectDoc.data() as Project;\n });\n const projectPromises: (Project | null)[] = await Promise.all(promise);\n return projectPromises.filter((project) => project !== null);\n } catch (e) {\n console.error(\"プロジェクトリストの取得エラー:\", e);\n throw e;\n }\n }\n\n async fetchSessionList(projectId: string, limitNum: number = 20) {\n try {\n const q = query(\n collection(this.db, `${this.prefix}ActionRecordSession`),\n where(\"projectId\", \"==\", projectId),\n where(\"recordTime\", \">=\", 10),\n orderBy(\"startTime\", \"desc\"),\n limit(limitNum)\n );\n const usersStore: { [userId: string]: User<\"customer\"> } = {};\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<\"customer\">;\n }\n\n return { ...data, userData: usersStore[data.userId] };\n });\n const sessions: (ActionRecordSession & { userData: User<\"customer\"> })[] =\n await Promise.all(promise);\n console.log(sessions);\n this.sessions = sessions;\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\nexport const 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\nexport const 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 setDoc,\n collection,\n getDoc,\n getFirestore,\n updateDoc,\n} from \"firebase/firestore\";\nimport {\n ActionRecord,\n ActionRecordSession,\n Project,\n User,\n} from \"@ism-tech/actionlens-type\";\nimport { db, app } from \"./utils/index\";\nimport { pack } from \"@rrweb/packer\";\nimport { httpsCallable, getFunctions } from \"firebase/functions\";\n\nconst functions = getFunctions(app);\n\nconst setSessionDetail = httpsCallable(functions, \"setSessionDetail\");\nexport class ActionLensRc {\n sessionId: string = uuidv4();\n stopFnForStore: any = null;\n userId: string | null = \"anonymous\"; // ユーザーIDはプロジェクトIDと組み合わせて一意にする\n db: Firestore | null = null;\n prefix: string = \"\";\n userData: User<\"customer\"> | null = null;\n projectId: string | null = null;\n projectData: Project | null = null;\n organizationId: string | null = null;\n originalUserId: string | null = null; // 元のユーザーID(外部システムのIDなど)\n userMeta: { name?: string; email?: string } = {};\n metaData: Record<string, any> = {};\n\n constructor() {\n this.db = db; // Firestoreの初期化\n }\n\n async init(\n projectId: string | null,\n _db: Firestore | null = null,\n prefix: string = \"\"\n ) {\n try {\n if (!projectId) {\n console.error(\"projectIdがNULLです\");\n return;\n }\n this.projectId = projectId;\n\n this.prefix = prefix;\n\n if (!this.db && _db) {\n console.error(\"Firestoreが初期化されていません\");\n this.db = _db;\n }\n if (!this.db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n\n if (!this.projectId) {\n console.error(\"projectIdが設定されていません\");\n return;\n }\n const _doc = await getDoc(\n doc(collection(this.db, `${this.prefix}project`), this.projectId)\n );\n this.projectData = _doc.data() as Project;\n const projectData = this.projectData;\n this.organizationId = projectData?.organizationId || \"\";\n\n if (!this.projectData) {\n await setDoc(\n doc(collection(this.db, `${this.prefix}project`), this.projectId),\n {\n id: this.projectId,\n name: this.projectId,\n organizationId: \"\",\n isActivate: false, // デフォルトでアクティブに設定\n createAt: new Date(),\n updateAt: new Date(),\n createdBy: this.originalUserId,\n updatedBy: this.originalUserId,\n } as Project,\n { merge: true }\n );\n\n console.warn(\"プロジェクトが存在しません\");\n return;\n }\n if (!this.projectData?.isActivate) {\n console.warn(\"プロジェクトは非アクティブです。録画を開始できません。\");\n return;\n }\n\n await this.startRrwebRecordingForStore();\n\n // this.startTimelineRecording();\n return;\n } catch (error) {\n console.error(\"初期化中にエラーが発生しました:\", error);\n return;\n }\n }\n\n async setUser(\n _userId: string | null,\n userMeta: { name: string; email: string },\n metaData: Record<string, any> = {}\n ) {\n if (!this.db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n if (!this.projectData) {\n console.error(\"プロジェクトデータが設定されていません\");\n return;\n }\n this.originalUserId = _userId; // 元のユーザーIDを保存\n this.userMeta = userMeta;\n this.metaData = metaData;\n\n if (!_userId) {\n console.error(\"userIdがNULLです\");\n return;\n }\n\n this.userId = this.projectData.id + \"-\" + this.originalUserId;\n this.prefix = this.prefix;\n this.projectId = this.projectId;\n const user = await getDoc(\n doc(collection(this.db, `${this.prefix}user`), this.userId)\n );\n\n if (!this.db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n\n const userData = user.data() as User<\"customer\">;\n\n if (!userData?.id || !user.exists()) {\n await setDoc(\n doc(\n collection(this.db, `${this.prefix}user`),\n this.projectData.id + \"-\" + this.originalUserId\n ),\n {\n ...(this.userMeta || {}),\n metaData: this.metaData,\n id: this.userId,\n originalUserId: this.originalUserId,\n type: \"customer\",\n organizationId: this.projectData?.organizationId || \"\",\n projectIds: [this.projectId],\n createAt: new Date(),\n updateAt: new Date(),\n createdBy: this.userId,\n updatedBy: this.userId,\n hidden: false,\n hiddenBy: \"\",\n } as User<\"customer\">,\n { merge: true }\n );\n this.userData = {\n ...(this.userMeta || {}),\n metaData: this.metaData,\n id: this.userId,\n originalUserId: this.originalUserId,\n type: \"customer\",\n organizationId: this.projectData?.organizationId || \"\",\n projectIds: [this.projectId],\n createAt: new Date(),\n updateAt: new Date(),\n createdBy: this.userId,\n updatedBy: this.userId,\n hidden: false,\n hiddenBy: \"\",\n } as User<\"customer\">;\n } else {\n this.userData = user.data() as User<\"customer\">;\n\n if (!this.userData?.projectIds?.includes(this.projectId || \"\")) {\n await setDoc(\n doc(\n collection(this.db, `${this.prefix}user`),\n this.projectData.id + \"-\" + this.originalUserId\n ),\n {\n projectIds: [...(this.userData?.projectIds || []), this.projectId],\n updateAt: new Date(),\n updatedBy: this.userId,\n } as Partial<User<\"customer\">>,\n { merge: true }\n );\n }\n\n if (this.userData?.organizationId !== this.projectData.organizationId) {\n await setDoc(\n doc(\n collection(this.db, `${this.prefix}user`),\n this.projectData.id + \"-\" + this.originalUserId\n ),\n {\n organizationId: this.projectData.organizationId\n ? this.projectData.organizationId\n : this.userData?.organizationId,\n updateAt: new Date(),\n updatedBy: this.userId,\n } as Partial<User<\"customer\">>,\n { merge: true }\n );\n }\n }\n const ActionRecordSessionRef = doc(\n collection(this.db, `${this.prefix}ActionRecordSession`),\n this.sessionId\n );\n await setDoc(\n ActionRecordSessionRef,\n {\n userId: this.projectData.id + \"-\" + this.originalUserId,\n originalUserId: this.originalUserId,\n userName: this.userMeta.name || \"anonymous\",\n userEmail: this.userMeta.email || \"\",\n userMeta: this.userMeta,\n updatedBy: this.userId,\n } as Partial<ActionRecordSession>,\n { merge: true }\n );\n return;\n }\n\n // コンソールログをキャプチャ\n startConsoleRecording() {\n try {\n const originalConsole = { ...console };\n const consoleMethods = [\n \"log\",\n \"info\",\n \"warn\",\n \"error\",\n \"debug\",\n \"trace\",\n \"navigation\",\n ] as const;\n\n consoleMethods.forEach((method) => {\n // 型安全なオーバーライド\n (console as any)[method] = (...args: any[]) => {\n // 元のメソッドを呼び出し\n (originalConsole as any)[method](...args);\n\n record.addCustomEvent(\"console\", { method, args });\n };\n });\n } catch (error) {\n console.error(\"コンソール録画エラー:\", error);\n throw error;\n }\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 // ナビゲーション履歴(popstateイベント)\n window.addEventListener(\"popstate\", (event) => {\n if (!db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n\n record.addCustomEvent(\"navigation\", {\n url: window.location.href,\n state: event.state,\n });\n });\n\n // パフォーマンスエントリ\n if (window.performance) {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.entryType === \"resource\") {\n const resourceEntry = entry as PerformanceResourceTiming;\n // 新規追加: XHR/Fetch以外(CSS, JS, images, fontsなど)のみ記録\n // initiatorTypeでフィルタリング(XHR: \"xmlhttprequest\", Fetch: \"fetch\")\n if (\n resourceEntry.initiatorType !== \"xmlhttprequest\" &&\n resourceEntry.initiatorType !== \"fetch\"\n ) {\n record.addCustomEvent(\"network_resource\", {\n name: resourceEntry.name,\n entryType: resourceEntry.entryType,\n initiatorType: resourceEntry.initiatorType, // css, script, img, font など\n nextHopProtocol: resourceEntry.nextHopProtocol,\n encodedBodySize: resourceEntry.encodedBodySize,\n decodedBodySize: resourceEntry.decodedBodySize,\n transferSize: resourceEntry.transferSize,\n duration: resourceEntry.duration,\n startTime: resourceEntry.startTime,\n fetchStart: resourceEntry.fetchStart,\n domainLookupStart: resourceEntry.domainLookupStart,\n domainLookupEnd: resourceEntry.domainLookupEnd,\n connectStart: resourceEntry.connectStart,\n connectEnd: resourceEntry.connectEnd,\n secureConnectionStart: resourceEntry.secureConnectionStart,\n requestStart: resourceEntry.requestStart,\n responseStart: resourceEntry.responseStart,\n responseEnd: resourceEntry.responseEnd,\n workerStart: resourceEntry.workerStart,\n redirectStart: resourceEntry.redirectStart,\n redirectEnd: resourceEntry.redirectEnd,\n // responseStatus is experimental, may not be available\n responseStatus:\n (resourceEntry as any).responseStatus || undefined,\n serverTiming: resourceEntry.serverTiming,\n });\n }\n } else {\n record.addCustomEvent(\"performance\", {\n name: entry.name,\n entryType: entry.entryType,\n startTime: entry.startTime,\n duration: entry.duration,\n });\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 // ネットワークリクエストをキャプチャ(新規追加)\n startNetworkRecording() {\n try {\n // fetch APIをフック\n const originalFetch = window.fetch;\n window.fetch = (...args: Parameters<typeof fetch>) => {\n const startTime = Date.now();\n let input = args[0];\n let init = args[1] as RequestInit | undefined;\n\n let urlStr: string;\n let method: string = \"GET\";\n let requestBody: BodyInit | null | undefined;\n\n if (input instanceof Request) {\n urlStr = input.url;\n method = input.method;\n requestBody = input.body;\n } else {\n urlStr = input instanceof URL ? input.href : input.toString();\n method = init?.method || \"GET\";\n requestBody = init?.body;\n }\n\n // リクエストをrrwebのカスタムイベントとして記録\n record.addCustomEvent(\"network_request\", {\n type: \"fetch\",\n method,\n url: urlStr,\n requestBody,\n startTime,\n status: \"pending\", // 初期状態は保留中\n });\n\n return originalFetch(...args)\n .then((response) => {\n const endTime = Date.now();\n const duration = endTime - startTime;\n\n // レスポンスを記録(ボディは非同期で読むため、cloneして扱う)\n const clonedResponse = response.clone();\n clonedResponse\n .text()\n .then((responseBody) => {\n record.addCustomEvent(\"network_response\", {\n type: \"fetch\",\n url: urlStr,\n status: response.status,\n statusText: response.statusText,\n responseBody,\n duration,\n endTime,\n });\n })\n .catch((err) => {\n console.error(\n \"ネットワークレスポンスボディ読み込みエラー:\",\n err\n );\n });\n\n return response;\n })\n .catch((error) => {\n const endTime = Date.now();\n const duration = endTime - startTime;\n\n record.addCustomEvent(\"network_error\", {\n type: \"fetch\",\n url: urlStr,\n error: error.message,\n duration,\n endTime,\n });\n\n throw error;\n });\n };\n\n // XMLHttpRequestをフック\n const OriginalXMLHttpRequest = window.XMLHttpRequest;\n class HookedXMLHttpRequest extends OriginalXMLHttpRequest {\n private _method?: string;\n private _url?: string;\n private _startTime?: number;\n\n static readonly UNSENT = 0;\n static readonly OPENED = 1;\n static readonly HEADERS_RECEIVED = 2;\n static readonly LOADING = 3;\n static readonly DONE = 4;\n\n open(\n method: string,\n url: string | URL,\n async = true,\n username: string | null = null,\n password: string | null = null\n ) {\n this._method = method;\n this._url = url.toString();\n this._startTime = Date.now();\n // リクエストを記録\n record.addCustomEvent(\"network_request\", {\n type: \"xhr\",\n method,\n url: this._url,\n startTime: this._startTime,\n status: \"pending\", // 初期状態は保留中\n });\n return super.open(method, url, async, username, password);\n }\n\n send(body?: any) {\n this.addEventListener(\"load\", () => {\n const endTime = Date.now();\n const duration = endTime - (this._startTime || 0);\n\n record.addCustomEvent(\"network_response\", {\n type: \"xhr\",\n url: this._url,\n status: this.status,\n statusText: this.statusText,\n responseBody: this.responseText,\n duration,\n endTime,\n });\n });\n\n this.addEventListener(\"error\", () => {\n const endTime = Date.now();\n const duration = endTime - (this._startTime || 0);\n\n record.addCustomEvent(\"network_error\", {\n type: \"xhr\",\n url: this._url,\n error: \"XHR error\",\n duration,\n endTime,\n });\n });\n\n return super.send(body);\n }\n }\n window.XMLHttpRequest = HookedXMLHttpRequest;\n\n // WebSocketをフック\n const OriginalWebSocket = window.WebSocket;\n window.WebSocket = class HookedWebSocket extends OriginalWebSocket {\n constructor(url: string | URL, protocols?: string | string[]) {\n super(url, protocols);\n const wsUrl = url.toString();\n record.addCustomEvent(\"network_websocket_open\", {\n type: \"websocket\",\n url: wsUrl,\n startTime: Date.now(),\n });\n\n this.addEventListener(\"message\", (event) => {\n record.addCustomEvent(\"network_websocket_message\", {\n type: \"websocket\",\n url: wsUrl,\n data: event.data,\n time: Date.now(),\n });\n });\n\n this.addEventListener(\"close\", (event) => {\n record.addCustomEvent(\"network_websocket_close\", {\n type: \"websocket\",\n url: wsUrl,\n code: event.code,\n reason: event.reason,\n endTime: Date.now(),\n });\n });\n\n this.addEventListener(\"error\", (event) => {\n record.addCustomEvent(\"network_websocket_error\", {\n type: \"websocket\",\n url: wsUrl,\n error: \"WebSocket error\",\n time: Date.now(),\n });\n });\n }\n\n send(data: any) {\n record.addCustomEvent(\"network_websocket_send\", {\n type: \"websocket\",\n url: this.url,\n data,\n time: Date.now(),\n });\n return super.send(data);\n }\n };\n } catch (error) {\n console.error(\"ネットワーク録画エラー:\", error);\n throw error;\n }\n }\n\n async startRrwebRecordingForStore() {\n try {\n if (this.stopFnForStore) return;\n\n const _sessionId = this.sessionId;\n const userId = this.userId || \"anonymous\";\n const originalUserId = this.originalUserId || \"\";\n const _db = this.db;\n const prefix = this.prefix;\n let rrwebRecords: string[] = [];\n let pinTime = new Date().getTime();\n if (!this.db || !_db) {\n console.error(\"Firestoreが初期化されていません\");\n return;\n }\n // rrwebの録画を開始\n // このセッションの開始時間を記録\n const ActionRecordSessionRef = doc(\n collection(this.db, `${prefix}ActionRecordSession`),\n _sessionId\n );\n await setDoc(ActionRecordSessionRef, {\n id: _sessionId,\n startTime: new Date(),\n endTime: new Date(),\n recordTime: 0, // 初期値は0\n userId,\n projectId: this.projectId || \"\",\n organizationId: this.projectData?.organizationId || \"\",\n createAt: new Date(),\n updateAt: new Date(),\n createdBy: userId,\n updatedBy: userId,\n });\n try {\n console.log(\"setSessionDetail関数を呼び出します\", this.sessionId);\n await setSessionDetail({ sessionId: this.sessionId });\n } catch (error) {\n console.error(\"setSessionDetail関数の呼び出しに失敗:\", error);\n }\n const docRef = doc(\n collection(this.db, \"ActionRecordSession\"),\n this.sessionId\n );\n await getDoc(docRef)\n .then(async (doc) => {\n if (doc.exists()) {\n const data = doc.data() as ActionRecordSession;\n const ipAddress = data?.ipAddress || \"\";\n const placeData = await getPlaceFromIp(ipAddress);\n\n await updateDoc(docRef, { place: placeData });\n }\n })\n .catch((error) => {\n console.error(\"IPアドレスの取得に失敗:\", error);\n });\n\n this.stopFnForStore = record({\n packFn: pack,\n collectFonts: true,\n inlineImages: false,\n checkoutEveryNth: 500,\n recordCanvas: true,\n recordCrossOriginIframes: true,\n sampling: {\n canvas: 1000,\n mousemove: 1000,\n mousemoveCallback: 1000,\n scroll: 150, // do not emit twice in 150ms\n // set the interval of media interaction event\n media: 800,\n // set the timing of record input\n input: \"last\", // When input mulitple characters, only record the final input\n },\n\n emit: async (event) => {\n try {\n const deffTime = new Date().getTime() - pinTime;\n rrwebRecords.push(JSON.stringify(event));\n if (\n rrwebRecords.length >= 200 ||\n (deffTime >= 10000 && rrwebRecords.length > 0)\n ) {\n pinTime = new Date().getTime(); // リセット\n const record: ActionRecord = {\n id: \"\",\n timeStamp: new Date(),\n userId,\n originalUserId,\n type: \"rrweb\",\n sessionId: _sessionId,\n rrwebRecords: rrwebRecords,\n createAt: new Date(),\n updateAt: new Date(),\n hidden: false,\n createdBy: userId,\n updatedBy: userId,\n hiddenBy: \"\",\n };\n rrwebRecords = []; // リセット\n const newDocRef = doc(collection(_db, `${prefix}ActionRecord`));\n record.id = newDocRef.id; // 新しいIDを生成\n\n await setDoc(newDocRef, record);\n // 送信後にリセット\n }\n } catch (error) {\n console.error(\"rrwebイベント保存エラー:\", error);\n throw error;\n }\n },\n });\n this.startConsoleRecording();\n this.startTimelineRecording();\n this.startNetworkRecording(); // ネットワーク録画を追加で開始\n } catch (error) {\n console.error(\"rrweb録画エラー:\", error);\n throw error;\n }\n }\n\n stopRrwebRecordingForStore() {\n try {\n if (this.stopFnForStore) {\n this.stopFnForStore();\n this.stopFnForStore = null;\n }\n } catch (error) {\n console.error(\"rrweb録画停止エラー:\", error);\n throw error;\n }\n }\n async updateActionRecordSession() {\n try {\n if (!this.db || !this.sessionId || !this.userId) {\n console.error(\n \"Firestoreが初期化されていません、またはsessionId、userIdが設定されていません\"\n );\n return;\n }\n const ActionRecordSessionRef = doc(\n collection(this.db, `${this.prefix}ActionRecordSession`),\n this.sessionId\n );\n await setDoc(\n ActionRecordSessionRef,\n {\n endTime: new Date(),\n updateAt: new Date(),\n updatedBy: this.userId,\n },\n { merge: true }\n ).catch((error) => {\n console.error(\"Error updating ActionRecordSession: \", error);\n });\n } catch (error) {\n console.error(\"ActionRecordSession更新エラー:\", error);\n throw error;\n }\n }\n}\n\nexport const ActionLens = new ActionLensRc();\n\nconst getPlaceFromIp = async (ip: string) => {\n try {\n const response = await fetch(`https://ipapi.co/${ip}/json/`);\n if (!response.ok) {\n throw new Error(`IP情報取得エラー: ${response.statusText}`);\n }\n const data = await response.json();\n return {\n city: data.city,\n region: data.region,\n country: data.country_name,\n latitude: data.latitude,\n longitude: data.longitude,\n };\n } catch (error) {\n console.error(\"IP情報取得エラー:\", error);\n return null;\n }\n};\n"],"mappings":"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","names":["doc","doc","setDoc","collection","getDoc","getDoc","doc","collection","setDoc","db","record"]}
|
package/package.json
CHANGED