{"version":3,"file":"xxmachina-components-services-recording.mjs","sources":["../../../../../packages/@xxmachina/components/src/lib/services/recording/recording.service.ts","../../../../../packages/@xxmachina/components/src/lib/services/recording/xxmachina-components-services-recording.ts"],"sourcesContent":["import { Injectable, computed, signal } from '@angular/core';\nimport fixWebmDuration from 'fix-webm-duration';\nimport dayjs from 'dayjs';\nimport { filter, interval, map, Observable } from 'rxjs';\nimport { toSignal } from '@angular/core/rxjs-interop';\n\n@Injectable({ providedIn: 'root' })\nexport class RecordingService {\n\n  constructor() {\n    // this.blobEvent$.pipe(\n    //   filter((event) => event.data.size > 0),\n    // ).subscribe((event) => {\n    //   this.recordedChunks.update((current) => ([...current, event.data]));\n    // });\n  }\n\n  readonly stream = signal<MediaStream | null>(null);\n  readonly recorder = computed(() => this.stream() ? new MediaRecorder(this.stream()!) : null);\n  // readonly blobEvent = computedAsync(() => {\n  //   return new Observable<BlobEvent>((subscriber) => {\n  //     this.recorder().ondataavailable = (event) => subscriber.next(event);\n  //     this.recorder().onstop = () => subscriber.complete();\n  //     this.recorder().onerror = (error) => subscriber.error(error);\n  //   });\n  // });\n  // readonly blobEvent$ = toObservable(this.blobEvent);\n  readonly isRecording$ = interval(500).pipe(map(() => this.recorder()?.state === 'recording'));\n  readonly isRecording = toSignal(this.isRecording$);\n  readonly recordedChunks = signal<Blob[]>([]);\n  readonly startTime = signal<dayjs.Dayjs>(null as unknown as dayjs.Dayjs);\n\n  async stopStream() {\n    if (this.stream()) {\n      this.stream()!.getTracks().forEach(track => track.stop());\n      this.stream.set(null);\n    }\n  }\n\n  async start(stream: MediaStream = this.stream()!) {\n    this.recordedChunks.set([]);\n    this.stream.set(stream);\n\n    new Observable<BlobEvent>((subscriber) => {\n      this.recorder()!.ondataavailable = (event) => subscriber.next(event);\n      this.recorder()!.onstop = () => subscriber.complete();\n      this.recorder()!.onerror = (error) => subscriber.error(error);\n    }).pipe(\n      filter((event) => event.data.size > 0),\n    ).subscribe((event) => {\n      this.recordedChunks.update((current) => ([...current, event.data]));\n    });\n\n    this.startTime.set(dayjs());\n    this.recorder()!.start(100);\n  }\n\n  async stop() {\n    if (this.recorder()) this.recorder()!.stop();\n    const blob = new Blob(this.recordedChunks(), { type: 'video/webm' });\n    this.recordedChunks.set([]);\n    const time = dayjs().diff(this.startTime(), 'millisecond');\n    this.startTime.set(null as unknown as dayjs.Dayjs);\n    return fixWebmDuration(blob, time);\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}