action-lens 1.0.72 → 1.0.74
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.d.mts +3 -14
- package/dist/index.d.ts +3 -14
- package/dist/index.js +2 -81
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -78
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as _ism_tech_actionlens_type_src_DefaultType from '@ism-tech/actionlens-type/src/DefaultType';
|
|
2
|
-
import { Firestore
|
|
2
|
+
import { Firestore } from 'firebase/firestore';
|
|
3
3
|
import { User, Project } from '@ism-tech/actionlens-type';
|
|
4
4
|
import { Replayer } from 'rrweb';
|
|
5
5
|
|
|
@@ -40,6 +40,7 @@ declare class ActionLensPlayer {
|
|
|
40
40
|
originalUserId: string;
|
|
41
41
|
projectId?: string;
|
|
42
42
|
organizationId?: string;
|
|
43
|
+
recordTime: number;
|
|
43
44
|
} & _ism_tech_actionlens_type_src_DefaultType.DefaultType & {
|
|
44
45
|
userData: User<"customer">;
|
|
45
46
|
})[]>;
|
|
@@ -75,16 +76,4 @@ declare class ActionLensRc {
|
|
|
75
76
|
}
|
|
76
77
|
declare const ActionLens: ActionLensRc;
|
|
77
78
|
|
|
78
|
-
|
|
79
|
-
declare function convertTimestampToDate(timestamp: Timestamp | Date | null): Date | null;
|
|
80
|
-
/**
|
|
81
|
-
* 時間を文字に変換
|
|
82
|
-
* @param payload Date | Timestamp | string | null
|
|
83
|
-
* @param format YYYY/MM/DD hh:mm:ss
|
|
84
|
-
*/
|
|
85
|
-
declare const dateFormat: (payload: Date | Timestamp | string | number | null | undefined | {
|
|
86
|
-
_seconds: number;
|
|
87
|
-
_nanoseconds: number;
|
|
88
|
-
}, format?: string) => string;
|
|
89
|
-
|
|
90
|
-
export { ActionLens, ActionLensPlayer, ActionLensRc, convertTimestampToDate, dateFormat };
|
|
79
|
+
export { ActionLens, ActionLensPlayer, ActionLensRc };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as _ism_tech_actionlens_type_src_DefaultType from '@ism-tech/actionlens-type/src/DefaultType';
|
|
2
|
-
import { Firestore
|
|
2
|
+
import { Firestore } from 'firebase/firestore';
|
|
3
3
|
import { User, Project } from '@ism-tech/actionlens-type';
|
|
4
4
|
import { Replayer } from 'rrweb';
|
|
5
5
|
|
|
@@ -40,6 +40,7 @@ declare class ActionLensPlayer {
|
|
|
40
40
|
originalUserId: string;
|
|
41
41
|
projectId?: string;
|
|
42
42
|
organizationId?: string;
|
|
43
|
+
recordTime: number;
|
|
43
44
|
} & _ism_tech_actionlens_type_src_DefaultType.DefaultType & {
|
|
44
45
|
userData: User<"customer">;
|
|
45
46
|
})[]>;
|
|
@@ -75,16 +76,4 @@ declare class ActionLensRc {
|
|
|
75
76
|
}
|
|
76
77
|
declare const ActionLens: ActionLensRc;
|
|
77
78
|
|
|
78
|
-
|
|
79
|
-
declare function convertTimestampToDate(timestamp: Timestamp | Date | null): Date | null;
|
|
80
|
-
/**
|
|
81
|
-
* 時間を文字に変換
|
|
82
|
-
* @param payload Date | Timestamp | string | null
|
|
83
|
-
* @param format YYYY/MM/DD hh:mm:ss
|
|
84
|
-
*/
|
|
85
|
-
declare const dateFormat: (payload: Date | Timestamp | string | number | null | undefined | {
|
|
86
|
-
_seconds: number;
|
|
87
|
-
_nanoseconds: number;
|
|
88
|
-
}, format?: string) => string;
|
|
89
|
-
|
|
90
|
-
export { ActionLens, ActionLensPlayer, ActionLensRc, convertTimestampToDate, dateFormat };
|
|
79
|
+
export { ActionLens, ActionLensPlayer, ActionLensRc };
|
package/dist/index.js
CHANGED
|
@@ -22,9 +22,7 @@ var index_exports = {};
|
|
|
22
22
|
__export(index_exports, {
|
|
23
23
|
ActionLens: () => ActionLens,
|
|
24
24
|
ActionLensPlayer: () => ActionLensPlayer,
|
|
25
|
-
ActionLensRc: () => ActionLensRc
|
|
26
|
-
convertTimestampToDate: () => convertTimestampToDate,
|
|
27
|
-
dateFormat: () => dateFormat
|
|
25
|
+
ActionLensRc: () => ActionLensRc
|
|
28
26
|
});
|
|
29
27
|
module.exports = __toCommonJS(index_exports);
|
|
30
28
|
|
|
@@ -354,7 +352,6 @@ var ActionLensRc = class {
|
|
|
354
352
|
}
|
|
355
353
|
async init(projectId, _db = null, prefix = "") {
|
|
356
354
|
try {
|
|
357
|
-
console.log("ActionLensRc\u958B\u59CB");
|
|
358
355
|
if (!projectId) {
|
|
359
356
|
console.error("projectId\u304CNULL\u3067\u3059");
|
|
360
357
|
return;
|
|
@@ -609,7 +606,6 @@ var ActionLensRc = class {
|
|
|
609
606
|
createdBy: userId,
|
|
610
607
|
updatedBy: userId
|
|
611
608
|
});
|
|
612
|
-
const _updateActionRecordSession = async () => await this.updateActionRecordSession();
|
|
613
609
|
this.stopFnForStore = (0, import_rrweb2.record)({
|
|
614
610
|
packFn: import_packer2.pack,
|
|
615
611
|
collectFonts: true,
|
|
@@ -638,7 +634,6 @@ var ActionLensRc = class {
|
|
|
638
634
|
hiddenBy: ""
|
|
639
635
|
};
|
|
640
636
|
await (0, import_firestore3.setDoc)(newDocRef, record2);
|
|
641
|
-
await _updateActionRecordSession();
|
|
642
637
|
} catch (error) {
|
|
643
638
|
console.error("rrweb\u30A4\u30D9\u30F3\u30C8\u4FDD\u5B58\u30A8\u30E9\u30FC:", error);
|
|
644
639
|
throw error;
|
|
@@ -693,84 +688,10 @@ var ActionLensRc = class {
|
|
|
693
688
|
}
|
|
694
689
|
};
|
|
695
690
|
var ActionLens = new ActionLensRc();
|
|
696
|
-
|
|
697
|
-
// src/utils/date.ts
|
|
698
|
-
var import_firestore4 = require("firebase/firestore");
|
|
699
|
-
function convertTimestampToDate(timestamp) {
|
|
700
|
-
if (!timestamp) return null;
|
|
701
|
-
if (typeof timestamp === "string") {
|
|
702
|
-
const _string = new Date(timestamp);
|
|
703
|
-
if (isNaN(_string.getTime())) {
|
|
704
|
-
return null;
|
|
705
|
-
}
|
|
706
|
-
return _string;
|
|
707
|
-
}
|
|
708
|
-
if ("_seconds" in timestamp && timestamp?._seconds) {
|
|
709
|
-
return new Date(Number(timestamp._seconds) * 1e3);
|
|
710
|
-
}
|
|
711
|
-
if (timestamp instanceof import_firestore4.Timestamp) {
|
|
712
|
-
const _timestamp = timestamp.toDate();
|
|
713
|
-
return _timestamp;
|
|
714
|
-
}
|
|
715
|
-
if (timestamp instanceof Date) {
|
|
716
|
-
const _date = timestamp;
|
|
717
|
-
return _date;
|
|
718
|
-
}
|
|
719
|
-
return timestamp;
|
|
720
|
-
}
|
|
721
|
-
var dateFormat = (payload, format = "YYYY/MM/DD") => {
|
|
722
|
-
let date = payload;
|
|
723
|
-
if (!date) return "";
|
|
724
|
-
if (typeof date === "string") {
|
|
725
|
-
if (date.length === 8 && /^\d{8}$/.test(date)) {
|
|
726
|
-
const strYear = Number(date.slice(0, 4));
|
|
727
|
-
const strMonth = Number(date.slice(4, 6)) - 1;
|
|
728
|
-
const strDate = Number(date.slice(6, 8));
|
|
729
|
-
date = new Date(strYear, strMonth, strDate);
|
|
730
|
-
} else if (!/^(\d{4}).([0-1]\d).([0-3]\d).*$/.test(date)) {
|
|
731
|
-
return "error";
|
|
732
|
-
} else {
|
|
733
|
-
const strYear = Number(date.slice(0, 4));
|
|
734
|
-
const strMonth = Number(date.slice(5, 7)) - 1;
|
|
735
|
-
const strDate = Number(date.slice(8, 10));
|
|
736
|
-
date = new Date(strYear, strMonth, strDate);
|
|
737
|
-
}
|
|
738
|
-
}
|
|
739
|
-
if (typeof date === "number") {
|
|
740
|
-
date = new Date(date);
|
|
741
|
-
}
|
|
742
|
-
if (isTimestamp(date)) {
|
|
743
|
-
date = date.toDate();
|
|
744
|
-
}
|
|
745
|
-
if (date.hasOwnProperty("_seconds") && date.hasOwnProperty("_nanoseconds")) {
|
|
746
|
-
date = new Date(
|
|
747
|
-
// @ts-ignore
|
|
748
|
-
date._seconds * 1e3 + Math.floor(date._nanoseconds / 1e6)
|
|
749
|
-
);
|
|
750
|
-
}
|
|
751
|
-
date = new Date(date);
|
|
752
|
-
format = format.replace(/YYYY/g, date.getFullYear().toString());
|
|
753
|
-
format = format.replace(/MM/g, ("0" + (date.getMonth() + 1)).slice(-2));
|
|
754
|
-
format = format.replace(/DD/g, ("0" + date.getDate()).slice(-2));
|
|
755
|
-
format = format.replace(/hh/g, ("0" + date.getHours()).slice(-2));
|
|
756
|
-
format = format.replace(/mm/g, ("0" + date.getMinutes()).slice(-2));
|
|
757
|
-
format = format.replace(/ss/g, ("0" + date.getSeconds()).slice(-2));
|
|
758
|
-
format = format.replace(/SSS/g, ("00" + date.getMilliseconds()).slice(-3));
|
|
759
|
-
format = format.replace(
|
|
760
|
-
/aaa/g,
|
|
761
|
-
["\u65E5", "\u6708", "\u706B", "\u6C34", "\u6728", "\u91D1", "\u571F"][date.getDay()]
|
|
762
|
-
);
|
|
763
|
-
return format;
|
|
764
|
-
};
|
|
765
|
-
var isTimestamp = (payload) => {
|
|
766
|
-
return payload.toDate !== void 0;
|
|
767
|
-
};
|
|
768
691
|
// Annotate the CommonJS export names for ESM import in node:
|
|
769
692
|
0 && (module.exports = {
|
|
770
693
|
ActionLens,
|
|
771
694
|
ActionLensPlayer,
|
|
772
|
-
ActionLensRc
|
|
773
|
-
convertTimestampToDate,
|
|
774
|
-
dateFormat
|
|
695
|
+
ActionLensRc
|
|
775
696
|
});
|
|
776
697
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/player.ts","../src/utils/index.ts","../src/record.ts","../src/utils/date.ts"],"sourcesContent":["export * from \"./player\";\nexport * from \"./record\";\nimport \"./style.css\";\nexport * from \"./utils/date\";\n","import {\n doc,\n collection,\n setDoc,\n addDoc,\n where,\n query,\n getDocs,\n orderBy,\n Firestore,\n getDoc,\n limit,\n} from \"firebase/firestore\";\nimport {\n ActionRecord,\n ActionRecordSession,\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\";\nexport class ActionLensPlayer {\n replayer: Replayer | null = null;\n overlayContainer: HTMLElement | null = null;\n playerStatus: \"playing\" | \"paused\" | \"stopped\" = \"stopped\";\n targetDivId: string;\n db: Firestore;\n prefix: string;\n userId: string | null = null;\n projectId: string | null = null;\n currentTime: number = 0; // 現在の再生時間\n totalTime: number = 0; // 再生中の時間を保持するための変数\n user: User<\"operator\"> | null = null; // ユーザーデータを保持するための変数\n private setIntervalId: NodeJS.Timeout | null = null; // setTimeoutのIDを保持するための変数\n\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}user`, userId));\n if (!user.exists()) {\n throw new Error(`User with ID ${userId} does not exist.`);\n }\n const userData = user.data() as User<\"operator\">;\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.map((doc) => {\n const data = doc.data() as ActionRecord;\n return JSON.parse(data.rrwebRecord);\n });\n console.log(\"events\", events);\n if (events.length === 0) {\n console.warn(\n `セッションID ${sessionId} のデータが見つかりませんでした。`\n );\n return [];\n }\n\n const targetDiv = document.getElementById(this.targetDivId);\n if (!targetDiv) {\n throw new Error(\n `ID ${this.targetDivId} のdiv要素が見つかりませんでした。`\n );\n }\n\n // クラスを追加\n targetDiv.classList.add(\"replayer-container\");\n\n // 3. Replayerを初期化\n this.replayer = new Replayer(events, {\n 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 // 4. カスタムイベントのリスナーを追加\n this.replayer.on(\"custom-event\", (event: any) => {\n console.log(\"Custom event:\", event);\n this.handleCustomEvent(event);\n });\n this.replayer.on(\"finish\", () => {\n console.log(\"Replay finished\");\n this.replayer?.pause(0);\n this.playerStatus = \"stopped\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n this.endTimeoutTimeline();\n });\n const { totalTime } = this.replayer.getMetaData();\n this.totalTime = totalTime;\n\n // iframeのスタイルを調整\n const iframes = targetDiv.querySelectorAll(\"iframe\");\n iframes.forEach((iframe) => {\n (iframe as HTMLElement).style.transform = \"translate(-50%, -50%)\";\n (iframe as HTMLElement).style.position = \"absolute\";\n (iframe as HTMLElement).style.left = \"50%\";\n (iframe as HTMLElement).style.top = \"50%\";\n });\n // replayer-mouse-tailにposition: absolute; を追加\n const mouseTailElements = document.querySelectorAll(\n \".replayer-mouse-tail\"\n );\n mouseTailElements.forEach((element) => {\n (element as HTMLElement).style.position = \"absolute\";\n (element as HTMLElement).style.left = \"50%\";\n (element as HTMLElement).style.top = \"50%\";\n (element as HTMLElement).style.transform = \"translate(-50%, -50%)\";\n (element as HTMLElement).style.zIndex = \"1000\"; // z-indexを追加\n });\n\n // 5. 再生開始\n\n this.replayer.play();\n this.playerStatus = \"playing\";\n\n console.log(`セッションID ${sessionId} の再生を開始しました。`);\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.displayEvent(`[${timeString}] Navigation to ${url}`, \"navigation\");\n break;\n case \"performance\":\n const { name, entryType, duration } = event.data;\n this.displayEvent(\n `[${timeString}] Performance ${entryType}: ${name} (${duration}ms)`,\n \"performance\"\n );\n break;\n default:\n console.warn(\"不明なカスタムイベント:\", event.data.type);\n }\n }\n\n // イベントをオーバーレイに表示\n private displayEvent(message: string, eventType: string) {\n if (!this.overlayContainer) return;\n\n const eventDiv = document.createElement(\"div\");\n eventDiv.style.padding = \"5px\";\n eventDiv.style.borderBottom = \"1px solid rgba(255, 255, 255, 0.2)\";\n\n // イベントタイプに応じた色\n const colors: { [key: string]: string } = {\n console: \"#00cc00\",\n navigation: \"#3399ff\",\n performance: \"#ff9900\",\n };\n eventDiv.style.color = colors[eventType] || \"white\";\n\n eventDiv.innerText = message;\n this.overlayContainer.appendChild(eventDiv);\n\n // 最新のイベントが表示されるようスクロール\n this.overlayContainer.scrollTop = this.overlayContainer.scrollHeight;\n\n // 5秒後にフェードアウト\n setTimeout(() => {\n eventDiv.style.transition = \"opacity 1s\";\n eventDiv.style.opacity = \"0\";\n setTimeout(() => eventDiv.remove(), 1000);\n }, 5000);\n }\n setReplayTime(time: number) {\n if (this.replayer) {\n this.replayer.pause(time);\n this.currentTime = time;\n this.playerStatus = \"stopped\";\n }\n }\n\n setTimeoutTimeline() {\n this.setIntervalId = setInterval(() => {\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }, 10);\n }\n endTimeoutTimeline() {\n if (this.setIntervalId) {\n clearTimeout(this.setIntervalId);\n this.setIntervalId = null;\n }\n }\n\n // 再生を停止\n stopReplay() {\n this.endTimeoutTimeline();\n if (this.replayer) {\n this.replayer.pause();\n this.playerStatus = \"stopped\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }\n }\n restartReplay() {\n this.setTimeoutTimeline();\n if (this.replayer) {\n const offset = this.replayer.getCurrentTime();\n console.log(\"offset\", offset);\n this.replayer.play(offset);\n this.playerStatus = \"playing\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }\n }\n getCurrentTime() {\n if (this.replayer) {\n return this.replayer.getCurrentTime();\n }\n return 0;\n }\n\n resetReplayer() {\n this.endTimeoutTimeline();\n this.playerStatus = \"stopped\";\n this.currentTime = 0;\n\n if (this.replayer) {\n this.replayer.pause();\n this.replayer.destroy();\n this.replayer = null;\n }\n if (this.overlayContainer) {\n this.overlayContainer.remove();\n this.overlayContainer = null;\n }\n }\n async 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}user`, this.userId))\n ).data() as User<\"operator\">;\n if (!this.user) {\n console.warn(`User with ID ${this.userId} does not exist.`);\n\n return [];\n }\n }\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 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\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\nconst app = initializeApp(firebaseConfig);\n\nexport const db = getFirestore(app);\n","import { v4 as uuidv4 } from \"uuid\";\nimport { record, Replayer } from \"rrweb\";\nimport {\n Firestore,\n doc,\n setDoc,\n collection,\n getDoc,\n getFirestore,\n} from \"firebase/firestore\";\nimport {\n ActionRecord,\n ActionRecordSession,\n Project,\n User,\n} from \"@ism-tech/actionlens-type\";\nimport { db } from \"./utils/index\";\nimport { pack } from \"@rrweb/packer\";\nimport { initializeApp } from \"firebase/app\";\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 console.log(\"ActionLensRc開始\");\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 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 ] 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: \"log\", 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 record.addCustomEvent(\"performance\", {\n name: entry.name,\n entryType: entry.entryType,\n startTime: entry.startTime,\n duration: entry.duration,\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 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 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 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 // rrwebの録画を開始 済み\n const _updateActionRecordSession = async () =>\n await this.updateActionRecordSession();\n this.stopFnForStore = record({\n packFn: pack,\n collectFonts: true,\n inlineImages: false,\n sampling: {\n canvas: 500,\n mousemove: true,\n mousemoveCallback: 500,\n },\n\n emit: async (event) => {\n try {\n const newDocRef = doc(collection(_db, `${prefix}ActionRecord`));\n const record: ActionRecord = {\n id: newDocRef.id,\n timeStamp: new Date(),\n userId,\n originalUserId,\n type: \"rrweb\",\n sessionId: _sessionId,\n rrwebRecord: JSON.stringify(event),\n createAt: new Date(),\n updateAt: new Date(),\n hidden: false,\n createdBy: userId,\n updatedBy: userId,\n hiddenBy: \"\",\n };\n\n await setDoc(newDocRef, record);\n await _updateActionRecordSession();\n } catch (error) {\n console.error(\"rrwebイベント保存エラー:\", error);\n throw error;\n }\n },\n recordCanvas: false,\n });\n this.startConsoleRecording();\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","import { Timestamp } from \"firebase/firestore\";\n// import { copy } from \"copy-anything\";\n/** Timestampの時はDateへの変更 */\nexport function convertTimestampToDate(\n timestamp: Timestamp | Date | null\n): Date | null {\n if (!timestamp) return null;\n /** string の場合(本来は来ないはずなのに) */\n if (typeof timestamp === \"string\") {\n const _string = new Date(timestamp);\n // console.log('convertTimestampToDate-string:', _string)\n if (isNaN(_string.getTime())) {\n return null;\n }\n return _string;\n }\n if (\"_seconds\" in timestamp && timestamp?._seconds) {\n return new Date(Number(timestamp._seconds) * 1000);\n }\n /** timestampの場合 */\n if (timestamp instanceof Timestamp) {\n const _timestamp = timestamp.toDate();\n // console.log('convertTimestampToDate-timestamp:', _timestamp)\n return _timestamp;\n }\n /** Dateの場合 */\n if (timestamp instanceof Date) {\n const _date = timestamp;\n // console.log('convertTimestampToDate-date:', _date)\n return _date;\n }\n // console.log('convertTimestampToDate-type:', typeof timestamp)\n // console.log('convertTimestampToDate-else:', timestamp)\n return timestamp;\n}\n\n/**\n * 時間を文字に変換\n * @param payload Date | Timestamp | string | null\n * @param format YYYY/MM/DD hh:mm:ss\n */\nexport const dateFormat = (\n payload:\n | Date\n | Timestamp\n | string\n | number\n | null\n | undefined\n | {\n _seconds: number;\n _nanoseconds: number;\n },\n format: string = \"YYYY/MM/DD\"\n) => {\n let date = payload;\n if (!date) return \"\";\n if (typeof date === \"string\") {\n if (date.length === 8 && /^\\d{8}$/.test(date)) {\n // 'YYYYMMDD'形式の対応\n const strYear = Number(date.slice(0, 4));\n const strMonth = Number(date.slice(4, 6)) - 1; // 月は0始まり\n const strDate = Number(date.slice(6, 8));\n date = new Date(strYear, strMonth, strDate);\n } else if (!/^(\\d{4}).([0-1]\\d).([0-3]\\d).*$/.test(date)) {\n return \"error\";\n } else {\n const strYear = Number(date.slice(0, 4));\n const strMonth = Number(date.slice(5, 7)) - 1;\n const strDate = Number(date.slice(8, 10));\n date = new Date(strYear, strMonth, strDate);\n }\n }\n if (typeof date === \"number\") {\n date = new Date(date);\n }\n if (isTimestamp(date)) {\n date = date.toDate();\n }\n if (date.hasOwnProperty(\"_seconds\") && date.hasOwnProperty(\"_nanoseconds\")) {\n date = new Date(\n // @ts-ignore\n date._seconds * 1000 + Math.floor(date._nanoseconds / 1000000)\n );\n }\n\n date = new Date(date as Date);\n\n format = format.replace(/YYYY/g, date.getFullYear().toString());\n format = format.replace(/MM/g, (\"0\" + (date.getMonth() + 1)).slice(-2));\n format = format.replace(/DD/g, (\"0\" + date.getDate()).slice(-2));\n format = format.replace(/hh/g, (\"0\" + date.getHours()).slice(-2));\n format = format.replace(/mm/g, (\"0\" + date.getMinutes()).slice(-2));\n format = format.replace(/ss/g, (\"0\" + date.getSeconds()).slice(-2));\n format = format.replace(/SSS/g, (\"00\" + date.getMilliseconds()).slice(-3));\n format = format.replace(\n /aaa/g,\n [\"日\", \"月\", \"火\", \"水\", \"木\", \"金\", \"土\"][date.getDay()]\n );\n // if (format.includes('-')) {\n // console.log('「-」includes warning')\n // }\n\n return format;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst isTimestamp = (payload: any): payload is Timestamp => {\n return payload.toDate !== undefined;\n};\n"],"mappings":"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","names":["import_firestore","doc","import_rrweb","import_firestore","import_packer","uuidv4","db","record","import_firestore"]}
|
|
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 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\";\nexport class ActionLensPlayer {\n replayer: Replayer | null = null;\n overlayContainer: HTMLElement | null = null;\n playerStatus: \"playing\" | \"paused\" | \"stopped\" = \"stopped\";\n targetDivId: string;\n db: Firestore;\n prefix: string;\n userId: string | null = null;\n projectId: string | null = null;\n currentTime: number = 0; // 現在の再生時間\n totalTime: number = 0; // 再生中の時間を保持するための変数\n user: User<\"operator\"> | null = null; // ユーザーデータを保持するための変数\n private setIntervalId: NodeJS.Timeout | null = null; // setTimeoutのIDを保持するための変数\n\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}user`, userId));\n if (!user.exists()) {\n throw new Error(`User with ID ${userId} does not exist.`);\n }\n const userData = user.data() as User<\"operator\">;\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.map((doc) => {\n const data = doc.data() as ActionRecord;\n return JSON.parse(data.rrwebRecord);\n });\n console.log(\"events\", events);\n if (events.length === 0) {\n console.warn(\n `セッションID ${sessionId} のデータが見つかりませんでした。`\n );\n return [];\n }\n\n const targetDiv = document.getElementById(this.targetDivId);\n if (!targetDiv) {\n throw new Error(\n `ID ${this.targetDivId} のdiv要素が見つかりませんでした。`\n );\n }\n\n // クラスを追加\n targetDiv.classList.add(\"replayer-container\");\n\n // 3. Replayerを初期化\n this.replayer = new Replayer(events, {\n 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 // 4. カスタムイベントのリスナーを追加\n this.replayer.on(\"custom-event\", (event: any) => {\n console.log(\"Custom event:\", event);\n this.handleCustomEvent(event);\n });\n this.replayer.on(\"finish\", () => {\n console.log(\"Replay finished\");\n this.replayer?.pause(0);\n this.playerStatus = \"stopped\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n this.endTimeoutTimeline();\n });\n const { totalTime } = this.replayer.getMetaData();\n this.totalTime = totalTime;\n\n // iframeのスタイルを調整\n const iframes = targetDiv.querySelectorAll(\"iframe\");\n iframes.forEach((iframe) => {\n (iframe as HTMLElement).style.transform = \"translate(-50%, -50%)\";\n (iframe as HTMLElement).style.position = \"absolute\";\n (iframe as HTMLElement).style.left = \"50%\";\n (iframe as HTMLElement).style.top = \"50%\";\n });\n // replayer-mouse-tailにposition: absolute; を追加\n const mouseTailElements = document.querySelectorAll(\n \".replayer-mouse-tail\"\n );\n mouseTailElements.forEach((element) => {\n (element as HTMLElement).style.position = \"absolute\";\n (element as HTMLElement).style.left = \"50%\";\n (element as HTMLElement).style.top = \"50%\";\n (element as HTMLElement).style.transform = \"translate(-50%, -50%)\";\n (element as HTMLElement).style.zIndex = \"1000\"; // z-indexを追加\n });\n\n // 5. 再生開始\n\n this.replayer.play();\n this.playerStatus = \"playing\";\n\n console.log(`セッションID ${sessionId} の再生を開始しました。`);\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.displayEvent(`[${timeString}] Navigation to ${url}`, \"navigation\");\n break;\n case \"performance\":\n const { name, entryType, duration } = event.data;\n this.displayEvent(\n `[${timeString}] Performance ${entryType}: ${name} (${duration}ms)`,\n \"performance\"\n );\n break;\n default:\n console.warn(\"不明なカスタムイベント:\", event.data.type);\n }\n }\n\n // イベントをオーバーレイに表示\n private displayEvent(message: string, eventType: string) {\n if (!this.overlayContainer) return;\n\n const eventDiv = document.createElement(\"div\");\n eventDiv.style.padding = \"5px\";\n eventDiv.style.borderBottom = \"1px solid rgba(255, 255, 255, 0.2)\";\n\n // イベントタイプに応じた色\n const colors: { [key: string]: string } = {\n console: \"#00cc00\",\n navigation: \"#3399ff\",\n performance: \"#ff9900\",\n };\n eventDiv.style.color = colors[eventType] || \"white\";\n\n eventDiv.innerText = message;\n this.overlayContainer.appendChild(eventDiv);\n\n // 最新のイベントが表示されるようスクロール\n this.overlayContainer.scrollTop = this.overlayContainer.scrollHeight;\n\n // 5秒後にフェードアウト\n setTimeout(() => {\n eventDiv.style.transition = \"opacity 1s\";\n eventDiv.style.opacity = \"0\";\n setTimeout(() => eventDiv.remove(), 1000);\n }, 5000);\n }\n setReplayTime(time: number) {\n if (this.replayer) {\n this.replayer.pause(time);\n this.currentTime = time;\n this.playerStatus = \"stopped\";\n }\n }\n\n setTimeoutTimeline() {\n this.setIntervalId = setInterval(() => {\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }, 10);\n }\n endTimeoutTimeline() {\n if (this.setIntervalId) {\n clearTimeout(this.setIntervalId);\n this.setIntervalId = null;\n }\n }\n\n // 再生を停止\n stopReplay() {\n this.endTimeoutTimeline();\n if (this.replayer) {\n this.replayer.pause();\n this.playerStatus = \"stopped\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }\n }\n restartReplay() {\n this.setTimeoutTimeline();\n if (this.replayer) {\n const offset = this.replayer.getCurrentTime();\n console.log(\"offset\", offset);\n this.replayer.play(offset);\n this.playerStatus = \"playing\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }\n }\n getCurrentTime() {\n if (this.replayer) {\n return this.replayer.getCurrentTime();\n }\n return 0;\n }\n\n resetReplayer() {\n this.endTimeoutTimeline();\n this.playerStatus = \"stopped\";\n this.currentTime = 0;\n\n if (this.replayer) {\n this.replayer.pause();\n this.replayer.destroy();\n this.replayer = null;\n }\n if (this.overlayContainer) {\n this.overlayContainer.remove();\n this.overlayContainer = null;\n }\n }\n async 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}user`, this.userId))\n ).data() as User<\"operator\">;\n if (!this.user) {\n console.warn(`User with ID ${this.userId} does not exist.`);\n\n return [];\n }\n }\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 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\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\nconst app = initializeApp(firebaseConfig);\n\nexport const db = getFirestore(app);\n","import { v4 as uuidv4 } from \"uuid\";\nimport { record, Replayer } from \"rrweb\";\nimport {\n Firestore,\n doc,\n setDoc,\n collection,\n getDoc,\n getFirestore,\n} from \"firebase/firestore\";\nimport {\n ActionRecord,\n ActionRecordSession,\n Project,\n User,\n} from \"@ism-tech/actionlens-type\";\nimport { db } from \"./utils/index\";\nimport { pack } from \"@rrweb/packer\";\nimport { initializeApp } from \"firebase/app\";\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 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 ] 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: \"log\", 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 record.addCustomEvent(\"performance\", {\n name: entry.name,\n entryType: entry.entryType,\n startTime: entry.startTime,\n duration: entry.duration,\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 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 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 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\n this.stopFnForStore = record({\n packFn: pack,\n collectFonts: true,\n inlineImages: false,\n sampling: {\n canvas: 500,\n mousemove: true,\n mousemoveCallback: 500,\n },\n\n emit: async (event) => {\n try {\n const newDocRef = doc(collection(_db, `${prefix}ActionRecord`));\n const record: ActionRecord = {\n id: newDocRef.id,\n timeStamp: new Date(),\n userId,\n originalUserId,\n type: \"rrweb\",\n sessionId: _sessionId,\n rrwebRecord: JSON.stringify(event),\n createAt: new Date(),\n updateAt: new Date(),\n hidden: false,\n createdBy: userId,\n updatedBy: userId,\n hiddenBy: \"\",\n };\n\n await setDoc(newDocRef, record);\n } catch (error) {\n console.error(\"rrwebイベント保存エラー:\", error);\n throw error;\n }\n },\n recordCanvas: false,\n });\n this.startConsoleRecording();\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"],"mappings":"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","names":["import_firestore","doc","import_rrweb","import_firestore","import_packer","uuidv4","db","record"]}
|
package/dist/index.mjs
CHANGED
|
@@ -338,7 +338,6 @@ var ActionLensRc = class {
|
|
|
338
338
|
}
|
|
339
339
|
async init(projectId, _db = null, prefix = "") {
|
|
340
340
|
try {
|
|
341
|
-
console.log("ActionLensRc\u958B\u59CB");
|
|
342
341
|
if (!projectId) {
|
|
343
342
|
console.error("projectId\u304CNULL\u3067\u3059");
|
|
344
343
|
return;
|
|
@@ -593,7 +592,6 @@ var ActionLensRc = class {
|
|
|
593
592
|
createdBy: userId,
|
|
594
593
|
updatedBy: userId
|
|
595
594
|
});
|
|
596
|
-
const _updateActionRecordSession = async () => await this.updateActionRecordSession();
|
|
597
595
|
this.stopFnForStore = record({
|
|
598
596
|
packFn: pack,
|
|
599
597
|
collectFonts: true,
|
|
@@ -622,7 +620,6 @@ var ActionLensRc = class {
|
|
|
622
620
|
hiddenBy: ""
|
|
623
621
|
};
|
|
624
622
|
await setDoc2(newDocRef, record2);
|
|
625
|
-
await _updateActionRecordSession();
|
|
626
623
|
} catch (error) {
|
|
627
624
|
console.error("rrweb\u30A4\u30D9\u30F3\u30C8\u4FDD\u5B58\u30A8\u30E9\u30FC:", error);
|
|
628
625
|
throw error;
|
|
@@ -677,83 +674,9 @@ var ActionLensRc = class {
|
|
|
677
674
|
}
|
|
678
675
|
};
|
|
679
676
|
var ActionLens = new ActionLensRc();
|
|
680
|
-
|
|
681
|
-
// src/utils/date.ts
|
|
682
|
-
import { Timestamp } from "firebase/firestore";
|
|
683
|
-
function convertTimestampToDate(timestamp) {
|
|
684
|
-
if (!timestamp) return null;
|
|
685
|
-
if (typeof timestamp === "string") {
|
|
686
|
-
const _string = new Date(timestamp);
|
|
687
|
-
if (isNaN(_string.getTime())) {
|
|
688
|
-
return null;
|
|
689
|
-
}
|
|
690
|
-
return _string;
|
|
691
|
-
}
|
|
692
|
-
if ("_seconds" in timestamp && timestamp?._seconds) {
|
|
693
|
-
return new Date(Number(timestamp._seconds) * 1e3);
|
|
694
|
-
}
|
|
695
|
-
if (timestamp instanceof Timestamp) {
|
|
696
|
-
const _timestamp = timestamp.toDate();
|
|
697
|
-
return _timestamp;
|
|
698
|
-
}
|
|
699
|
-
if (timestamp instanceof Date) {
|
|
700
|
-
const _date = timestamp;
|
|
701
|
-
return _date;
|
|
702
|
-
}
|
|
703
|
-
return timestamp;
|
|
704
|
-
}
|
|
705
|
-
var dateFormat = (payload, format = "YYYY/MM/DD") => {
|
|
706
|
-
let date = payload;
|
|
707
|
-
if (!date) return "";
|
|
708
|
-
if (typeof date === "string") {
|
|
709
|
-
if (date.length === 8 && /^\d{8}$/.test(date)) {
|
|
710
|
-
const strYear = Number(date.slice(0, 4));
|
|
711
|
-
const strMonth = Number(date.slice(4, 6)) - 1;
|
|
712
|
-
const strDate = Number(date.slice(6, 8));
|
|
713
|
-
date = new Date(strYear, strMonth, strDate);
|
|
714
|
-
} else if (!/^(\d{4}).([0-1]\d).([0-3]\d).*$/.test(date)) {
|
|
715
|
-
return "error";
|
|
716
|
-
} else {
|
|
717
|
-
const strYear = Number(date.slice(0, 4));
|
|
718
|
-
const strMonth = Number(date.slice(5, 7)) - 1;
|
|
719
|
-
const strDate = Number(date.slice(8, 10));
|
|
720
|
-
date = new Date(strYear, strMonth, strDate);
|
|
721
|
-
}
|
|
722
|
-
}
|
|
723
|
-
if (typeof date === "number") {
|
|
724
|
-
date = new Date(date);
|
|
725
|
-
}
|
|
726
|
-
if (isTimestamp(date)) {
|
|
727
|
-
date = date.toDate();
|
|
728
|
-
}
|
|
729
|
-
if (date.hasOwnProperty("_seconds") && date.hasOwnProperty("_nanoseconds")) {
|
|
730
|
-
date = new Date(
|
|
731
|
-
// @ts-ignore
|
|
732
|
-
date._seconds * 1e3 + Math.floor(date._nanoseconds / 1e6)
|
|
733
|
-
);
|
|
734
|
-
}
|
|
735
|
-
date = new Date(date);
|
|
736
|
-
format = format.replace(/YYYY/g, date.getFullYear().toString());
|
|
737
|
-
format = format.replace(/MM/g, ("0" + (date.getMonth() + 1)).slice(-2));
|
|
738
|
-
format = format.replace(/DD/g, ("0" + date.getDate()).slice(-2));
|
|
739
|
-
format = format.replace(/hh/g, ("0" + date.getHours()).slice(-2));
|
|
740
|
-
format = format.replace(/mm/g, ("0" + date.getMinutes()).slice(-2));
|
|
741
|
-
format = format.replace(/ss/g, ("0" + date.getSeconds()).slice(-2));
|
|
742
|
-
format = format.replace(/SSS/g, ("00" + date.getMilliseconds()).slice(-3));
|
|
743
|
-
format = format.replace(
|
|
744
|
-
/aaa/g,
|
|
745
|
-
["\u65E5", "\u6708", "\u706B", "\u6C34", "\u6728", "\u91D1", "\u571F"][date.getDay()]
|
|
746
|
-
);
|
|
747
|
-
return format;
|
|
748
|
-
};
|
|
749
|
-
var isTimestamp = (payload) => {
|
|
750
|
-
return payload.toDate !== void 0;
|
|
751
|
-
};
|
|
752
677
|
export {
|
|
753
678
|
ActionLens,
|
|
754
679
|
ActionLensPlayer,
|
|
755
|
-
ActionLensRc
|
|
756
|
-
convertTimestampToDate,
|
|
757
|
-
dateFormat
|
|
680
|
+
ActionLensRc
|
|
758
681
|
};
|
|
759
682
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/player.ts","../src/utils/index.ts","../src/record.ts","../src/utils/date.ts"],"sourcesContent":["import {\n doc,\n collection,\n setDoc,\n addDoc,\n where,\n query,\n getDocs,\n orderBy,\n Firestore,\n getDoc,\n limit,\n} from \"firebase/firestore\";\nimport {\n ActionRecord,\n ActionRecordSession,\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\";\nexport class ActionLensPlayer {\n replayer: Replayer | null = null;\n overlayContainer: HTMLElement | null = null;\n playerStatus: \"playing\" | \"paused\" | \"stopped\" = \"stopped\";\n targetDivId: string;\n db: Firestore;\n prefix: string;\n userId: string | null = null;\n projectId: string | null = null;\n currentTime: number = 0; // 現在の再生時間\n totalTime: number = 0; // 再生中の時間を保持するための変数\n user: User<\"operator\"> | null = null; // ユーザーデータを保持するための変数\n private setIntervalId: NodeJS.Timeout | null = null; // setTimeoutのIDを保持するための変数\n\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}user`, userId));\n if (!user.exists()) {\n throw new Error(`User with ID ${userId} does not exist.`);\n }\n const userData = user.data() as User<\"operator\">;\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.map((doc) => {\n const data = doc.data() as ActionRecord;\n return JSON.parse(data.rrwebRecord);\n });\n console.log(\"events\", events);\n if (events.length === 0) {\n console.warn(\n `セッションID ${sessionId} のデータが見つかりませんでした。`\n );\n return [];\n }\n\n const targetDiv = document.getElementById(this.targetDivId);\n if (!targetDiv) {\n throw new Error(\n `ID ${this.targetDivId} のdiv要素が見つかりませんでした。`\n );\n }\n\n // クラスを追加\n targetDiv.classList.add(\"replayer-container\");\n\n // 3. Replayerを初期化\n this.replayer = new Replayer(events, {\n 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 // 4. カスタムイベントのリスナーを追加\n this.replayer.on(\"custom-event\", (event: any) => {\n console.log(\"Custom event:\", event);\n this.handleCustomEvent(event);\n });\n this.replayer.on(\"finish\", () => {\n console.log(\"Replay finished\");\n this.replayer?.pause(0);\n this.playerStatus = \"stopped\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n this.endTimeoutTimeline();\n });\n const { totalTime } = this.replayer.getMetaData();\n this.totalTime = totalTime;\n\n // iframeのスタイルを調整\n const iframes = targetDiv.querySelectorAll(\"iframe\");\n iframes.forEach((iframe) => {\n (iframe as HTMLElement).style.transform = \"translate(-50%, -50%)\";\n (iframe as HTMLElement).style.position = \"absolute\";\n (iframe as HTMLElement).style.left = \"50%\";\n (iframe as HTMLElement).style.top = \"50%\";\n });\n // replayer-mouse-tailにposition: absolute; を追加\n const mouseTailElements = document.querySelectorAll(\n \".replayer-mouse-tail\"\n );\n mouseTailElements.forEach((element) => {\n (element as HTMLElement).style.position = \"absolute\";\n (element as HTMLElement).style.left = \"50%\";\n (element as HTMLElement).style.top = \"50%\";\n (element as HTMLElement).style.transform = \"translate(-50%, -50%)\";\n (element as HTMLElement).style.zIndex = \"1000\"; // z-indexを追加\n });\n\n // 5. 再生開始\n\n this.replayer.play();\n this.playerStatus = \"playing\";\n\n console.log(`セッションID ${sessionId} の再生を開始しました。`);\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.displayEvent(`[${timeString}] Navigation to ${url}`, \"navigation\");\n break;\n case \"performance\":\n const { name, entryType, duration } = event.data;\n this.displayEvent(\n `[${timeString}] Performance ${entryType}: ${name} (${duration}ms)`,\n \"performance\"\n );\n break;\n default:\n console.warn(\"不明なカスタムイベント:\", event.data.type);\n }\n }\n\n // イベントをオーバーレイに表示\n private displayEvent(message: string, eventType: string) {\n if (!this.overlayContainer) return;\n\n const eventDiv = document.createElement(\"div\");\n eventDiv.style.padding = \"5px\";\n eventDiv.style.borderBottom = \"1px solid rgba(255, 255, 255, 0.2)\";\n\n // イベントタイプに応じた色\n const colors: { [key: string]: string } = {\n console: \"#00cc00\",\n navigation: \"#3399ff\",\n performance: \"#ff9900\",\n };\n eventDiv.style.color = colors[eventType] || \"white\";\n\n eventDiv.innerText = message;\n this.overlayContainer.appendChild(eventDiv);\n\n // 最新のイベントが表示されるようスクロール\n this.overlayContainer.scrollTop = this.overlayContainer.scrollHeight;\n\n // 5秒後にフェードアウト\n setTimeout(() => {\n eventDiv.style.transition = \"opacity 1s\";\n eventDiv.style.opacity = \"0\";\n setTimeout(() => eventDiv.remove(), 1000);\n }, 5000);\n }\n setReplayTime(time: number) {\n if (this.replayer) {\n this.replayer.pause(time);\n this.currentTime = time;\n this.playerStatus = \"stopped\";\n }\n }\n\n setTimeoutTimeline() {\n this.setIntervalId = setInterval(() => {\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }, 10);\n }\n endTimeoutTimeline() {\n if (this.setIntervalId) {\n clearTimeout(this.setIntervalId);\n this.setIntervalId = null;\n }\n }\n\n // 再生を停止\n stopReplay() {\n this.endTimeoutTimeline();\n if (this.replayer) {\n this.replayer.pause();\n this.playerStatus = \"stopped\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }\n }\n restartReplay() {\n this.setTimeoutTimeline();\n if (this.replayer) {\n const offset = this.replayer.getCurrentTime();\n console.log(\"offset\", offset);\n this.replayer.play(offset);\n this.playerStatus = \"playing\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }\n }\n getCurrentTime() {\n if (this.replayer) {\n return this.replayer.getCurrentTime();\n }\n return 0;\n }\n\n resetReplayer() {\n this.endTimeoutTimeline();\n this.playerStatus = \"stopped\";\n this.currentTime = 0;\n\n if (this.replayer) {\n this.replayer.pause();\n this.replayer.destroy();\n this.replayer = null;\n }\n if (this.overlayContainer) {\n this.overlayContainer.remove();\n this.overlayContainer = null;\n }\n }\n async 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}user`, this.userId))\n ).data() as User<\"operator\">;\n if (!this.user) {\n console.warn(`User with ID ${this.userId} does not exist.`);\n\n return [];\n }\n }\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 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\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\nconst app = initializeApp(firebaseConfig);\n\nexport const db = getFirestore(app);\n","import { v4 as uuidv4 } from \"uuid\";\nimport { record, Replayer } from \"rrweb\";\nimport {\n Firestore,\n doc,\n setDoc,\n collection,\n getDoc,\n getFirestore,\n} from \"firebase/firestore\";\nimport {\n ActionRecord,\n ActionRecordSession,\n Project,\n User,\n} from \"@ism-tech/actionlens-type\";\nimport { db } from \"./utils/index\";\nimport { pack } from \"@rrweb/packer\";\nimport { initializeApp } from \"firebase/app\";\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 console.log(\"ActionLensRc開始\");\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 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 ] 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: \"log\", 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 record.addCustomEvent(\"performance\", {\n name: entry.name,\n entryType: entry.entryType,\n startTime: entry.startTime,\n duration: entry.duration,\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 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 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 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 // rrwebの録画を開始 済み\n const _updateActionRecordSession = async () =>\n await this.updateActionRecordSession();\n this.stopFnForStore = record({\n packFn: pack,\n collectFonts: true,\n inlineImages: false,\n sampling: {\n canvas: 500,\n mousemove: true,\n mousemoveCallback: 500,\n },\n\n emit: async (event) => {\n try {\n const newDocRef = doc(collection(_db, `${prefix}ActionRecord`));\n const record: ActionRecord = {\n id: newDocRef.id,\n timeStamp: new Date(),\n userId,\n originalUserId,\n type: \"rrweb\",\n sessionId: _sessionId,\n rrwebRecord: JSON.stringify(event),\n createAt: new Date(),\n updateAt: new Date(),\n hidden: false,\n createdBy: userId,\n updatedBy: userId,\n hiddenBy: \"\",\n };\n\n await setDoc(newDocRef, record);\n await _updateActionRecordSession();\n } catch (error) {\n console.error(\"rrwebイベント保存エラー:\", error);\n throw error;\n }\n },\n recordCanvas: false,\n });\n this.startConsoleRecording();\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","import { Timestamp } from \"firebase/firestore\";\n// import { copy } from \"copy-anything\";\n/** Timestampの時はDateへの変更 */\nexport function convertTimestampToDate(\n timestamp: Timestamp | Date | null\n): Date | null {\n if (!timestamp) return null;\n /** string の場合(本来は来ないはずなのに) */\n if (typeof timestamp === \"string\") {\n const _string = new Date(timestamp);\n // console.log('convertTimestampToDate-string:', _string)\n if (isNaN(_string.getTime())) {\n return null;\n }\n return _string;\n }\n if (\"_seconds\" in timestamp && timestamp?._seconds) {\n return new Date(Number(timestamp._seconds) * 1000);\n }\n /** timestampの場合 */\n if (timestamp instanceof Timestamp) {\n const _timestamp = timestamp.toDate();\n // console.log('convertTimestampToDate-timestamp:', _timestamp)\n return _timestamp;\n }\n /** Dateの場合 */\n if (timestamp instanceof Date) {\n const _date = timestamp;\n // console.log('convertTimestampToDate-date:', _date)\n return _date;\n }\n // console.log('convertTimestampToDate-type:', typeof timestamp)\n // console.log('convertTimestampToDate-else:', timestamp)\n return timestamp;\n}\n\n/**\n * 時間を文字に変換\n * @param payload Date | Timestamp | string | null\n * @param format YYYY/MM/DD hh:mm:ss\n */\nexport const dateFormat = (\n payload:\n | Date\n | Timestamp\n | string\n | number\n | null\n | undefined\n | {\n _seconds: number;\n _nanoseconds: number;\n },\n format: string = \"YYYY/MM/DD\"\n) => {\n let date = payload;\n if (!date) return \"\";\n if (typeof date === \"string\") {\n if (date.length === 8 && /^\\d{8}$/.test(date)) {\n // 'YYYYMMDD'形式の対応\n const strYear = Number(date.slice(0, 4));\n const strMonth = Number(date.slice(4, 6)) - 1; // 月は0始まり\n const strDate = Number(date.slice(6, 8));\n date = new Date(strYear, strMonth, strDate);\n } else if (!/^(\\d{4}).([0-1]\\d).([0-3]\\d).*$/.test(date)) {\n return \"error\";\n } else {\n const strYear = Number(date.slice(0, 4));\n const strMonth = Number(date.slice(5, 7)) - 1;\n const strDate = Number(date.slice(8, 10));\n date = new Date(strYear, strMonth, strDate);\n }\n }\n if (typeof date === \"number\") {\n date = new Date(date);\n }\n if (isTimestamp(date)) {\n date = date.toDate();\n }\n if (date.hasOwnProperty(\"_seconds\") && date.hasOwnProperty(\"_nanoseconds\")) {\n date = new Date(\n // @ts-ignore\n date._seconds * 1000 + Math.floor(date._nanoseconds / 1000000)\n );\n }\n\n date = new Date(date as Date);\n\n format = format.replace(/YYYY/g, date.getFullYear().toString());\n format = format.replace(/MM/g, (\"0\" + (date.getMonth() + 1)).slice(-2));\n format = format.replace(/DD/g, (\"0\" + date.getDate()).slice(-2));\n format = format.replace(/hh/g, (\"0\" + date.getHours()).slice(-2));\n format = format.replace(/mm/g, (\"0\" + date.getMinutes()).slice(-2));\n format = format.replace(/ss/g, (\"0\" + date.getSeconds()).slice(-2));\n format = format.replace(/SSS/g, (\"00\" + date.getMilliseconds()).slice(-3));\n format = format.replace(\n /aaa/g,\n [\"日\", \"月\", \"火\", \"水\", \"木\", \"金\", \"土\"][date.getDay()]\n );\n // if (format.includes('-')) {\n // console.log('「-」includes warning')\n // }\n\n return format;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst isTimestamp = (payload: any): payload is Timestamp => {\n return payload.toDate !== undefined;\n};\n"],"mappings":"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","names":["doc","doc","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 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\";\nexport class ActionLensPlayer {\n replayer: Replayer | null = null;\n overlayContainer: HTMLElement | null = null;\n playerStatus: \"playing\" | \"paused\" | \"stopped\" = \"stopped\";\n targetDivId: string;\n db: Firestore;\n prefix: string;\n userId: string | null = null;\n projectId: string | null = null;\n currentTime: number = 0; // 現在の再生時間\n totalTime: number = 0; // 再生中の時間を保持するための変数\n user: User<\"operator\"> | null = null; // ユーザーデータを保持するための変数\n private setIntervalId: NodeJS.Timeout | null = null; // setTimeoutのIDを保持するための変数\n\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}user`, userId));\n if (!user.exists()) {\n throw new Error(`User with ID ${userId} does not exist.`);\n }\n const userData = user.data() as User<\"operator\">;\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.map((doc) => {\n const data = doc.data() as ActionRecord;\n return JSON.parse(data.rrwebRecord);\n });\n console.log(\"events\", events);\n if (events.length === 0) {\n console.warn(\n `セッションID ${sessionId} のデータが見つかりませんでした。`\n );\n return [];\n }\n\n const targetDiv = document.getElementById(this.targetDivId);\n if (!targetDiv) {\n throw new Error(\n `ID ${this.targetDivId} のdiv要素が見つかりませんでした。`\n );\n }\n\n // クラスを追加\n targetDiv.classList.add(\"replayer-container\");\n\n // 3. Replayerを初期化\n this.replayer = new Replayer(events, {\n 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 // 4. カスタムイベントのリスナーを追加\n this.replayer.on(\"custom-event\", (event: any) => {\n console.log(\"Custom event:\", event);\n this.handleCustomEvent(event);\n });\n this.replayer.on(\"finish\", () => {\n console.log(\"Replay finished\");\n this.replayer?.pause(0);\n this.playerStatus = \"stopped\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n this.endTimeoutTimeline();\n });\n const { totalTime } = this.replayer.getMetaData();\n this.totalTime = totalTime;\n\n // iframeのスタイルを調整\n const iframes = targetDiv.querySelectorAll(\"iframe\");\n iframes.forEach((iframe) => {\n (iframe as HTMLElement).style.transform = \"translate(-50%, -50%)\";\n (iframe as HTMLElement).style.position = \"absolute\";\n (iframe as HTMLElement).style.left = \"50%\";\n (iframe as HTMLElement).style.top = \"50%\";\n });\n // replayer-mouse-tailにposition: absolute; を追加\n const mouseTailElements = document.querySelectorAll(\n \".replayer-mouse-tail\"\n );\n mouseTailElements.forEach((element) => {\n (element as HTMLElement).style.position = \"absolute\";\n (element as HTMLElement).style.left = \"50%\";\n (element as HTMLElement).style.top = \"50%\";\n (element as HTMLElement).style.transform = \"translate(-50%, -50%)\";\n (element as HTMLElement).style.zIndex = \"1000\"; // z-indexを追加\n });\n\n // 5. 再生開始\n\n this.replayer.play();\n this.playerStatus = \"playing\";\n\n console.log(`セッションID ${sessionId} の再生を開始しました。`);\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.displayEvent(`[${timeString}] Navigation to ${url}`, \"navigation\");\n break;\n case \"performance\":\n const { name, entryType, duration } = event.data;\n this.displayEvent(\n `[${timeString}] Performance ${entryType}: ${name} (${duration}ms)`,\n \"performance\"\n );\n break;\n default:\n console.warn(\"不明なカスタムイベント:\", event.data.type);\n }\n }\n\n // イベントをオーバーレイに表示\n private displayEvent(message: string, eventType: string) {\n if (!this.overlayContainer) return;\n\n const eventDiv = document.createElement(\"div\");\n eventDiv.style.padding = \"5px\";\n eventDiv.style.borderBottom = \"1px solid rgba(255, 255, 255, 0.2)\";\n\n // イベントタイプに応じた色\n const colors: { [key: string]: string } = {\n console: \"#00cc00\",\n navigation: \"#3399ff\",\n performance: \"#ff9900\",\n };\n eventDiv.style.color = colors[eventType] || \"white\";\n\n eventDiv.innerText = message;\n this.overlayContainer.appendChild(eventDiv);\n\n // 最新のイベントが表示されるようスクロール\n this.overlayContainer.scrollTop = this.overlayContainer.scrollHeight;\n\n // 5秒後にフェードアウト\n setTimeout(() => {\n eventDiv.style.transition = \"opacity 1s\";\n eventDiv.style.opacity = \"0\";\n setTimeout(() => eventDiv.remove(), 1000);\n }, 5000);\n }\n setReplayTime(time: number) {\n if (this.replayer) {\n this.replayer.pause(time);\n this.currentTime = time;\n this.playerStatus = \"stopped\";\n }\n }\n\n setTimeoutTimeline() {\n this.setIntervalId = setInterval(() => {\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }, 10);\n }\n endTimeoutTimeline() {\n if (this.setIntervalId) {\n clearTimeout(this.setIntervalId);\n this.setIntervalId = null;\n }\n }\n\n // 再生を停止\n stopReplay() {\n this.endTimeoutTimeline();\n if (this.replayer) {\n this.replayer.pause();\n this.playerStatus = \"stopped\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }\n }\n restartReplay() {\n this.setTimeoutTimeline();\n if (this.replayer) {\n const offset = this.replayer.getCurrentTime();\n console.log(\"offset\", offset);\n this.replayer.play(offset);\n this.playerStatus = \"playing\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }\n }\n getCurrentTime() {\n if (this.replayer) {\n return this.replayer.getCurrentTime();\n }\n return 0;\n }\n\n resetReplayer() {\n this.endTimeoutTimeline();\n this.playerStatus = \"stopped\";\n this.currentTime = 0;\n\n if (this.replayer) {\n this.replayer.pause();\n this.replayer.destroy();\n this.replayer = null;\n }\n if (this.overlayContainer) {\n this.overlayContainer.remove();\n this.overlayContainer = null;\n }\n }\n async 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}user`, this.userId))\n ).data() as User<\"operator\">;\n if (!this.user) {\n console.warn(`User with ID ${this.userId} does not exist.`);\n\n return [];\n }\n }\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 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\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\nconst app = initializeApp(firebaseConfig);\n\nexport const db = getFirestore(app);\n","import { v4 as uuidv4 } from \"uuid\";\nimport { record, Replayer } from \"rrweb\";\nimport {\n Firestore,\n doc,\n setDoc,\n collection,\n getDoc,\n getFirestore,\n} from \"firebase/firestore\";\nimport {\n ActionRecord,\n ActionRecordSession,\n Project,\n User,\n} from \"@ism-tech/actionlens-type\";\nimport { db } from \"./utils/index\";\nimport { pack } from \"@rrweb/packer\";\nimport { initializeApp } from \"firebase/app\";\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 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 ] 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: \"log\", 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 record.addCustomEvent(\"performance\", {\n name: entry.name,\n entryType: entry.entryType,\n startTime: entry.startTime,\n duration: entry.duration,\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 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 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 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\n this.stopFnForStore = record({\n packFn: pack,\n collectFonts: true,\n inlineImages: false,\n sampling: {\n canvas: 500,\n mousemove: true,\n mousemoveCallback: 500,\n },\n\n emit: async (event) => {\n try {\n const newDocRef = doc(collection(_db, `${prefix}ActionRecord`));\n const record: ActionRecord = {\n id: newDocRef.id,\n timeStamp: new Date(),\n userId,\n originalUserId,\n type: \"rrweb\",\n sessionId: _sessionId,\n rrwebRecord: JSON.stringify(event),\n createAt: new Date(),\n updateAt: new Date(),\n hidden: false,\n createdBy: userId,\n updatedBy: userId,\n hiddenBy: \"\",\n };\n\n await setDoc(newDocRef, record);\n } catch (error) {\n console.error(\"rrwebイベント保存エラー:\", error);\n throw error;\n }\n },\n recordCanvas: false,\n });\n this.startConsoleRecording();\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"],"mappings":"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","names":["doc","doc","setDoc","collection","getDoc","getDoc","doc","collection","setDoc","db","record"]}
|
package/package.json
CHANGED