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 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
- import_rrweb2.record.addCustomEvent("network_resource", {
593
- name: resourceEntry.name,
594
- entryType: resourceEntry.entryType,
595
- initiatorType: resourceEntry.initiatorType,
596
- // websocket, script, document, font, xmlhttprequest, fetch, preflight etc.
597
- nextHopProtocol: resourceEntry.nextHopProtocol,
598
- encodedBodySize: resourceEntry.encodedBodySize,
599
- decodedBodySize: resourceEntry.decodedBodySize,
600
- transferSize: resourceEntry.transferSize,
601
- duration: resourceEntry.duration,
602
- startTime: resourceEntry.startTime,
603
- fetchStart: resourceEntry.fetchStart,
604
- domainLookupStart: resourceEntry.domainLookupStart,
605
- domainLookupEnd: resourceEntry.domainLookupEnd,
606
- connectStart: resourceEntry.connectStart,
607
- connectEnd: resourceEntry.connectEnd,
608
- secureConnectionStart: resourceEntry.secureConnectionStart,
609
- requestStart: resourceEntry.requestStart,
610
- responseStart: resourceEntry.responseStart,
611
- responseEnd: resourceEntry.responseEnd,
612
- workerStart: resourceEntry.workerStart,
613
- redirectStart: resourceEntry.redirectStart,
614
- redirectEnd: resourceEntry.redirectEnd,
615
- // responseStatus is experimental, may not be available
616
- responseStatus: resourceEntry.responseStatus || void 0,
617
- serverTiming: resourceEntry.serverTiming
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: 500,
862
- mousemove: 500,
863
- mousemoveCallback: 500
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 >= 100 || deffTime >= 5e3 && rrwebRecords.length > 0) {
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
- record.addCustomEvent("network_resource", {
580
- name: resourceEntry.name,
581
- entryType: resourceEntry.entryType,
582
- initiatorType: resourceEntry.initiatorType,
583
- // websocket, script, document, font, xmlhttprequest, fetch, preflight etc.
584
- nextHopProtocol: resourceEntry.nextHopProtocol,
585
- encodedBodySize: resourceEntry.encodedBodySize,
586
- decodedBodySize: resourceEntry.decodedBodySize,
587
- transferSize: resourceEntry.transferSize,
588
- duration: resourceEntry.duration,
589
- startTime: resourceEntry.startTime,
590
- fetchStart: resourceEntry.fetchStart,
591
- domainLookupStart: resourceEntry.domainLookupStart,
592
- domainLookupEnd: resourceEntry.domainLookupEnd,
593
- connectStart: resourceEntry.connectStart,
594
- connectEnd: resourceEntry.connectEnd,
595
- secureConnectionStart: resourceEntry.secureConnectionStart,
596
- requestStart: resourceEntry.requestStart,
597
- responseStart: resourceEntry.responseStart,
598
- responseEnd: resourceEntry.responseEnd,
599
- workerStart: resourceEntry.workerStart,
600
- redirectStart: resourceEntry.redirectStart,
601
- redirectEnd: resourceEntry.redirectEnd,
602
- // responseStatus is experimental, may not be available
603
- responseStatus: resourceEntry.responseStatus || void 0,
604
- serverTiming: resourceEntry.serverTiming
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: 500,
849
- mousemove: 500,
850
- mousemoveCallback: 500
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 >= 100 || deffTime >= 5e3 && rrwebRecords.length > 0) {
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();
@@ -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":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AASP,SAAS,gBAAgB;;;ACrBzB,SAAS,qBAAqB;AAC9B,SAAS,oBAAoB;AAEtB,IAAM,iBAAiB;AAAA,EAC5B,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,OAAO;AACT;AAGO,IAAM,MAAM,cAAc,cAAc;AAExC,IAAM,KAAK,aAAa,GAAG;;;ADSlC,SAAS,cAAc;AAEhB,IAAM,mBAAN,MAAuB;AAAA,EAC5B,WAA4B;AAAA,EAC5B,mBAAuC;AAAA,EACvC,eAAiD;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAwB;AAAA,EACxB,YAA2B;AAAA,EAC3B,cAAsB;AAAA;AAAA,EACtB,aAAqB;AAAA;AAAA,EACrB,YAAoB;AAAA;AAAA,EACpB,OAAwB;AAAA;AAAA,EAChB,gBAAuC;AAAA;AAAA,EAC/C,QAAgB;AAAA;AAAA,EAChB,SAAiB;AAAA;AAAA,EACjB,WAAqE,CAAC;AAAA;AAAA,EACtE,aAA4B;AAAA;AAAA,EAC5B,YAAoB;AAAA;AAAA,EACpB,cAA0C;AAAA;AAAA,EAC1C,YACE,QACA,aAEA,MAAiB,IACjB,SAAiB,IACjB;AAEA,SAAK,SAAS;AACd,SAAK,cAAc;AACnB,SAAK,KAAK;AACV,SAAK,SAAS;AACd,SAAK,WAAW,MAAM;AAAA,EACxB;AAAA,EAEA,MAAM,WAAW,QAAgB;AAC/B,UAAM,OAAO,MAAM,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,YAAY,MAAM,CAAC;AACxE,QAAI,CAAC,KAAK,OAAO,GAAG;AAClB,YAAM,IAAI,MAAM,gBAAgB,MAAM,kBAAkB;AAAA,IAC1D;AACA,UAAM,WAAW,KAAK,KAAK;AAC3B,SAAK,OAAO;AACZ,SAAK,YAAY,SAAS,aAAa,CAAC,KAAK;AAC7C,QAAI,CAAC,KAAK,WAAW;AACnB,YAAM,IAAI,MAAM,uBAAuB,MAAM,kBAAkB;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,MAAM,mBAAmB,WAAmC;AAC1D,QAAI;AAGF,YAAM,IAAI;AAAA,QACR,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM,cAAc;AAAA,QAChD,MAAM,aAAa,MAAM,SAAS;AAAA,QAClC,QAAQ,aAAa,KAAK;AAAA,MAC5B;AAEA,YAAM,gBAAgB,MAAM,QAAQ,CAAC;AACrC,YAAM,SAAS,cAAc,KAAK,QAAQ,CAACA,SAAQ;AACjD,cAAM,OAAOA,KAAI,KAAK;AACtB,eAAO,KAAK,cACR,KAAK,MAAM,KAAK,WAAW,IAC3B,KAAK,eACL,KAAK,cAAc,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,KAAK,CAAC,IACjD,CAAC;AAAA,MACP,CAAC;AAED,UAAI,OAAO,WAAW,GAAG;AACvB,gBAAQ;AAAA,UACN,oCAAW,SAAS;AAAA,QACtB;AACA,eAAO,CAAC;AAAA,MACV;AAEA,YAAM,YAAY,SAAS,eAAe,KAAK,WAAW;AAC1D,UAAI,CAAC,WAAW;AACd,cAAM,IAAI;AAAA,UACR,MAAM,KAAK,WAAW;AAAA,QACxB;AAAA,MACF;AAGA,gBAAU,UAAU,IAAI,oBAAoB;AAG5C,WAAK,WAAW,IAAI,SAAS,QAAQ;AAAA,QACnC,UAAU;AAAA,QACV,MAAM;AAAA,QACN,qBAAqB;AAAA,QACrB,OAAO;AAAA,UACL,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,QACb;AAAA,QACA,WAAW;AAAA,MACb,CAAQ;AAER,WAAK,QAAQ,KAAK,SAAS,QAAQ;AACnC,WAAK,SAAS,KAAK,SAAS,QAAQ;AAGpC,WAAK,SAAS,GAAG,gBAAgB,CAAC,UAAe;AAC/C,aAAK,kBAAkB,KAAK;AAAA,MAC9B,CAAC;AAED,WAAK,SAAS,GAAG,UAAU,MAAM;AAC/B,aAAK,UAAU,MAAM,CAAC;AACtB,aAAK,eAAe;AACpB,aAAK,cAAc,KAAK,UAAU,eAAe,KAAK;AACtD,aAAK,mBAAmB;AAAA,MAC1B,CAAC;AACD,WAAK,SAAS,GAAG,UAAU,CAAC,MAAM;AAChC,cAAM,EAAE,OAAO,OAAO,IAAI;AAE1B,aAAK,QAAQ;AACb,aAAK,SAAS;AAAA,MAChB,CAAC;AAED,YAAM,EAAE,UAAU,IAAI,KAAK,SAAS,YAAY;AAChD,WAAK,YAAY;AAGjB,YAAM,UAAU,UAAU,iBAAiB,QAAQ;AACnD,cAAQ,QAAQ,CAAC,WAAW;AAC1B,QAAC,OAAuB,MAAM,YAAY;AAC1C,QAAC,OAAuB,MAAM,WAAW;AACzC,QAAC,OAAuB,MAAM,OAAO;AACrC,QAAC,OAAuB,MAAM,MAAM;AAAA,MACtC,CAAC;AAED,YAAM,oBAAoB,SAAS;AAAA,QACjC;AAAA,MACF;AACA,wBAAkB,QAAQ,CAAC,YAAY;AACrC,QAAC,QAAwB,MAAM,WAAW;AAC1C,QAAC,QAAwB,MAAM,OAAO;AACtC,QAAC,QAAwB,MAAM,MAAM;AACrC,QAAC,QAAwB,MAAM,YAAY;AAC3C,QAAC,QAAwB,MAAM,SAAS;AAAA,MAC1C,CAAC;AAID,WAAK,SAAS,KAAK;AACnB,WAAK,eAAe;AAEpB,WAAK,mBAAmB;AACxB,aAAO,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC;AAAA,IACpC,SAAS,OAAO;AACd,cAAQ,MAAM,mCAAU,KAAK;AAC7B,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGQ,kBAAkB,OAAY;AACpC,QAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,KAAK,KAAM;AAErC,UAAM,EAAE,UAAU,IAAI;AACtB,UAAM,aAAa,IAAI,KAAK,SAAS,EAAE,YAAY;AAEnD,YAAQ,MAAM,KAAK,MAAM;AAAA,MACvB,KAAK;AACH,cAAM,EAAE,QAAQ,KAAK,IAAI,MAAM;AAC/B,aAAK;AAAA,UACH,IAAI,UAAU,aAAa,MAAM,KAAK,KAAK,KAAK,IAAI,CAAC;AAAA,UACrD;AAAA,QACF;AAEA;AAAA,MACF,KAAK;AACH,cAAM,EAAE,IAAI,IAAI,MAAM;AACtB,aAAK,aAAa;AAClB,aAAK,aAAa,IAAI,UAAU,mBAAmB,GAAG,IAAI,YAAY;AACtE;AAAA,MACF,KAAK;AACH,cAAM,EAAE,MAAM,WAAW,SAAS,IAAI,MAAM;AAC5C,aAAK;AAAA,UACH,IAAI,UAAU,iBAAiB,SAAS,KAAK,IAAI,KAAK,QAAQ;AAAA,UAC9D;AAAA,QACF;AACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,aAAa,SAAiB,WAAmB;AACvD,QAAI,CAAC,KAAK,iBAAkB;AAE5B,UAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,aAAS,MAAM,UAAU;AACzB,aAAS,MAAM,eAAe;AAG9B,UAAM,SAAoC;AAAA,MACxC,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,aAAa;AAAA,IACf;AACA,aAAS,MAAM,QAAQ,OAAO,SAAS,KAAK;AAE5C,aAAS,YAAY;AACrB,SAAK,iBAAiB,YAAY,QAAQ;AAG1C,SAAK,iBAAiB,YAAY,KAAK,iBAAiB;AAGxD,eAAW,MAAM;AACf,eAAS,MAAM,aAAa;AAC5B,eAAS,MAAM,UAAU;AACzB,iBAAW,MAAM,SAAS,OAAO,GAAG,GAAI;AAAA,IAC1C,GAAG,GAAI;AAAA,EACT;AAAA,EACA,cAAc,MAAc;AAC1B,QAAI,KAAK,UAAU;AACjB,WAAK,SAAS,MAAM,IAAI;AACxB,WAAK,cAAc;AACnB,WAAK,eAAe;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,qBAAqB;AACnB,SAAK,gBAAgB,YAAY,MAAM;AACrC,WAAK,cAAc,KAAK,UAAU,eAAe,KAAK;AACtD,WAAK,aACH,OAAO,KAAK,UAAU,YAAY,GAAG,SAAS,IAAI,KAAK;AAAA,IAC3D,GAAG,EAAE;AAAA,EACP;AAAA,EACA,qBAAqB;AACnB,QAAI,KAAK,eAAe;AACtB,mBAAa,KAAK,aAAa;AAC/B,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AAAA;AAAA,EAGA,aAAa;AACX,SAAK,mBAAmB;AACxB,QAAI,KAAK,UAAU;AACjB,WAAK,SAAS,MAAM;AACpB,WAAK,eAAe;AACpB,WAAK,cAAc,KAAK,UAAU,eAAe,KAAK;AAAA,IACxD;AAAA,EACF;AAAA,EACA,gBAAgB;AACd,SAAK,mBAAmB;AACxB,QAAI,KAAK,UAAU;AACjB,YAAM,SAAS,KAAK,SAAS,eAAe;AAE5C,WAAK,SAAS,KAAK,MAAM;AACzB,WAAK,eAAe;AACpB,WAAK,cAAc,KAAK,UAAU,eAAe,KAAK;AAAA,IACxD;AAAA,EACF;AAAA,EACA,iBAAiB;AACf,QAAI,KAAK,UAAU;AACjB,aAAO,KAAK,SAAS,eAAe;AAAA,IACtC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB;AACd,SAAK,mBAAmB;AACxB,SAAK,eAAe;AACpB,SAAK,cAAc;AAEnB,QAAI,KAAK,UAAU;AACjB,WAAK,SAAS,MAAM;AACpB,WAAK,SAAS,QAAQ;AACtB,WAAK,WAAW;AAAA,IAClB;AACA,QAAI,KAAK,kBAAkB;AACzB,WAAK,iBAAiB,OAAO;AAC7B,WAAK,mBAAmB;AAAA,IAC1B;AAAA,EACF;AAAA,EACA,MAAM,mBAAmB;AACvB,QAAI;AACF,UAAI,CAAC,KAAK,QAAQ;AAChB,gBAAQ,KAAK,6BAA6B;AAC1C,eAAO,CAAC;AAAA,MACV;AACA,UAAI,CAAC,KAAK,MAAM;AACd,aAAK,QACH,MAAM,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,YAAY,KAAK,MAAM,CAAC,GAChE,KAAK;AACP,YAAI,CAAC,KAAK,MAAM;AACd,kBAAQ,KAAK,gBAAgB,KAAK,MAAM,kBAAkB;AAE1D,iBAAO,CAAC;AAAA,QACV;AAAA,MACF;AACA,cAAQ,IAAI,oBAAoB,KAAK,IAAI;AACzC,YAAM,aAAa,KAAK,KAAK,cAAc,CAAC;AAC5C,UAAI,WAAW,WAAW,GAAG;AAC3B,gBAAQ,KAAK,oCAAoC;AACjD,eAAO,CAAC;AAAA,MACV;AACA,YAAM,UAAU,WAAW,QAAQ,OAAO,cAAc;AACtD,cAAM,aAAa,MAAM;AAAA,UACvB,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,WAAW,SAAS;AAAA,QACjD;AACA,YAAI,CAAC,WAAW,OAAO,GAAG;AACxB,kBAAQ,KAAK,mBAAmB,SAAS,kBAAkB;AAC3D,iBAAO;AAAA,QACT;AACA,eAAO,WAAW,KAAK;AAAA,MACzB,CAAC;AACD,YAAM,kBAAsC,MAAM,QAAQ,IAAI,OAAO;AACrE,aAAO,gBAAgB,OAAO,CAAC,YAAY,YAAY,IAAI;AAAA,IAC7D,SAAS,GAAG;AACV,cAAQ,MAAM,+FAAoB,CAAC;AACnC,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,WAAmB,WAAmB,IAAI;AAC/D,QAAI;AACF,YAAM,IAAI;AAAA,QACR,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM,qBAAqB;AAAA,QACvD,MAAM,aAAa,MAAM,SAAS;AAAA,QAClC,MAAM,cAAc,MAAM,EAAE;AAAA,QAC5B,QAAQ,aAAa,MAAM;AAAA,QAC3B,MAAM,QAAQ;AAAA,MAChB;AACA,YAAM,aAAqD,CAAC;AAE5D,YAAM,gBAAgB,MAAM,QAAQ,CAAC;AACrC,YAAM,UAAU,cAAc,KAAK,IAAI,OAAO,SAAS;AACrD,cAAM,OAAO,KAAK,KAAK;AACvB,YAAI,CAAC,WAAW,KAAK,MAAM,GAAG;AAC5B,qBAAW,KAAK,MAAM,KACpB,MAAM,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,KAAK,MAAM,CAAC,GAC5D,KAAK;AAAA,QACT;AAEA,eAAO,EAAE,GAAG,MAAM,UAAU,WAAW,KAAK,MAAM,EAAE;AAAA,MACtD,CAAC;AACD,YAAM,WACJ,MAAM,QAAQ,IAAI,OAAO;AAC3B,cAAQ,IAAI,QAAQ;AACpB,WAAK,WAAW;AAChB,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,MAAM,yFAAmB,KAAK;AACtC,YAAM;AAAA,IACR;AAAA,EACF;AACF;;;AEzXA,SAAS,MAAM,cAAc;AAC7B,SAAS,cAAwB;AACjC;AAAA,EAEE,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AAAA,EAEA;AAAA,OACK;AAQP,SAAS,YAAY;AACrB,SAAS,eAAe,oBAAoB;AAE5C,IAAM,YAAY,aAAa,GAAG;AAElC,IAAM,mBAAmB,cAAc,WAAW,kBAAkB;AAC7D,IAAM,eAAN,MAAmB;AAAA,EACxB,YAAoB,OAAO;AAAA,EAC3B,iBAAsB;AAAA,EACtB,SAAwB;AAAA;AAAA,EACxB,KAAuB;AAAA,EACvB,SAAiB;AAAA,EACjB,WAAoC;AAAA,EACpC,YAA2B;AAAA,EAC3B,cAA8B;AAAA,EAC9B,iBAAgC;AAAA,EAChC,iBAAgC;AAAA;AAAA,EAChC,WAA8C,CAAC;AAAA,EAC/C,WAAgC,CAAC;AAAA,EAEjC,cAAc;AACZ,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,MAAM,KACJ,WACA,MAAwB,MACxB,SAAiB,IACjB;AACA,QAAI;AACF,UAAI,CAAC,WAAW;AACd,gBAAQ,MAAM,iCAAkB;AAChC;AAAA,MACF;AACA,WAAK,YAAY;AAEjB,WAAK,SAAS;AAEd,UAAI,CAAC,KAAK,MAAM,KAAK;AACnB,gBAAQ,MAAM,6EAAsB;AACpC,aAAK,KAAK;AAAA,MACZ;AACA,UAAI,CAAC,KAAK,IAAI;AACZ,gBAAQ,MAAM,6EAAsB;AACpC;AAAA,MACF;AAEA,UAAI,CAAC,KAAK,WAAW;AACnB,gBAAQ,MAAM,uEAAqB;AACnC;AAAA,MACF;AACA,YAAM,OAAO,MAAMC;AAAA,QACjBC,KAAIC,YAAW,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,GAAG,KAAK,SAAS;AAAA,MAClE;AACA,WAAK,cAAc,KAAK,KAAK;AAC7B,YAAM,cAAc,KAAK;AACzB,WAAK,iBAAiB,aAAa,kBAAkB;AAErD,UAAI,CAAC,KAAK,aAAa;AACrB,cAAMC;AAAA,UACJF,KAAIC,YAAW,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,GAAG,KAAK,SAAS;AAAA,UAChE;AAAA,YACE,IAAI,KAAK;AAAA,YACT,MAAM,KAAK;AAAA,YACX,gBAAgB;AAAA,YAChB,YAAY;AAAA;AAAA,YACZ,UAAU,oBAAI,KAAK;AAAA,YACnB,UAAU,oBAAI,KAAK;AAAA,YACnB,WAAW,KAAK;AAAA,YAChB,WAAW,KAAK;AAAA,UAClB;AAAA,UACA,EAAE,OAAO,KAAK;AAAA,QAChB;AAEA,gBAAQ,KAAK,gFAAe;AAC5B;AAAA,MACF;AACA,UAAI,CAAC,KAAK,aAAa,YAAY;AACjC,gBAAQ,KAAK,oKAA6B;AAC1C;AAAA,MACF;AAEA,YAAM,KAAK,4BAA4B;AAGvC;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,+FAAoB,KAAK;AACvC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,QACJ,SACA,UACA,WAAgC,CAAC,GACjC;AACA,QAAI,CAAC,KAAK,IAAI;AACZ,cAAQ,MAAM,6EAAsB;AACpC;AAAA,IACF;AACA,QAAI,CAAC,KAAK,aAAa;AACrB,cAAQ,MAAM,oHAAqB;AACnC;AAAA,IACF;AACA,SAAK,iBAAiB;AACtB,SAAK,WAAW;AAChB,SAAK,WAAW;AAEhB,QAAI,CAAC,SAAS;AACZ,cAAQ,MAAM,8BAAe;AAC7B;AAAA,IACF;AAEA,SAAK,SAAS,KAAK,YAAY,KAAK,MAAM,KAAK;AAC/C,SAAK,SAAS,KAAK;AACnB,SAAK,YAAY,KAAK;AACtB,UAAM,OAAO,MAAMF;AAAA,MACjBC,KAAIC,YAAW,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,GAAG,KAAK,MAAM;AAAA,IAC5D;AAEA,QAAI,CAAC,KAAK,IAAI;AACZ,cAAQ,MAAM,6EAAsB;AACpC;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,KAAK;AAE3B,QAAI,CAAC,UAAU,MAAM,CAAC,KAAK,OAAO,GAAG;AACnC,YAAMC;AAAA,QACJF;AAAA,UACEC,YAAW,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM;AAAA,UACxC,KAAK,YAAY,KAAK,MAAM,KAAK;AAAA,QACnC;AAAA,QACA;AAAA,UACE,GAAI,KAAK,YAAY,CAAC;AAAA,UACtB,UAAU,KAAK;AAAA,UACf,IAAI,KAAK;AAAA,UACT,gBAAgB,KAAK;AAAA,UACrB,MAAM;AAAA,UACN,gBAAgB,KAAK,aAAa,kBAAkB;AAAA,UACpD,YAAY,CAAC,KAAK,SAAS;AAAA,UAC3B,UAAU,oBAAI,KAAK;AAAA,UACnB,UAAU,oBAAI,KAAK;AAAA,UACnB,WAAW,KAAK;AAAA,UAChB,WAAW,KAAK;AAAA,UAChB,QAAQ;AAAA,UACR,UAAU;AAAA,QACZ;AAAA,QACA,EAAE,OAAO,KAAK;AAAA,MAChB;AACA,WAAK,WAAW;AAAA,QACd,GAAI,KAAK,YAAY,CAAC;AAAA,QACtB,UAAU,KAAK;AAAA,QACf,IAAI,KAAK;AAAA,QACT,gBAAgB,KAAK;AAAA,QACrB,MAAM;AAAA,QACN,gBAAgB,KAAK,aAAa,kBAAkB;AAAA,QACpD,YAAY,CAAC,KAAK,SAAS;AAAA,QAC3B,UAAU,oBAAI,KAAK;AAAA,QACnB,UAAU,oBAAI,KAAK;AAAA,QACnB,WAAW,KAAK;AAAA,QAChB,WAAW,KAAK;AAAA,QAChB,QAAQ;AAAA,QACR,UAAU;AAAA,MACZ;AAAA,IACF,OAAO;AACL,WAAK,WAAW,KAAK,KAAK;AAE1B,UAAI,CAAC,KAAK,UAAU,YAAY,SAAS,KAAK,aAAa,EAAE,GAAG;AAC9D,cAAMC;AAAA,UACJF;AAAA,YACEC,YAAW,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM;AAAA,YACxC,KAAK,YAAY,KAAK,MAAM,KAAK;AAAA,UACnC;AAAA,UACA;AAAA,YACE,YAAY,CAAC,GAAI,KAAK,UAAU,cAAc,CAAC,GAAI,KAAK,SAAS;AAAA,YACjE,UAAU,oBAAI,KAAK;AAAA,YACnB,WAAW,KAAK;AAAA,UAClB;AAAA,UACA,EAAE,OAAO,KAAK;AAAA,QAChB;AAAA,MACF;AAEA,UAAI,KAAK,UAAU,mBAAmB,KAAK,YAAY,gBAAgB;AACrE,cAAMC;AAAA,UACJF;AAAA,YACEC,YAAW,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM;AAAA,YACxC,KAAK,YAAY,KAAK,MAAM,KAAK;AAAA,UACnC;AAAA,UACA;AAAA,YACE,gBAAgB,KAAK,YAAY,iBAC7B,KAAK,YAAY,iBACjB,KAAK,UAAU;AAAA,YACnB,UAAU,oBAAI,KAAK;AAAA,YACnB,WAAW,KAAK;AAAA,UAClB;AAAA,UACA,EAAE,OAAO,KAAK;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AACA,UAAM,yBAAyBD;AAAA,MAC7BC,YAAW,KAAK,IAAI,GAAG,KAAK,MAAM,qBAAqB;AAAA,MACvD,KAAK;AAAA,IACP;AACA,UAAMC;AAAA,MACJ;AAAA,MACA;AAAA,QACE,QAAQ,KAAK,YAAY,KAAK,MAAM,KAAK;AAAA,QACzC,gBAAgB,KAAK;AAAA,QACrB,UAAU,KAAK,SAAS,QAAQ;AAAA,QAChC,WAAW,KAAK,SAAS,SAAS;AAAA,QAClC,UAAU,KAAK;AAAA,QACf,WAAW,KAAK;AAAA,MAClB;AAAA,MACA,EAAE,OAAO,KAAK;AAAA,IAChB;AACA;AAAA,EACF;AAAA;AAAA,EAGA,wBAAwB;AACtB,QAAI;AACF,YAAM,kBAAkB,EAAE,GAAG,QAAQ;AACrC,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,qBAAe,QAAQ,CAAC,WAAW;AAEjC,QAAC,QAAgB,MAAM,IAAI,IAAI,SAAgB;AAE7C,UAAC,gBAAwB,MAAM,EAAE,GAAG,IAAI;AAExC,iBAAO,eAAe,WAAW,EAAE,QAAQ,KAAK,CAAC;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,MAAM,iEAAe,KAAK;AAClC,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,yBAAyB;AACvB,QAAI;AACF,YAAM,SAAS,KAAK,UAAU;AAC9B,YAAM,YAAY,KAAK;AACvB,YAAMC,MAAK,KAAK;AAChB,YAAM,SAAS,KAAK;AAEpB,aAAO,iBAAiB,YAAY,CAAC,UAAU;AAC7C,YAAI,CAACA,KAAI;AACP,kBAAQ,MAAM,6EAAsB;AACpC;AAAA,QACF;AAEA,eAAO,eAAe,cAAc;AAAA,UAClC,KAAK,OAAO,SAAS;AAAA,UACrB,OAAO,MAAM;AAAA,QACf,CAAC;AAAA,MACH,CAAC;AAGD,UAAI,OAAO,aAAa;AACtB,cAAM,WAAW,IAAI,oBAAoB,CAAC,SAAS;AACjD,qBAAW,SAAS,KAAK,WAAW,GAAG;AACrC,gBAAI,MAAM,cAAc,YAAY;AAClC,oBAAM,gBAAgB;AACtB,qBAAO,eAAe,oBAAoB;AAAA,gBACxC,MAAM,cAAc;AAAA,gBACpB,WAAW,cAAc;AAAA,gBACzB,eAAe,cAAc;AAAA;AAAA,gBAC7B,iBAAiB,cAAc;AAAA,gBAC/B,iBAAiB,cAAc;AAAA,gBAC/B,iBAAiB,cAAc;AAAA,gBAC/B,cAAc,cAAc;AAAA,gBAC5B,UAAU,cAAc;AAAA,gBACxB,WAAW,cAAc;AAAA,gBACzB,YAAY,cAAc;AAAA,gBAC1B,mBAAmB,cAAc;AAAA,gBACjC,iBAAiB,cAAc;AAAA,gBAC/B,cAAc,cAAc;AAAA,gBAC5B,YAAY,cAAc;AAAA,gBAC1B,uBAAuB,cAAc;AAAA,gBACrC,cAAc,cAAc;AAAA,gBAC5B,eAAe,cAAc;AAAA,gBAC7B,aAAa,cAAc;AAAA,gBAC3B,aAAa,cAAc;AAAA,gBAC3B,eAAe,cAAc;AAAA,gBAC7B,aAAa,cAAc;AAAA;AAAA,gBAE3B,gBACG,cAAsB,kBAAkB;AAAA,gBAC3C,cAAc,cAAc;AAAA,cAC9B,CAAC;AAAA,YACH,OAAO;AACL,qBAAO,eAAe,eAAe;AAAA,gBACnC,MAAM,MAAM;AAAA,gBACZ,WAAW,MAAM;AAAA,gBACjB,WAAW,MAAM;AAAA,gBACjB,UAAU,MAAM;AAAA,cAClB,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF,CAAC;AAED,iBAAS,QAAQ,EAAE,YAAY,CAAC,YAAY,cAAc,OAAO,EAAE,CAAC;AAAA,MACtE;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,uEAAgB,KAAK;AACnC,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,wBAAwB;AACtB,QAAI;AAEF,YAAM,gBAAgB,OAAO;AAC7B,aAAO,QAAQ,IAAI,SAAmC;AACpD,cAAM,YAAY,KAAK,IAAI;AAC3B,YAAI,QAAQ,KAAK,CAAC;AAClB,YAAI,OAAO,KAAK,CAAC;AAEjB,YAAI;AACJ,YAAI,SAAiB;AACrB,YAAI;AAEJ,YAAI,iBAAiB,SAAS;AAC5B,mBAAS,MAAM;AACf,mBAAS,MAAM;AACf,wBAAc,MAAM;AAAA,QACtB,OAAO;AACL,mBAAS,iBAAiB,MAAM,MAAM,OAAO,MAAM,SAAS;AAC5D,mBAAS,MAAM,UAAU;AACzB,wBAAc,MAAM;AAAA,QACtB;AAGA,eAAO,eAAe,mBAAmB;AAAA,UACvC,MAAM;AAAA,UACN;AAAA,UACA,KAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA,QAAQ;AAAA;AAAA,QACV,CAAC;AAED,eAAO,cAAc,GAAG,IAAI,EACzB,KAAK,CAAC,aAAa;AAClB,gBAAM,UAAU,KAAK,IAAI;AACzB,gBAAM,WAAW,UAAU;AAG3B,gBAAM,iBAAiB,SAAS,MAAM;AACtC,yBACG,KAAK,EACL,KAAK,CAAC,iBAAiB;AACtB,mBAAO,eAAe,oBAAoB;AAAA,cACxC,MAAM;AAAA,cACN,KAAK;AAAA,cACL,QAAQ,SAAS;AAAA,cACjB,YAAY,SAAS;AAAA,cACrB;AAAA,cACA;AAAA,cACA;AAAA,YACF,CAAC;AAAA,UACH,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,oBAAQ;AAAA,cACN;AAAA,cACA;AAAA,YACF;AAAA,UACF,CAAC;AAEH,iBAAO;AAAA,QACT,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,gBAAM,UAAU,KAAK,IAAI;AACzB,gBAAM,WAAW,UAAU;AAE3B,iBAAO,eAAe,iBAAiB;AAAA,YACrC,MAAM;AAAA,YACN,KAAK;AAAA,YACL,OAAO,MAAM;AAAA,YACb;AAAA,YACA;AAAA,UACF,CAAC;AAED,gBAAM;AAAA,QACR,CAAC;AAAA,MACL;AAGA,YAAM,yBAAyB,OAAO;AAAA,MACtC,MAAM,6BAA6B,uBAAuB;AAAA,QAChD;AAAA,QACA;AAAA,QACA;AAAA,QAER,OAAgB,SAAS;AAAA,QACzB,OAAgB,SAAS;AAAA,QACzB,OAAgB,mBAAmB;AAAA,QACnC,OAAgB,UAAU;AAAA,QAC1B,OAAgB,OAAO;AAAA,QAEvB,KACE,QACA,KACA,QAAQ,MACR,WAA0B,MAC1B,WAA0B,MAC1B;AACA,eAAK,UAAU;AACf,eAAK,OAAO,IAAI,SAAS;AACzB,eAAK,aAAa,KAAK,IAAI;AAE3B,iBAAO,eAAe,mBAAmB;AAAA,YACvC,MAAM;AAAA,YACN;AAAA,YACA,KAAK,KAAK;AAAA,YACV,WAAW,KAAK;AAAA,YAChB,QAAQ;AAAA;AAAA,UACV,CAAC;AACD,iBAAO,MAAM,KAAK,QAAQ,KAAK,OAAO,UAAU,QAAQ;AAAA,QAC1D;AAAA,QAEA,KAAK,MAAY;AACf,eAAK,iBAAiB,QAAQ,MAAM;AAClC,kBAAM,UAAU,KAAK,IAAI;AACzB,kBAAM,WAAW,WAAW,KAAK,cAAc;AAE/C,mBAAO,eAAe,oBAAoB;AAAA,cACxC,MAAM;AAAA,cACN,KAAK,KAAK;AAAA,cACV,QAAQ,KAAK;AAAA,cACb,YAAY,KAAK;AAAA,cACjB,cAAc,KAAK;AAAA,cACnB;AAAA,cACA;AAAA,YACF,CAAC;AAAA,UACH,CAAC;AAED,eAAK,iBAAiB,SAAS,MAAM;AACnC,kBAAM,UAAU,KAAK,IAAI;AACzB,kBAAM,WAAW,WAAW,KAAK,cAAc;AAE/C,mBAAO,eAAe,iBAAiB;AAAA,cACrC,MAAM;AAAA,cACN,KAAK,KAAK;AAAA,cACV,OAAO;AAAA,cACP;AAAA,cACA;AAAA,YACF,CAAC;AAAA,UACH,CAAC;AAED,iBAAO,MAAM,KAAK,IAAI;AAAA,QACxB;AAAA,MACF;AACA,aAAO,iBAAiB;AAGxB,YAAM,oBAAoB,OAAO;AACjC,aAAO,YAAY,MAAM,wBAAwB,kBAAkB;AAAA,QACjE,YAAY,KAAmB,WAA+B;AAC5D,gBAAM,KAAK,SAAS;AACpB,gBAAM,QAAQ,IAAI,SAAS;AAC3B,iBAAO,eAAe,0BAA0B;AAAA,YAC9C,MAAM;AAAA,YACN,KAAK;AAAA,YACL,WAAW,KAAK,IAAI;AAAA,UACtB,CAAC;AAED,eAAK,iBAAiB,WAAW,CAAC,UAAU;AAC1C,mBAAO,eAAe,6BAA6B;AAAA,cACjD,MAAM;AAAA,cACN,KAAK;AAAA,cACL,MAAM,MAAM;AAAA,cACZ,MAAM,KAAK,IAAI;AAAA,YACjB,CAAC;AAAA,UACH,CAAC;AAED,eAAK,iBAAiB,SAAS,CAAC,UAAU;AACxC,mBAAO,eAAe,2BAA2B;AAAA,cAC/C,MAAM;AAAA,cACN,KAAK;AAAA,cACL,MAAM,MAAM;AAAA,cACZ,QAAQ,MAAM;AAAA,cACd,SAAS,KAAK,IAAI;AAAA,YACpB,CAAC;AAAA,UACH,CAAC;AAED,eAAK,iBAAiB,SAAS,CAAC,UAAU;AACxC,mBAAO,eAAe,2BAA2B;AAAA,cAC/C,MAAM;AAAA,cACN,KAAK;AAAA,cACL,OAAO;AAAA,cACP,MAAM,KAAK,IAAI;AAAA,YACjB,CAAC;AAAA,UACH,CAAC;AAAA,QACH;AAAA,QAEA,KAAK,MAAW;AACd,iBAAO,eAAe,0BAA0B;AAAA,YAC9C,MAAM;AAAA,YACN,KAAK,KAAK;AAAA,YACV;AAAA,YACA,MAAM,KAAK,IAAI;AAAA,UACjB,CAAC;AACD,iBAAO,MAAM,KAAK,IAAI;AAAA,QACxB;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,uEAAgB,KAAK;AACnC,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,8BAA8B;AAClC,QAAI;AACF,UAAI,KAAK,eAAgB;AAEzB,YAAM,aAAa,KAAK;AACxB,YAAM,SAAS,KAAK,UAAU;AAC9B,YAAM,iBAAiB,KAAK,kBAAkB;AAC9C,YAAM,MAAM,KAAK;AACjB,YAAM,SAAS,KAAK;AACpB,UAAI,eAAyB,CAAC;AAC9B,UAAI,WAAU,oBAAI,KAAK,GAAE,QAAQ;AACjC,UAAI,CAAC,KAAK,MAAM,CAAC,KAAK;AACpB,gBAAQ,MAAM,6EAAsB;AACpC;AAAA,MACF;AAGA,YAAM,yBAAyBH;AAAA,QAC7BC,YAAW,KAAK,IAAI,GAAG,MAAM,qBAAqB;AAAA,QAClD;AAAA,MACF;AACA,YAAMC,QAAO,wBAAwB;AAAA,QACnC,IAAI;AAAA,QACJ,WAAW,oBAAI,KAAK;AAAA,QACpB,SAAS,oBAAI,KAAK;AAAA,QAClB,YAAY;AAAA;AAAA,QACZ;AAAA,QACA,WAAW,KAAK,aAAa;AAAA,QAC7B,gBAAgB,KAAK,aAAa,kBAAkB;AAAA,QACpD,UAAU,oBAAI,KAAK;AAAA,QACnB,UAAU,oBAAI,KAAK;AAAA,QACnB,WAAW;AAAA,QACX,WAAW;AAAA,MACb,CAAC;AACD,UAAI;AACF,gBAAQ,IAAI,0EAA6B,KAAK,SAAS;AACvD,cAAM,iBAAiB,EAAE,WAAW,KAAK,UAAU,CAAC;AAAA,MACtD,SAAS,OAAO;AACd,gBAAQ,MAAM,iFAA+B,KAAK;AAAA,MACpD;AACA,YAAM,SAASF;AAAA,QACbC,YAAW,KAAK,IAAI,qBAAqB;AAAA,QACzC,KAAK;AAAA,MACP;AACA,YAAMF,QAAO,MAAM,EAChB,KAAK,OAAOC,SAAQ;AACnB,YAAIA,KAAI,OAAO,GAAG;AAChB,gBAAM,OAAOA,KAAI,KAAK;AACtB,gBAAM,YAAY,MAAM,aAAa;AACrC,gBAAM,YAAY,MAAM,eAAe,SAAS;AAChD,kBAAQ,IAAI,aAAa,SAAS;AAClC,gBAAM,UAAU,QAAQ,EAAE,OAAO,UAAU,CAAC;AAAA,QAC9C;AAAA,MACF,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,gBAAQ,MAAM,mEAAiB,KAAK;AAAA,MACtC,CAAC;AAEH,WAAK,iBAAiB,OAAO;AAAA,QAC3B,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,cAAc;AAAA,QACd,UAAU;AAAA,UACR,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,mBAAmB;AAAA,QACrB;AAAA,QAEA,MAAM,OAAO,UAAU;AACrB,cAAI;AACF,kBAAM,YAAW,oBAAI,KAAK,GAAE,QAAQ,IAAI;AACxC,yBAAa,KAAK,KAAK,UAAU,KAAK,CAAC;AACvC,gBACE,aAAa,UAAU,OACtB,YAAY,OAAQ,aAAa,SAAS,GAC3C;AACA,yBAAU,oBAAI,KAAK,GAAE,QAAQ;AAC7B,oBAAMI,UAAuB;AAAA,gBAC3B,IAAI;AAAA,gBACJ,WAAW,oBAAI,KAAK;AAAA,gBACpB;AAAA,gBACA;AAAA,gBACA,MAAM;AAAA,gBACN,WAAW;AAAA,gBACX;AAAA,gBACA,UAAU,oBAAI,KAAK;AAAA,gBACnB,UAAU,oBAAI,KAAK;AAAA,gBACnB,QAAQ;AAAA,gBACR,WAAW;AAAA,gBACX,WAAW;AAAA,gBACX,UAAU;AAAA,cACZ;AACA,6BAAe,CAAC;AAChB,oBAAM,YAAYJ,KAAIC,YAAW,KAAK,GAAG,MAAM,cAAc,CAAC;AAC9D,cAAAG,QAAO,KAAK,UAAU;AAEtB,oBAAMF,QAAO,WAAWE,OAAM;AAAA,YAEhC;AAAA,UACF,SAAS,OAAO;AACd,oBAAQ,MAAM,gEAAmB,KAAK;AACtC,kBAAM;AAAA,UACR;AAAA,QACF;AAAA,QACA,cAAc;AAAA,MAChB,CAAC;AACD,WAAK,sBAAsB;AAC3B,WAAK,uBAAuB;AAC5B,WAAK,sBAAsB;AAAA,IAC7B,SAAS,OAAO;AACd,cAAQ,MAAM,wCAAe,KAAK;AAClC,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,6BAA6B;AAC3B,QAAI;AACF,UAAI,KAAK,gBAAgB;AACvB,aAAK,eAAe;AACpB,aAAK,iBAAiB;AAAA,MACxB;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,oDAAiB,KAAK;AACpC,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,MAAM,4BAA4B;AAChC,QAAI;AACF,UAAI,CAAC,KAAK,MAAM,CAAC,KAAK,aAAa,CAAC,KAAK,QAAQ;AAC/C,gBAAQ;AAAA,UACN;AAAA,QACF;AACA;AAAA,MACF;AACA,YAAM,yBAAyBJ;AAAA,QAC7BC,YAAW,KAAK,IAAI,GAAG,KAAK,MAAM,qBAAqB;AAAA,QACvD,KAAK;AAAA,MACP;AACA,YAAMC;AAAA,QACJ;AAAA,QACA;AAAA,UACE,SAAS,oBAAI,KAAK;AAAA,UAClB,UAAU,oBAAI,KAAK;AAAA,UACnB,WAAW,KAAK;AAAA,QAClB;AAAA,QACA,EAAE,OAAO,KAAK;AAAA,MAChB,EAAE,MAAM,CAAC,UAAU;AACjB,gBAAQ,MAAM,wCAAwC,KAAK;AAAA,MAC7D,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,MAAM,sDAA6B,KAAK;AAChD,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAEO,IAAM,aAAa,IAAI,aAAa;AAE3C,IAAM,iBAAiB,OAAO,OAAe;AAC3C,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,oBAAoB,EAAE,QAAQ;AAC3D,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,iDAAc,SAAS,UAAU,EAAE;AAAA,IACrD;AACA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU,KAAK;AAAA,MACf,WAAW,KAAK;AAAA,IAClB;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,iDAAc,KAAK;AACjC,WAAO;AAAA,EACT;AACF;","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
@@ -39,5 +39,5 @@
39
39
  },
40
40
  "type": "commonjs",
41
41
  "types": "./dist/index.d.ts",
42
- "version": "1.0.81"
42
+ "version": "1.0.83"
43
43
  }