action-lens 1.0.70 → 1.0.72

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 CHANGED
@@ -18,7 +18,7 @@ declare class ActionLensPlayer {
18
18
  private setIntervalId;
19
19
  constructor(userId: string, targetDivId: string, _db?: Firestore, prefix?: string);
20
20
  initialize(userId: string): Promise<void>;
21
- replayRrwebSession(sessionId: string): Promise<void>;
21
+ replayRrwebSession(sessionId: string): Promise<any[]>;
22
22
  private handleCustomEvent;
23
23
  private displayEvent;
24
24
  setReplayTime(time: number): void;
@@ -29,16 +29,19 @@ declare class ActionLensPlayer {
29
29
  getCurrentTime(): number;
30
30
  resetReplayer(): void;
31
31
  fetchProjectList(): Promise<Project[]>;
32
- fetchSessionList(projectId: string): Promise<({
32
+ fetchSessionList(projectId: string, limitNum?: number): Promise<({
33
33
  id: string;
34
34
  startTime: Date;
35
35
  endTime: Date;
36
36
  userId: string;
37
+ userName?: string;
38
+ userEmail?: string;
39
+ userMeta?: Record<string, any>;
37
40
  originalUserId: string;
38
41
  projectId?: string;
39
42
  organizationId?: string;
40
43
  } & _ism_tech_actionlens_type_src_DefaultType.DefaultType & {
41
- userData: User<"operator">;
44
+ userData: User<"customer">;
42
45
  })[]>;
43
46
  }
44
47
 
@@ -59,10 +62,11 @@ declare class ActionLensRc {
59
62
  };
60
63
  metaData: Record<string, any>;
61
64
  constructor();
62
- init(_userId: string | null, projectId: string | null, userMeta: {
65
+ init(projectId: string | null, _db?: Firestore | null, prefix?: string): Promise<void>;
66
+ setUser(_userId: string | null, userMeta: {
63
67
  name: string;
64
68
  email: string;
65
- }, metaData?: Record<string, any>, _db?: Firestore | null, prefix?: string): Promise<void>;
69
+ }, metaData?: Record<string, any>): Promise<void>;
66
70
  startConsoleRecording(): void;
67
71
  startTimelineRecording(): void;
68
72
  startRrwebRecordingForStore(): Promise<void>;
package/dist/index.d.ts CHANGED
@@ -18,7 +18,7 @@ declare class ActionLensPlayer {
18
18
  private setIntervalId;
19
19
  constructor(userId: string, targetDivId: string, _db?: Firestore, prefix?: string);
20
20
  initialize(userId: string): Promise<void>;
21
- replayRrwebSession(sessionId: string): Promise<void>;
21
+ replayRrwebSession(sessionId: string): Promise<any[]>;
22
22
  private handleCustomEvent;
23
23
  private displayEvent;
24
24
  setReplayTime(time: number): void;
@@ -29,16 +29,19 @@ declare class ActionLensPlayer {
29
29
  getCurrentTime(): number;
30
30
  resetReplayer(): void;
31
31
  fetchProjectList(): Promise<Project[]>;
32
- fetchSessionList(projectId: string): Promise<({
32
+ fetchSessionList(projectId: string, limitNum?: number): Promise<({
33
33
  id: string;
34
34
  startTime: Date;
35
35
  endTime: Date;
36
36
  userId: string;
37
+ userName?: string;
38
+ userEmail?: string;
39
+ userMeta?: Record<string, any>;
37
40
  originalUserId: string;
38
41
  projectId?: string;
39
42
  organizationId?: string;
40
43
  } & _ism_tech_actionlens_type_src_DefaultType.DefaultType & {
41
- userData: User<"operator">;
44
+ userData: User<"customer">;
42
45
  })[]>;
43
46
  }
44
47
 
@@ -59,10 +62,11 @@ declare class ActionLensRc {
59
62
  };
60
63
  metaData: Record<string, any>;
61
64
  constructor();
62
- init(_userId: string | null, projectId: string | null, userMeta: {
65
+ init(projectId: string | null, _db?: Firestore | null, prefix?: string): Promise<void>;
66
+ setUser(_userId: string | null, userMeta: {
63
67
  name: string;
64
68
  email: string;
65
- }, metaData?: Record<string, any>, _db?: Firestore | null, prefix?: string): Promise<void>;
69
+ }, metaData?: Record<string, any>): Promise<void>;
66
70
  startConsoleRecording(): void;
67
71
  startTimelineRecording(): void;
68
72
  startRrwebRecordingForStore(): Promise<void>;
package/dist/index.js CHANGED
@@ -101,7 +101,7 @@ var ActionLensPlayer = class {
101
101
  console.warn(
102
102
  `\u30BB\u30C3\u30B7\u30E7\u30F3ID ${sessionId} \u306E\u30C7\u30FC\u30BF\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002`
103
103
  );
104
- return;
104
+ return [];
105
105
  }
106
106
  const targetDiv = document.getElementById(this.targetDivId);
107
107
  if (!targetDiv) {
@@ -155,6 +155,7 @@ var ActionLensPlayer = class {
155
155
  this.playerStatus = "playing";
156
156
  console.log(`\u30BB\u30C3\u30B7\u30E7\u30F3ID ${sessionId} \u306E\u518D\u751F\u3092\u958B\u59CB\u3057\u307E\u3057\u305F\u3002`);
157
157
  this.setTimeoutTimeline();
158
+ return events.map((e) => (0, import_packer.unpack)(e));
158
159
  } catch (error) {
159
160
  console.error("\u518D\u751F\u30A8\u30E9\u30FC:", error);
160
161
  throw error;
@@ -301,12 +302,13 @@ var ActionLensPlayer = class {
301
302
  throw e;
302
303
  }
303
304
  }
304
- async fetchSessionList(projectId) {
305
+ async fetchSessionList(projectId, limitNum = 20) {
305
306
  try {
306
307
  const q = (0, import_firestore2.query)(
307
308
  (0, import_firestore2.collection)(this.db, `${this.prefix}ActionRecordSession`),
308
309
  (0, import_firestore2.where)("projectId", "==", projectId),
309
- (0, import_firestore2.orderBy)("startTime", "desc")
310
+ (0, import_firestore2.orderBy)("startTime", "desc"),
311
+ (0, import_firestore2.limit)(limitNum)
310
312
  );
311
313
  const usersStore = {};
312
314
  const querySnapshot = await (0, import_firestore2.getDocs)(q);
@@ -335,7 +337,8 @@ var import_packer2 = require("@rrweb/packer");
335
337
  var ActionLensRc = class {
336
338
  sessionId = (0, import_uuid.v4)();
337
339
  stopFnForStore = null;
338
- userId = null;
340
+ userId = "anonymous";
341
+ // ユーザーIDはプロジェクトIDと組み合わせて一意にする
339
342
  db = null;
340
343
  prefix = "";
341
344
  userData = null;
@@ -349,33 +352,26 @@ var ActionLensRc = class {
349
352
  constructor() {
350
353
  this.db = db;
351
354
  }
352
- async init(_userId, projectId, userMeta, metaData = {}, _db = null, prefix = "") {
355
+ async init(projectId, _db = null, prefix = "") {
353
356
  try {
354
- this.originalUserId = _userId;
355
357
  console.log("ActionLensRc\u958B\u59CB");
356
358
  if (!projectId) {
357
359
  console.error("projectId\u304CNULL\u3067\u3059");
358
- throw new Error("projectId\u304CNULL\u3067\u3059");
360
+ return;
359
361
  }
360
362
  this.projectId = projectId;
361
363
  this.prefix = prefix;
362
- this.userMeta = userMeta;
363
- this.metaData = metaData;
364
- if (!_userId) {
365
- console.error("userId\u304CNULL\u3067\u3059");
366
- throw new Error("userId\u304CNULL\u3067\u3059");
367
- }
368
364
  if (!this.db && _db) {
369
365
  console.error("Firestore\u304C\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093");
370
366
  this.db = _db;
371
367
  }
372
368
  if (!this.db) {
373
369
  console.error("Firestore\u304C\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093");
374
- throw new Error("Firestore\u304C\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093");
370
+ return;
375
371
  }
376
372
  if (!this.projectId) {
377
373
  console.error("projectId\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093");
378
- throw new Error("projectId\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093");
374
+ return;
379
375
  }
380
376
  const _doc = await (0, import_firestore3.getDoc)(
381
377
  (0, import_firestore3.doc)((0, import_firestore3.collection)(this.db, `${this.prefix}project`), this.projectId)
@@ -399,89 +395,133 @@ var ActionLensRc = class {
399
395
  },
400
396
  { merge: true }
401
397
  );
402
- throw new Error("\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u304C\u5B58\u5728\u3057\u307E\u305B\u3093");
398
+ console.warn("\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u304C\u5B58\u5728\u3057\u307E\u305B\u3093");
399
+ return;
403
400
  }
404
401
  if (!this.projectData?.isActivate) {
405
402
  console.warn("\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306F\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u3059\u3002\u9332\u753B\u3092\u958B\u59CB\u3067\u304D\u307E\u305B\u3093\u3002");
406
- throw new Error(
407
- "\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306F\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u3059\u3002\u9332\u753B\u3092\u958B\u59CB\u3067\u304D\u307E\u305B\u3093\u3002"
408
- );
403
+ return;
409
404
  }
410
- this.userId = projectData.id + "-" + this.originalUserId;
411
- this.prefix = this.prefix;
412
- this.projectId = this.projectId;
413
- const user = await (0, import_firestore3.getDoc)(
414
- (0, import_firestore3.doc)((0, import_firestore3.collection)(this.db, `${this.prefix}user`), this.userId)
405
+ await this.startRrwebRecordingForStore();
406
+ return;
407
+ } catch (error) {
408
+ console.error("\u521D\u671F\u5316\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F:", error);
409
+ return;
410
+ }
411
+ }
412
+ async setUser(_userId, userMeta, metaData = {}) {
413
+ if (!this.db) {
414
+ console.error("Firestore\u304C\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093");
415
+ return;
416
+ }
417
+ if (!this.projectData) {
418
+ console.error("\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u30C7\u30FC\u30BF\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093");
419
+ return;
420
+ }
421
+ this.originalUserId = _userId;
422
+ this.userMeta = userMeta;
423
+ this.metaData = metaData;
424
+ if (!_userId) {
425
+ console.error("userId\u304CNULL\u3067\u3059");
426
+ return;
427
+ }
428
+ this.userId = this.projectData.id + "-" + this.originalUserId;
429
+ this.prefix = this.prefix;
430
+ this.projectId = this.projectId;
431
+ const user = await (0, import_firestore3.getDoc)(
432
+ (0, import_firestore3.doc)((0, import_firestore3.collection)(this.db, `${this.prefix}user`), this.userId)
433
+ );
434
+ if (!this.db) {
435
+ console.error("Firestore\u304C\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093");
436
+ return;
437
+ }
438
+ const userData = user.data();
439
+ if (!userData?.id || !user.exists()) {
440
+ await (0, import_firestore3.setDoc)(
441
+ (0, import_firestore3.doc)(
442
+ (0, import_firestore3.collection)(this.db, `${this.prefix}user`),
443
+ this.projectData.id + "-" + this.originalUserId
444
+ ),
445
+ {
446
+ ...this.userMeta || {},
447
+ metaData: this.metaData,
448
+ id: this.userId,
449
+ originalUserId: this.originalUserId,
450
+ type: "customer",
451
+ organizationId: this.projectData?.organizationId || "",
452
+ projectIds: [this.projectId],
453
+ createAt: /* @__PURE__ */ new Date(),
454
+ updateAt: /* @__PURE__ */ new Date(),
455
+ createdBy: this.userId,
456
+ updatedBy: this.userId,
457
+ hidden: false,
458
+ hiddenBy: ""
459
+ },
460
+ { merge: true }
415
461
  );
416
- if (!this.db) {
417
- console.error("Firestore\u304C\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093");
418
- throw new Error("Firestore\u304C\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093");
462
+ this.userData = {
463
+ ...this.userMeta || {},
464
+ metaData: this.metaData,
465
+ id: this.userId,
466
+ originalUserId: this.originalUserId,
467
+ type: "customer",
468
+ organizationId: this.projectData?.organizationId || "",
469
+ projectIds: [this.projectId],
470
+ createAt: /* @__PURE__ */ new Date(),
471
+ updateAt: /* @__PURE__ */ new Date(),
472
+ createdBy: this.userId,
473
+ updatedBy: this.userId,
474
+ hidden: false,
475
+ hiddenBy: ""
476
+ };
477
+ } else {
478
+ this.userData = user.data();
479
+ if (!this.userData?.projectIds?.includes(this.projectId || "")) {
480
+ await (0, import_firestore3.setDoc)(
481
+ (0, import_firestore3.doc)(
482
+ (0, import_firestore3.collection)(this.db, `${this.prefix}user`),
483
+ this.projectData.id + "-" + this.originalUserId
484
+ ),
485
+ {
486
+ projectIds: [...this.userData?.projectIds || [], this.projectId],
487
+ updateAt: /* @__PURE__ */ new Date(),
488
+ updatedBy: this.userId
489
+ },
490
+ { merge: true }
491
+ );
419
492
  }
420
- const userData = user.data();
421
- if (!userData?.id || !user.exists()) {
493
+ if (this.userData?.organizationId !== this.projectData.organizationId) {
422
494
  await (0, import_firestore3.setDoc)(
423
495
  (0, import_firestore3.doc)(
424
496
  (0, import_firestore3.collection)(this.db, `${this.prefix}user`),
425
- projectData.id + "-" + this.originalUserId
497
+ this.projectData.id + "-" + this.originalUserId
426
498
  ),
427
499
  {
428
- ...this.userMeta || {},
429
- metaData: this.metaData,
430
- id: this.userId,
431
- originalUserId: this.originalUserId,
432
- type: "customer",
433
- organizationId: projectData?.organizationId || "",
434
- projectIds: [this.projectId],
435
- createAt: /* @__PURE__ */ new Date(),
500
+ organizationId: this.projectData.organizationId ? this.projectData.organizationId : this.userData?.organizationId,
436
501
  updateAt: /* @__PURE__ */ new Date(),
437
- createdBy: this.userId,
438
- updatedBy: this.userId,
439
- hidden: false,
440
- hiddenBy: ""
502
+ updatedBy: this.userId
441
503
  },
442
504
  { merge: true }
443
505
  );
444
- this.userData = user.data();
445
- } else {
446
- this.userData = user.data();
447
- if (!this.userData?.projectIds?.includes(this.projectId || "")) {
448
- await (0, import_firestore3.setDoc)(
449
- (0, import_firestore3.doc)(
450
- (0, import_firestore3.collection)(this.db, `${this.prefix}user`),
451
- projectData.id + "-" + this.originalUserId
452
- ),
453
- {
454
- projectIds: [
455
- ...this.userData?.projectIds || [],
456
- this.projectId
457
- ],
458
- updateAt: /* @__PURE__ */ new Date(),
459
- updatedBy: this.userId
460
- },
461
- { merge: true }
462
- );
463
- }
464
- if (this.userData?.organizationId !== projectData.organizationId) {
465
- await (0, import_firestore3.setDoc)(
466
- (0, import_firestore3.doc)(
467
- (0, import_firestore3.collection)(this.db, `${this.prefix}user`),
468
- projectData.id + "-" + this.originalUserId
469
- ),
470
- {
471
- organizationId: projectData.organizationId ? projectData.organizationId : this.userData?.organizationId,
472
- updateAt: /* @__PURE__ */ new Date(),
473
- updatedBy: this.userId
474
- },
475
- { merge: true }
476
- );
477
- }
478
506
  }
479
- await this.startRrwebRecordingForStore();
480
- return;
481
- } catch (error) {
482
- console.error("\u521D\u671F\u5316\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F:", error);
483
- throw error;
484
507
  }
508
+ const ActionRecordSessionRef = (0, import_firestore3.doc)(
509
+ (0, import_firestore3.collection)(this.db, `${this.prefix}ActionRecordSession`),
510
+ this.sessionId
511
+ );
512
+ await (0, import_firestore3.setDoc)(
513
+ ActionRecordSessionRef,
514
+ {
515
+ userId: this.projectData.id + "-" + this.originalUserId,
516
+ originalUserId: this.originalUserId,
517
+ userName: this.userMeta.name || "anonymous",
518
+ userEmail: this.userMeta.email || "",
519
+ userMeta: this.userMeta,
520
+ updatedBy: this.userId
521
+ },
522
+ { merge: true }
523
+ );
524
+ return;
485
525
  }
486
526
  // コンソールログをキャプチャ
487
527
  startConsoleRecording() {
@@ -545,7 +585,7 @@ var ActionLensRc = class {
545
585
  try {
546
586
  if (this.stopFnForStore) return;
547
587
  const _sessionId = this.sessionId;
548
- const userId = this.userId || "unknown";
588
+ const userId = this.userId || "anonymous";
549
589
  const originalUserId = this.originalUserId || "";
550
590
  const _db = this.db;
551
591
  const prefix = this.prefix;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/player.ts","../src/utils/index.ts","../src/record.ts","../src/utils/date.ts"],"sourcesContent":["export * from \"./player\";\nexport * from \"./record\";\nimport \"./style.css\";\nexport * from \"./utils/date\";\n","import {\n doc,\n collection,\n setDoc,\n addDoc,\n where,\n query,\n getDocs,\n orderBy,\n Firestore,\n getDoc,\n} from \"firebase/firestore\";\nimport {\n ActionRecord,\n ActionRecordSession,\n Project,\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<void> {\n try {\n // 1. Firestoreからデータを取得\n\n const q = query(\n collection(this.db, `${this.prefix}ActionRecord`),\n where(\"sessionId\", \"==\", sessionId),\n orderBy(\"timeStamp\", \"asc\")\n );\n\n const querySnapshot = await getDocs(q);\n const events = querySnapshot.docs.map((doc) => {\n const data = doc.data() as ActionRecord;\n return JSON.parse(data.rrwebRecord);\n });\n console.log(\"events\", events);\n if (events.length === 0) {\n console.warn(\n `セッションID ${sessionId} のデータが見つかりませんでした。`\n );\n return;\n }\n\n const targetDiv = document.getElementById(this.targetDivId);\n if (!targetDiv) {\n throw new Error(\n `ID ${this.targetDivId} のdiv要素が見つかりませんでした。`\n );\n }\n\n // クラスを追加\n targetDiv.classList.add(\"replayer-container\");\n\n // 3. Replayerを初期化\n this.replayer = new Replayer(events, {\n 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 console.log(`セッションID ${sessionId} の再生を開始しました。`);\n this.setTimeoutTimeline();\n } catch (error) {\n console.error(\"再生エラー:\", error);\n throw error;\n }\n }\n\n // カスタムイベントを処理\n private handleCustomEvent(event: any) {\n if (!event.data || !event.data.type) return;\n\n const { timestamp } = event;\n const timeString = new Date(timestamp).toISOString();\n\n switch (event.data.type) {\n case \"console\":\n const { method, args } = event.data;\n this.displayEvent(\n `[${timeString}] Console ${method}: ${args.join(\", \")}`,\n \"console\"\n );\n\n break;\n case \"navigation\":\n const { url } = event.data;\n this.displayEvent(`[${timeString}] Navigation to ${url}`, \"navigation\");\n break;\n case \"performance\":\n const { name, entryType, duration } = event.data;\n this.displayEvent(\n `[${timeString}] Performance ${entryType}: ${name} (${duration}ms)`,\n \"performance\"\n );\n break;\n default:\n console.warn(\"不明なカスタムイベント:\", event.data.type);\n }\n }\n\n // イベントをオーバーレイに表示\n private displayEvent(message: string, eventType: string) {\n if (!this.overlayContainer) return;\n\n const eventDiv = document.createElement(\"div\");\n eventDiv.style.padding = \"5px\";\n eventDiv.style.borderBottom = \"1px solid rgba(255, 255, 255, 0.2)\";\n\n // イベントタイプに応じた色\n const colors: { [key: string]: string } = {\n console: \"#00cc00\",\n navigation: \"#3399ff\",\n performance: \"#ff9900\",\n };\n eventDiv.style.color = colors[eventType] || \"white\";\n\n eventDiv.innerText = message;\n this.overlayContainer.appendChild(eventDiv);\n\n // 最新のイベントが表示されるようスクロール\n this.overlayContainer.scrollTop = this.overlayContainer.scrollHeight;\n\n // 5秒後にフェードアウト\n setTimeout(() => {\n eventDiv.style.transition = \"opacity 1s\";\n eventDiv.style.opacity = \"0\";\n setTimeout(() => eventDiv.remove(), 1000);\n }, 5000);\n }\n setReplayTime(time: number) {\n if (this.replayer) {\n this.replayer.pause(time);\n this.currentTime = time;\n this.playerStatus = \"stopped\";\n }\n }\n\n setTimeoutTimeline() {\n this.setIntervalId = setInterval(() => {\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }, 10);\n }\n endTimeoutTimeline() {\n if (this.setIntervalId) {\n clearTimeout(this.setIntervalId);\n this.setIntervalId = null;\n }\n }\n\n // 再生を停止\n stopReplay() {\n this.endTimeoutTimeline();\n if (this.replayer) {\n this.replayer.pause();\n this.playerStatus = \"stopped\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }\n }\n restartReplay() {\n this.setTimeoutTimeline();\n if (this.replayer) {\n const offset = this.replayer.getCurrentTime();\n console.log(\"offset\", offset);\n this.replayer.play(offset);\n this.playerStatus = \"playing\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }\n }\n getCurrentTime() {\n if (this.replayer) {\n return this.replayer.getCurrentTime();\n }\n return 0;\n }\n\n resetReplayer() {\n this.endTimeoutTimeline();\n this.playerStatus = \"stopped\";\n this.currentTime = 0;\n\n if (this.replayer) {\n this.replayer.pause();\n this.replayer.destroy();\n this.replayer = null;\n }\n if (this.overlayContainer) {\n this.overlayContainer.remove();\n this.overlayContainer = null;\n }\n }\n async 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 async fetchSessionList(projectId: string) {\n try {\n const q = query(\n collection(this.db, `${this.prefix}ActionRecordSession`),\n where(\"projectId\", \"==\", projectId),\n orderBy(\"startTime\", \"desc\")\n );\n const usersStore: { [userId: string]: User<\"operator\"> } = {};\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<\"operator\">;\n }\n\n return { ...data, userData: usersStore[data.userId] };\n });\n const sessions: (ActionRecordSession & { userData: User<\"operator\"> })[] =\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 { ActionRecord, Project, User } 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 = null;\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 constructor() {\n this.db = db; // Firestoreの初期化\n }\n\n async init(\n _userId: string | null,\n projectId: string | null,\n userMeta: { name: string; email: string },\n metaData: Record<string, any> = {},\n _db: Firestore | null = null,\n prefix: string = \"\"\n ) {\n try {\n this.originalUserId = _userId; // 元のユーザーIDを保存\n console.log(\"ActionLensRc開始\");\n if (!projectId) {\n console.error(\"projectIdがNULLです\");\n throw new Error(\"projectIdがNULLです\");\n }\n this.projectId = projectId;\n\n this.prefix = prefix;\n this.userMeta = userMeta;\n this.metaData = metaData;\n\n if (!_userId) {\n console.error(\"userIdがNULLです\");\n throw new Error(\"userIdがNULLです\");\n }\n\n if (!this.db && _db) {\n console.error(\"Firestoreが初期化されていません\");\n this.db = _db;\n }\n if (!this.db) {\n console.error(\"Firestoreが初期化されていません\");\n throw new Error(\"Firestoreが初期化されていません\");\n }\n\n if (!this.projectId) {\n console.error(\"projectIdが設定されていません\");\n throw new Error(\"projectIdが設定されていません\");\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 throw new Error(\"プロジェクトが存在しません\");\n }\n if (!this.projectData?.isActivate) {\n console.warn(\"プロジェクトは非アクティブです。録画を開始できません。\");\n throw new Error(\n \"プロジェクトは非アクティブです。録画を開始できません。\"\n );\n }\n this.userId = 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 throw new Error(\"Firestoreが初期化されていません\");\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 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: 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 = user.data() 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 projectData.id + \"-\" + this.originalUserId\n ),\n {\n projectIds: [\n ...(this.userData?.projectIds || []),\n this.projectId,\n ],\n updateAt: new Date(),\n updatedBy: this.userId,\n } as Partial<User<\"customer\">>,\n { merge: true }\n );\n }\n\n if (this.userData?.organizationId !== projectData.organizationId) {\n await setDoc(\n doc(\n collection(this.db, `${this.prefix}user`),\n projectData.id + \"-\" + this.originalUserId\n ),\n {\n organizationId: projectData.organizationId\n ? 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\n await this.startRrwebRecordingForStore();\n\n // this.startTimelineRecording();\n return;\n } catch (error) {\n console.error(\"初期化中にエラーが発生しました:\", error);\n throw error;\n }\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 || \"unknown\";\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","../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"]}
package/dist/index.mjs CHANGED
@@ -6,7 +6,8 @@ import {
6
6
  query,
7
7
  getDocs,
8
8
  orderBy,
9
- getDoc
9
+ getDoc,
10
+ limit
10
11
  } from "firebase/firestore";
11
12
  import { Replayer } from "rrweb";
12
13
 
@@ -79,7 +80,7 @@ var ActionLensPlayer = class {
79
80
  console.warn(
80
81
  `\u30BB\u30C3\u30B7\u30E7\u30F3ID ${sessionId} \u306E\u30C7\u30FC\u30BF\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002`
81
82
  );
82
- return;
83
+ return [];
83
84
  }
84
85
  const targetDiv = document.getElementById(this.targetDivId);
85
86
  if (!targetDiv) {
@@ -133,6 +134,7 @@ var ActionLensPlayer = class {
133
134
  this.playerStatus = "playing";
134
135
  console.log(`\u30BB\u30C3\u30B7\u30E7\u30F3ID ${sessionId} \u306E\u518D\u751F\u3092\u958B\u59CB\u3057\u307E\u3057\u305F\u3002`);
135
136
  this.setTimeoutTimeline();
137
+ return events.map((e) => unpack(e));
136
138
  } catch (error) {
137
139
  console.error("\u518D\u751F\u30A8\u30E9\u30FC:", error);
138
140
  throw error;
@@ -279,12 +281,13 @@ var ActionLensPlayer = class {
279
281
  throw e;
280
282
  }
281
283
  }
282
- async fetchSessionList(projectId) {
284
+ async fetchSessionList(projectId, limitNum = 20) {
283
285
  try {
284
286
  const q = query(
285
287
  collection(this.db, `${this.prefix}ActionRecordSession`),
286
288
  where("projectId", "==", projectId),
287
- orderBy("startTime", "desc")
289
+ orderBy("startTime", "desc"),
290
+ limit(limitNum)
288
291
  );
289
292
  const usersStore = {};
290
293
  const querySnapshot = await getDocs(q);
@@ -318,7 +321,8 @@ import { pack } from "@rrweb/packer";
318
321
  var ActionLensRc = class {
319
322
  sessionId = uuidv4();
320
323
  stopFnForStore = null;
321
- userId = null;
324
+ userId = "anonymous";
325
+ // ユーザーIDはプロジェクトIDと組み合わせて一意にする
322
326
  db = null;
323
327
  prefix = "";
324
328
  userData = null;
@@ -332,33 +336,26 @@ var ActionLensRc = class {
332
336
  constructor() {
333
337
  this.db = db;
334
338
  }
335
- async init(_userId, projectId, userMeta, metaData = {}, _db = null, prefix = "") {
339
+ async init(projectId, _db = null, prefix = "") {
336
340
  try {
337
- this.originalUserId = _userId;
338
341
  console.log("ActionLensRc\u958B\u59CB");
339
342
  if (!projectId) {
340
343
  console.error("projectId\u304CNULL\u3067\u3059");
341
- throw new Error("projectId\u304CNULL\u3067\u3059");
344
+ return;
342
345
  }
343
346
  this.projectId = projectId;
344
347
  this.prefix = prefix;
345
- this.userMeta = userMeta;
346
- this.metaData = metaData;
347
- if (!_userId) {
348
- console.error("userId\u304CNULL\u3067\u3059");
349
- throw new Error("userId\u304CNULL\u3067\u3059");
350
- }
351
348
  if (!this.db && _db) {
352
349
  console.error("Firestore\u304C\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093");
353
350
  this.db = _db;
354
351
  }
355
352
  if (!this.db) {
356
353
  console.error("Firestore\u304C\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093");
357
- throw new Error("Firestore\u304C\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093");
354
+ return;
358
355
  }
359
356
  if (!this.projectId) {
360
357
  console.error("projectId\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093");
361
- throw new Error("projectId\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093");
358
+ return;
362
359
  }
363
360
  const _doc = await getDoc2(
364
361
  doc2(collection2(this.db, `${this.prefix}project`), this.projectId)
@@ -382,89 +379,133 @@ var ActionLensRc = class {
382
379
  },
383
380
  { merge: true }
384
381
  );
385
- throw new Error("\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u304C\u5B58\u5728\u3057\u307E\u305B\u3093");
382
+ console.warn("\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u304C\u5B58\u5728\u3057\u307E\u305B\u3093");
383
+ return;
386
384
  }
387
385
  if (!this.projectData?.isActivate) {
388
386
  console.warn("\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306F\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u3059\u3002\u9332\u753B\u3092\u958B\u59CB\u3067\u304D\u307E\u305B\u3093\u3002");
389
- throw new Error(
390
- "\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306F\u975E\u30A2\u30AF\u30C6\u30A3\u30D6\u3067\u3059\u3002\u9332\u753B\u3092\u958B\u59CB\u3067\u304D\u307E\u305B\u3093\u3002"
391
- );
387
+ return;
392
388
  }
393
- this.userId = projectData.id + "-" + this.originalUserId;
394
- this.prefix = this.prefix;
395
- this.projectId = this.projectId;
396
- const user = await getDoc2(
397
- doc2(collection2(this.db, `${this.prefix}user`), this.userId)
389
+ await this.startRrwebRecordingForStore();
390
+ return;
391
+ } catch (error) {
392
+ console.error("\u521D\u671F\u5316\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F:", error);
393
+ return;
394
+ }
395
+ }
396
+ async setUser(_userId, userMeta, metaData = {}) {
397
+ if (!this.db) {
398
+ console.error("Firestore\u304C\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093");
399
+ return;
400
+ }
401
+ if (!this.projectData) {
402
+ console.error("\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u30C7\u30FC\u30BF\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093");
403
+ return;
404
+ }
405
+ this.originalUserId = _userId;
406
+ this.userMeta = userMeta;
407
+ this.metaData = metaData;
408
+ if (!_userId) {
409
+ console.error("userId\u304CNULL\u3067\u3059");
410
+ return;
411
+ }
412
+ this.userId = this.projectData.id + "-" + this.originalUserId;
413
+ this.prefix = this.prefix;
414
+ this.projectId = this.projectId;
415
+ const user = await getDoc2(
416
+ doc2(collection2(this.db, `${this.prefix}user`), this.userId)
417
+ );
418
+ if (!this.db) {
419
+ console.error("Firestore\u304C\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093");
420
+ return;
421
+ }
422
+ const userData = user.data();
423
+ if (!userData?.id || !user.exists()) {
424
+ await setDoc2(
425
+ doc2(
426
+ collection2(this.db, `${this.prefix}user`),
427
+ this.projectData.id + "-" + this.originalUserId
428
+ ),
429
+ {
430
+ ...this.userMeta || {},
431
+ metaData: this.metaData,
432
+ id: this.userId,
433
+ originalUserId: this.originalUserId,
434
+ type: "customer",
435
+ organizationId: this.projectData?.organizationId || "",
436
+ projectIds: [this.projectId],
437
+ createAt: /* @__PURE__ */ new Date(),
438
+ updateAt: /* @__PURE__ */ new Date(),
439
+ createdBy: this.userId,
440
+ updatedBy: this.userId,
441
+ hidden: false,
442
+ hiddenBy: ""
443
+ },
444
+ { merge: true }
398
445
  );
399
- if (!this.db) {
400
- console.error("Firestore\u304C\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093");
401
- throw new Error("Firestore\u304C\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093");
446
+ this.userData = {
447
+ ...this.userMeta || {},
448
+ metaData: this.metaData,
449
+ id: this.userId,
450
+ originalUserId: this.originalUserId,
451
+ type: "customer",
452
+ organizationId: this.projectData?.organizationId || "",
453
+ projectIds: [this.projectId],
454
+ createAt: /* @__PURE__ */ new Date(),
455
+ updateAt: /* @__PURE__ */ new Date(),
456
+ createdBy: this.userId,
457
+ updatedBy: this.userId,
458
+ hidden: false,
459
+ hiddenBy: ""
460
+ };
461
+ } else {
462
+ this.userData = user.data();
463
+ if (!this.userData?.projectIds?.includes(this.projectId || "")) {
464
+ await setDoc2(
465
+ doc2(
466
+ collection2(this.db, `${this.prefix}user`),
467
+ this.projectData.id + "-" + this.originalUserId
468
+ ),
469
+ {
470
+ projectIds: [...this.userData?.projectIds || [], this.projectId],
471
+ updateAt: /* @__PURE__ */ new Date(),
472
+ updatedBy: this.userId
473
+ },
474
+ { merge: true }
475
+ );
402
476
  }
403
- const userData = user.data();
404
- if (!userData?.id || !user.exists()) {
477
+ if (this.userData?.organizationId !== this.projectData.organizationId) {
405
478
  await setDoc2(
406
479
  doc2(
407
480
  collection2(this.db, `${this.prefix}user`),
408
- projectData.id + "-" + this.originalUserId
481
+ this.projectData.id + "-" + this.originalUserId
409
482
  ),
410
483
  {
411
- ...this.userMeta || {},
412
- metaData: this.metaData,
413
- id: this.userId,
414
- originalUserId: this.originalUserId,
415
- type: "customer",
416
- organizationId: projectData?.organizationId || "",
417
- projectIds: [this.projectId],
418
- createAt: /* @__PURE__ */ new Date(),
484
+ organizationId: this.projectData.organizationId ? this.projectData.organizationId : this.userData?.organizationId,
419
485
  updateAt: /* @__PURE__ */ new Date(),
420
- createdBy: this.userId,
421
- updatedBy: this.userId,
422
- hidden: false,
423
- hiddenBy: ""
486
+ updatedBy: this.userId
424
487
  },
425
488
  { merge: true }
426
489
  );
427
- this.userData = user.data();
428
- } else {
429
- this.userData = user.data();
430
- if (!this.userData?.projectIds?.includes(this.projectId || "")) {
431
- await setDoc2(
432
- doc2(
433
- collection2(this.db, `${this.prefix}user`),
434
- projectData.id + "-" + this.originalUserId
435
- ),
436
- {
437
- projectIds: [
438
- ...this.userData?.projectIds || [],
439
- this.projectId
440
- ],
441
- updateAt: /* @__PURE__ */ new Date(),
442
- updatedBy: this.userId
443
- },
444
- { merge: true }
445
- );
446
- }
447
- if (this.userData?.organizationId !== projectData.organizationId) {
448
- await setDoc2(
449
- doc2(
450
- collection2(this.db, `${this.prefix}user`),
451
- projectData.id + "-" + this.originalUserId
452
- ),
453
- {
454
- organizationId: projectData.organizationId ? projectData.organizationId : this.userData?.organizationId,
455
- updateAt: /* @__PURE__ */ new Date(),
456
- updatedBy: this.userId
457
- },
458
- { merge: true }
459
- );
460
- }
461
490
  }
462
- await this.startRrwebRecordingForStore();
463
- return;
464
- } catch (error) {
465
- console.error("\u521D\u671F\u5316\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F:", error);
466
- throw error;
467
491
  }
492
+ const ActionRecordSessionRef = doc2(
493
+ collection2(this.db, `${this.prefix}ActionRecordSession`),
494
+ this.sessionId
495
+ );
496
+ await setDoc2(
497
+ ActionRecordSessionRef,
498
+ {
499
+ userId: this.projectData.id + "-" + this.originalUserId,
500
+ originalUserId: this.originalUserId,
501
+ userName: this.userMeta.name || "anonymous",
502
+ userEmail: this.userMeta.email || "",
503
+ userMeta: this.userMeta,
504
+ updatedBy: this.userId
505
+ },
506
+ { merge: true }
507
+ );
508
+ return;
468
509
  }
469
510
  // コンソールログをキャプチャ
470
511
  startConsoleRecording() {
@@ -528,7 +569,7 @@ var ActionLensRc = class {
528
569
  try {
529
570
  if (this.stopFnForStore) return;
530
571
  const _sessionId = this.sessionId;
531
- const userId = this.userId || "unknown";
572
+ const userId = this.userId || "anonymous";
532
573
  const originalUserId = this.originalUserId || "";
533
574
  const _db = this.db;
534
575
  const prefix = this.prefix;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/player.ts","../src/utils/index.ts","../src/record.ts","../src/utils/date.ts"],"sourcesContent":["import {\n doc,\n collection,\n setDoc,\n addDoc,\n where,\n query,\n getDocs,\n orderBy,\n Firestore,\n getDoc,\n} from \"firebase/firestore\";\nimport {\n ActionRecord,\n ActionRecordSession,\n Project,\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<void> {\n try {\n // 1. Firestoreからデータを取得\n\n const q = query(\n collection(this.db, `${this.prefix}ActionRecord`),\n where(\"sessionId\", \"==\", sessionId),\n orderBy(\"timeStamp\", \"asc\")\n );\n\n const querySnapshot = await getDocs(q);\n const events = querySnapshot.docs.map((doc) => {\n const data = doc.data() as ActionRecord;\n return JSON.parse(data.rrwebRecord);\n });\n console.log(\"events\", events);\n if (events.length === 0) {\n console.warn(\n `セッションID ${sessionId} のデータが見つかりませんでした。`\n );\n return;\n }\n\n const targetDiv = document.getElementById(this.targetDivId);\n if (!targetDiv) {\n throw new Error(\n `ID ${this.targetDivId} のdiv要素が見つかりませんでした。`\n );\n }\n\n // クラスを追加\n targetDiv.classList.add(\"replayer-container\");\n\n // 3. Replayerを初期化\n this.replayer = new Replayer(events, {\n 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 console.log(`セッションID ${sessionId} の再生を開始しました。`);\n this.setTimeoutTimeline();\n } catch (error) {\n console.error(\"再生エラー:\", error);\n throw error;\n }\n }\n\n // カスタムイベントを処理\n private handleCustomEvent(event: any) {\n if (!event.data || !event.data.type) return;\n\n const { timestamp } = event;\n const timeString = new Date(timestamp).toISOString();\n\n switch (event.data.type) {\n case \"console\":\n const { method, args } = event.data;\n this.displayEvent(\n `[${timeString}] Console ${method}: ${args.join(\", \")}`,\n \"console\"\n );\n\n break;\n case \"navigation\":\n const { url } = event.data;\n this.displayEvent(`[${timeString}] Navigation to ${url}`, \"navigation\");\n break;\n case \"performance\":\n const { name, entryType, duration } = event.data;\n this.displayEvent(\n `[${timeString}] Performance ${entryType}: ${name} (${duration}ms)`,\n \"performance\"\n );\n break;\n default:\n console.warn(\"不明なカスタムイベント:\", event.data.type);\n }\n }\n\n // イベントをオーバーレイに表示\n private displayEvent(message: string, eventType: string) {\n if (!this.overlayContainer) return;\n\n const eventDiv = document.createElement(\"div\");\n eventDiv.style.padding = \"5px\";\n eventDiv.style.borderBottom = \"1px solid rgba(255, 255, 255, 0.2)\";\n\n // イベントタイプに応じた色\n const colors: { [key: string]: string } = {\n console: \"#00cc00\",\n navigation: \"#3399ff\",\n performance: \"#ff9900\",\n };\n eventDiv.style.color = colors[eventType] || \"white\";\n\n eventDiv.innerText = message;\n this.overlayContainer.appendChild(eventDiv);\n\n // 最新のイベントが表示されるようスクロール\n this.overlayContainer.scrollTop = this.overlayContainer.scrollHeight;\n\n // 5秒後にフェードアウト\n setTimeout(() => {\n eventDiv.style.transition = \"opacity 1s\";\n eventDiv.style.opacity = \"0\";\n setTimeout(() => eventDiv.remove(), 1000);\n }, 5000);\n }\n setReplayTime(time: number) {\n if (this.replayer) {\n this.replayer.pause(time);\n this.currentTime = time;\n this.playerStatus = \"stopped\";\n }\n }\n\n setTimeoutTimeline() {\n this.setIntervalId = setInterval(() => {\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }, 10);\n }\n endTimeoutTimeline() {\n if (this.setIntervalId) {\n clearTimeout(this.setIntervalId);\n this.setIntervalId = null;\n }\n }\n\n // 再生を停止\n stopReplay() {\n this.endTimeoutTimeline();\n if (this.replayer) {\n this.replayer.pause();\n this.playerStatus = \"stopped\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }\n }\n restartReplay() {\n this.setTimeoutTimeline();\n if (this.replayer) {\n const offset = this.replayer.getCurrentTime();\n console.log(\"offset\", offset);\n this.replayer.play(offset);\n this.playerStatus = \"playing\";\n this.currentTime = this.replayer?.getCurrentTime() || 0;\n }\n }\n getCurrentTime() {\n if (this.replayer) {\n return this.replayer.getCurrentTime();\n }\n return 0;\n }\n\n resetReplayer() {\n this.endTimeoutTimeline();\n this.playerStatus = \"stopped\";\n this.currentTime = 0;\n\n if (this.replayer) {\n this.replayer.pause();\n this.replayer.destroy();\n this.replayer = null;\n }\n if (this.overlayContainer) {\n this.overlayContainer.remove();\n this.overlayContainer = null;\n }\n }\n async 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 async fetchSessionList(projectId: string) {\n try {\n const q = query(\n collection(this.db, `${this.prefix}ActionRecordSession`),\n where(\"projectId\", \"==\", projectId),\n orderBy(\"startTime\", \"desc\")\n );\n const usersStore: { [userId: string]: User<\"operator\"> } = {};\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<\"operator\">;\n }\n\n return { ...data, userData: usersStore[data.userId] };\n });\n const sessions: (ActionRecordSession & { userData: User<\"operator\"> })[] =\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 { ActionRecord, Project, User } 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 = null;\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 constructor() {\n this.db = db; // Firestoreの初期化\n }\n\n async init(\n _userId: string | null,\n projectId: string | null,\n userMeta: { name: string; email: string },\n metaData: Record<string, any> = {},\n _db: Firestore | null = null,\n prefix: string = \"\"\n ) {\n try {\n this.originalUserId = _userId; // 元のユーザーIDを保存\n console.log(\"ActionLensRc開始\");\n if (!projectId) {\n console.error(\"projectIdがNULLです\");\n throw new Error(\"projectIdがNULLです\");\n }\n this.projectId = projectId;\n\n this.prefix = prefix;\n this.userMeta = userMeta;\n this.metaData = metaData;\n\n if (!_userId) {\n console.error(\"userIdがNULLです\");\n throw new Error(\"userIdがNULLです\");\n }\n\n if (!this.db && _db) {\n console.error(\"Firestoreが初期化されていません\");\n this.db = _db;\n }\n if (!this.db) {\n console.error(\"Firestoreが初期化されていません\");\n throw new Error(\"Firestoreが初期化されていません\");\n }\n\n if (!this.projectId) {\n console.error(\"projectIdが設定されていません\");\n throw new Error(\"projectIdが設定されていません\");\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 throw new Error(\"プロジェクトが存在しません\");\n }\n if (!this.projectData?.isActivate) {\n console.warn(\"プロジェクトは非アクティブです。録画を開始できません。\");\n throw new Error(\n \"プロジェクトは非アクティブです。録画を開始できません。\"\n );\n }\n this.userId = 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 throw new Error(\"Firestoreが初期化されていません\");\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 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: 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 = user.data() 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 projectData.id + \"-\" + this.originalUserId\n ),\n {\n projectIds: [\n ...(this.userData?.projectIds || []),\n this.projectId,\n ],\n updateAt: new Date(),\n updatedBy: this.userId,\n } as Partial<User<\"customer\">>,\n { merge: true }\n );\n }\n\n if (this.userData?.organizationId !== projectData.organizationId) {\n await setDoc(\n doc(\n collection(this.db, `${this.prefix}user`),\n projectData.id + \"-\" + this.originalUserId\n ),\n {\n organizationId: projectData.organizationId\n ? 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\n await this.startRrwebRecordingForStore();\n\n // this.startTimelineRecording();\n return;\n } catch (error) {\n console.error(\"初期化中にエラーが発生しました:\", error);\n throw error;\n }\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 || \"unknown\";\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","../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"]}
package/package.json CHANGED
@@ -38,5 +38,5 @@
38
38
  },
39
39
  "type": "commonjs",
40
40
  "types": "./dist/index.d.ts",
41
- "version": "1.0.70"
41
+ "version": "1.0.72"
42
42
  }