{"version":3,"file":"sync-player.mjs","sources":["../src/Types.ts","../src/utils/playbackrate.ts","../src/Players/AtomPlayer.ts","../src/Players/ClusterPlayer/index.ts","../src/Players/NativeVideoPlayer/utils.ts","../src/Players/NativeVideoPlayer/index.ts","../src/Players/VideoPlayer/ChromeAtomPlayer/index.ts","../src/Players/VideoPlayer/SafariAtomPlayer/index.ts","../src/Players/VideoPlayer/index.ts","../src/Players/WhiteboardPlayer/index.ts","../src/Players/TickPlayer/index.ts","../src/Players/OffsetPlayer/index.ts","../src/Players/SelectionPlayer/index.ts","../src/index.ts"],"sourcesContent":["export const enum SyncPlayerStatus {\n  /** Idle State. It acts like Pause but ready to be changed into any other state. */\n  Ready = \"Ready\",\n  /** Video is paused intentionally. */\n  Pause = \"Pause\",\n  /** Buffering is only happened during playing process. */\n  Buffering = \"Buffering\",\n  /** Video is playing. */\n  Playing = \"Playing\",\n  /** Video is ended. */\n  Ended = \"Ended\",\n}\n","export function normalizePlaybackRate(rate: number): number {\n  return Math.floor(rate * 1000) / 1000;\n}\n\nexport function isPlaybackRateEqual(rate1: number, rate2: number): boolean {\n  return Math.floor(rate1 * 1000) === Math.floor(rate2 * 1000);\n}\n","import EventEmitter from \"eventemitter3\";\nimport { SideEffectManager } from \"side-effect-manager\";\nimport { SyncPlayerStatus } from \"../Types\";\nimport {\n  isPlaybackRateEqual,\n  normalizePlaybackRate,\n} from \"../utils/playbackrate\";\n\nexport interface AtomPlayerConfig {\n  name?: string;\n}\n\nexport abstract class AtomPlayer extends EventEmitter<AtomPlayerEvents> {\n  public readonly name?: string;\n  private readonly loadInit: Promise<void>;\n\n  /** wait `offset` ms before start playing */\n  public get offset(): number {\n    return this._offset;\n  }\n\n  protected _offset = 0;\n\n  protected constructor(config?: AtomPlayerConfig) {\n    super();\n    this.name = config?.name;\n    this.loadInit = this.init();\n  }\n\n  public get visible(): boolean {\n    return this._visible;\n  }\n\n  public set visible(value: boolean) {\n    if (this._visible !== value) {\n      this._visible = value;\n      this.emit(\"visibilitychange\");\n    }\n  }\n\n  protected _visible = true;\n\n  public get isReady(): boolean {\n    return this._initStatus === AtomPlayerInitStatus.Ready;\n  }\n\n  public get isPlaying(): boolean {\n    return (\n      this._status === SyncPlayerStatus.Playing ||\n      this._status === SyncPlayerStatus.Buffering\n    );\n  }\n\n  public get status(): SyncPlayerStatus {\n    return this._status;\n  }\n\n  public set status(value: SyncPlayerStatus) {\n    if (!this.ignoreSetStatus && this._status !== value) {\n      this._status = value;\n      this.emit(\"status\");\n    }\n  }\n\n  public get currentTime(): number {\n    return this._currentTime;\n  }\n\n  public set currentTime(ms: number) {\n    ms = Math.floor(ms);\n    if (this._currentTime !== ms) {\n      this._currentTime = ms;\n      this.emit(\"timeupdate\");\n    }\n  }\n\n  public get duration(): number {\n    return this._duration;\n  }\n\n  public set duration(ms: number) {\n    ms = Math.floor(ms);\n    if (this._duration !== ms) {\n      this._duration = ms;\n      this.emit(\"durationchange\");\n    }\n  }\n\n  public get playbackRate(): number {\n    return this._playbackRate;\n  }\n\n  public set playbackRate(value: number) {\n    const rate = normalizePlaybackRate(value);\n    if (!isPlaybackRateEqual(this._playbackRate, rate)) {\n      this.setPlaybackRateImpl(rate);\n      this._playbackRate = rate;\n      this.emit(\"ratechange\");\n    }\n  }\n\n  public setPlaybackRate(value: number): void {\n    this.playbackRate = value;\n  }\n\n  // @todo 等待播放器播放完成\n  // private _pPlaying: Promise<void>\n\n  public async play(): Promise<void> {\n    if (!this.isReady) {\n      this.status = SyncPlayerStatus.Buffering;\n      await this.loadInit;\n    }\n\n    if (this._status !== SyncPlayerStatus.Playing) {\n      try {\n        await this.playImpl();\n      } catch (e) {\n        if (\n          this._status !== SyncPlayerStatus.Ready &&\n          this._status !== SyncPlayerStatus.Pause\n        ) {\n          throw e;\n        }\n      }\n    }\n  }\n\n  public async pause(): Promise<void> {\n    if (!this.isReady) {\n      await this.loadInit;\n    }\n\n    if (\n      this._status !== SyncPlayerStatus.Pause &&\n      this._status !== SyncPlayerStatus.Ended\n    ) {\n      this.status = SyncPlayerStatus.Pause;\n      await this.pauseImpl();\n    }\n  }\n\n  public async stop(): Promise<void> {\n    if (!this.isReady) {\n      await this.loadInit;\n    }\n\n    if (this._status !== SyncPlayerStatus.Ended) {\n      // set ended first\n      this.status = SyncPlayerStatus.Ended;\n\n      this.ignoreSetStatus = true;\n      await this.readyImpl(true);\n      await this.stopImpl();\n      this.ignoreSetStatus = false;\n    }\n  }\n\n  public async seek(ms: number): Promise<void> {\n    if (!this.isReady) {\n      await this.loadInit;\n    }\n\n    ms = Math.floor(ms);\n\n    if (ms === this._currentTime) {\n      return;\n    }\n\n    if (ms >= this.duration) {\n      await this.stop();\n      return;\n    }\n\n    const lastStatus = this._status;\n\n    await this.seekImpl(ms);\n\n    switch (lastStatus) {\n      case SyncPlayerStatus.Ready:\n      case SyncPlayerStatus.Ended: {\n        await this.ready();\n        break;\n      }\n      case SyncPlayerStatus.Pause: {\n        await this.pause();\n        break;\n      }\n      case SyncPlayerStatus.Buffering:\n      case SyncPlayerStatus.Playing: {\n        await this.play();\n        break;\n      }\n    }\n  }\n\n  public async ready(silently?: boolean): Promise<void> {\n    if (this._status !== SyncPlayerStatus.Ready) {\n      if (silently !== void 0) {\n        this.ignoreSetStatus = silently;\n      }\n\n      this.status = SyncPlayerStatus.Ready;\n      await this.readyImpl(silently);\n\n      if (silently !== void 0) {\n        this.ignoreSetStatus = false;\n      }\n    }\n  }\n\n  public destroy(): void {\n    this._sideEffect.flushAll();\n  }\n\n  protected abstract readyImpl(silently?: boolean): Promise<void>;\n  protected abstract playImpl(): Promise<void>;\n  protected abstract pauseImpl(): Promise<void>;\n  protected abstract stopImpl(): Promise<void>;\n  protected abstract seekImpl(ms: number): Promise<void>;\n  protected abstract setPlaybackRateImpl(value: number): void;\n\n  protected initImpl(): Promise<void> {\n    return Promise.resolve();\n  }\n\n  protected ignoreSetStatus = false;\n\n  protected _sideEffect = new SideEffectManager();\n\n  private _status: SyncPlayerStatus = SyncPlayerStatus.Ready;\n\n  private _currentTime = 0;\n\n  private _duration = 0;\n\n  private _playbackRate = 1;\n\n  private _initStatus: AtomPlayerInitStatus = AtomPlayerInitStatus.Idle;\n\n  private async init(): Promise<void> {\n    switch (this._initStatus) {\n      case AtomPlayerInitStatus.Ready: {\n        return;\n      }\n      case AtomPlayerInitStatus.Initializing: {\n        return new Promise(resolve => this.once(\"ready\", resolve));\n      }\n      default: {\n        this.ignoreSetStatus = true;\n        this._initStatus = AtomPlayerInitStatus.Initializing;\n        await new Promise(r => setTimeout(r));\n        await this.initImpl();\n        this._initStatus = AtomPlayerInitStatus.Ready;\n        this.emit(\"ready\");\n        this.ignoreSetStatus = false;\n      }\n    }\n  }\n}\n\nexport type AtomPlayerEvents =\n  | \"status\"\n  | \"timeupdate\"\n  | \"durationchange\"\n  | \"ratechange\"\n  | \"visibilitychange\"\n  | \"ready\";\n\nexport declare interface AtomPlayer {\n  addListener<U extends AtomPlayerEvents>(event: U, listener: () => void): this;\n  on<U extends AtomPlayerEvents>(event: U, listener: () => void): this;\n  once<U extends AtomPlayerEvents>(event: U, listener: () => void): this;\n}\n\nconst enum AtomPlayerInitStatus {\n  Idle,\n  Initializing,\n  Ready,\n}\n","import { SyncPlayerStatus } from \"../../Types\";\nimport { isPlaybackRateEqual } from \"../../utils/playbackrate\";\nimport type { AtomPlayerConfig, AtomPlayerEvents } from \"../AtomPlayer\";\nimport { AtomPlayer } from \"../AtomPlayer\";\n\nexport interface ClusterPlayerConfig extends AtomPlayerConfig {\n  rowPlayer: AtomPlayer;\n  colPlayer: AtomPlayer;\n}\n\nexport class ClusterPlayer extends AtomPlayer {\n  private readonly rowPlayer: AtomPlayer;\n  private readonly colPlayer: AtomPlayer;\n\n  private longerPlayer: AtomPlayer;\n\n  public constructor(config: ClusterPlayerConfig) {\n    super({\n      name:\n        config.name ||\n        `{${config.rowPlayer.name || \"unknown\"}-${\n          config.colPlayer.name || \"unknown\"\n        }}`,\n    });\n\n    this.rowPlayer = config.rowPlayer;\n    this.colPlayer = config.colPlayer;\n\n    this.longerPlayer =\n      this.rowPlayer.duration >= this.colPlayer.duration\n        ? this.rowPlayer\n        : this.colPlayer;\n\n    this.duration = this.longerPlayer.duration;\n    this.playbackRate = this.longerPlayer.playbackRate;\n\n    const addAtomListener = (\n      event: AtomPlayerEvents,\n      listener: (emitter: AtomPlayer, receptor: AtomPlayer) => void\n    ): void => {\n      this._sideEffect.add(() => {\n        const handler = (): void => {\n          listener(this.rowPlayer, this.colPlayer);\n        };\n        this.rowPlayer.on(event, handler);\n        return (): void => {\n          this.rowPlayer.off(event, handler);\n        };\n      });\n      this._sideEffect.add(() => {\n        const handler = (): void => {\n          listener(this.colPlayer, this.rowPlayer);\n        };\n        this.colPlayer.on(event, handler);\n        return (): void => {\n          this.colPlayer.off(event, handler);\n        };\n      });\n    };\n\n    addAtomListener(\"status\", (emitter, receptor) => {\n      if (!this.ignoreSetStatus) {\n        this.syncSubPlayer(emitter, receptor);\n        this.updateStatus(emitter, receptor);\n        if (\n          this.rowPlayer.status === SyncPlayerStatus.Playing &&\n          this.colPlayer.status === SyncPlayerStatus.Playing\n        ) {\n          this.startFrameDropCheck();\n        } else {\n          this.stopFrameDropCheck?.();\n        }\n      }\n    });\n\n    addAtomListener(\"timeupdate\", emitter => {\n      if (\n        this.longerPlayer === emitter &&\n        emitter.status !== SyncPlayerStatus.Ended\n      ) {\n        this.currentTime = emitter.currentTime;\n      }\n    });\n\n    addAtomListener(\"durationchange\", (emitter, receptor) => {\n      if (emitter.duration >= this.longerPlayer.duration) {\n        if (emitter !== this.longerPlayer) {\n          this.longerPlayer = emitter;\n        }\n      } else {\n        this.longerPlayer = receptor;\n      }\n      this.duration = this.longerPlayer.duration;\n    });\n\n    addAtomListener(\"ratechange\", emitter => {\n      if (!isPlaybackRateEqual(emitter.playbackRate, this.playbackRate)) {\n        this.playbackRate = emitter.playbackRate;\n      }\n    });\n  }\n\n  public override destroy(): void {\n    super.destroy();\n    this.stopFrameDropCheck?.();\n    this.rowPlayer.destroy();\n    this.colPlayer.destroy();\n  }\n\n  public override get isReady(): boolean {\n    return this.rowPlayer.isReady && this.colPlayer.isReady;\n  }\n\n  public override async ready(silently?: boolean): Promise<void> {\n    await this.readyImpl(silently);\n  }\n\n  public override async play(): Promise<void> {\n    // Do not check this.status !== SyncPlayerStatus.Playing\n    // since one sub-player may not be playing\n    if (this.status !== SyncPlayerStatus.Ended) {\n      await this.playImpl();\n    }\n  }\n\n  public override async pause(): Promise<void> {\n    await this.pauseImpl();\n  }\n\n  public override async stop(): Promise<void> {\n    await this.stopImpl();\n  }\n\n  public override async seek(ms: number): Promise<void> {\n    await this.seekImpl(ms);\n  }\n\n  protected async readyImpl(silently?: boolean): Promise<void> {\n    await this.invokeSubPlayers(player => player.ready(silently));\n  }\n\n  protected async playImpl(): Promise<void> {\n    await this.invokeSubPlayers(player => player.play());\n  }\n\n  protected async pauseImpl(): Promise<void> {\n    await this.invokeSubPlayers(player => player.pause());\n  }\n\n  protected async stopImpl(): Promise<void> {\n    await this.invokeSubPlayers(player => player.stop());\n  }\n\n  protected async seekImpl(ms: number): Promise<void> {\n    await Promise.all([this.rowPlayer.seek(ms), this.colPlayer.seek(ms)]);\n  }\n\n  protected setPlaybackRateImpl(value: number): void {\n    this.rowPlayer.setPlaybackRate(value);\n    this.colPlayer.setPlaybackRate(value);\n  }\n\n  private updateStatus(emitter: AtomPlayer, receptor: AtomPlayer): void {\n    switch (emitter.status) {\n      case SyncPlayerStatus.Ready: {\n        switch (receptor.status) {\n          case SyncPlayerStatus.Ready:\n          case SyncPlayerStatus.Ended: {\n            this.status = SyncPlayerStatus.Ready;\n            break;\n          }\n        }\n        break;\n      }\n\n      case SyncPlayerStatus.Pause: {\n        if (receptor.status !== SyncPlayerStatus.Playing) {\n          this.status = SyncPlayerStatus.Pause;\n        }\n        break;\n      }\n\n      case SyncPlayerStatus.Buffering: {\n        if (receptor.status !== SyncPlayerStatus.Pause) {\n          this.status = SyncPlayerStatus.Buffering;\n        }\n        break;\n      }\n\n      case SyncPlayerStatus.Playing: {\n        switch (receptor.status) {\n          case SyncPlayerStatus.Playing:\n          case SyncPlayerStatus.Ended: {\n            this.status = SyncPlayerStatus.Playing;\n            break;\n          }\n        }\n        break;\n      }\n\n      case SyncPlayerStatus.Ended: {\n        this.status = receptor.status;\n        break;\n      }\n    }\n  }\n\n  private async syncSubPlayer(\n    emitter: AtomPlayer,\n    receptor: AtomPlayer\n  ): Promise<void> {\n    switch (emitter.status) {\n      case SyncPlayerStatus.Pause: {\n        if (receptor.isPlaying) {\n          await receptor.pause();\n        }\n        break;\n      }\n\n      case SyncPlayerStatus.Buffering: {\n        if (receptor.status === SyncPlayerStatus.Playing) {\n          await receptor.ready();\n        }\n        break;\n      }\n\n      case SyncPlayerStatus.Playing: {\n        if (receptor.status === SyncPlayerStatus.Buffering) {\n          await emitter.ready();\n        } else if (\n          receptor.status === SyncPlayerStatus.Ready &&\n          (receptor.duration <= 0 || emitter.currentTime < receptor.duration)\n        ) {\n          await receptor.play();\n        }\n        break;\n      }\n    }\n  }\n\n  private stopFrameDropCheck?: () => void;\n  private startFrameDropCheck(): void {\n    if (this.stopFrameDropCheck) {\n      return;\n    }\n\n    let frameDropCount = 0;\n    const ticket = setInterval(async () => {\n      if (this.status !== SyncPlayerStatus.Playing) {\n        frameDropCount = 0;\n      } else {\n        const diff = this.rowPlayer.currentTime - this.colPlayer.currentTime;\n        frameDropCount = Math.abs(diff) > 1000 ? frameDropCount + 1 : 0;\n        if (frameDropCount >= 2) {\n          // handle frame drops\n          if (diff < 0) {\n            await this.rowPlayer.seek(this.colPlayer.currentTime);\n          } else {\n            await this.colPlayer.seek(this.rowPlayer.currentTime);\n          }\n          frameDropCount = 0;\n        }\n      }\n    }, 2000);\n\n    this.stopFrameDropCheck = (): void => {\n      this.stopFrameDropCheck = undefined;\n      clearInterval(ticket);\n    };\n  }\n\n  private async invokeSubPlayers(\n    action: (player: AtomPlayer) => unknown\n  ): Promise<void> {\n    await Promise.all(\n      [this.rowPlayer, this.colPlayer]\n        .filter(player => player.status !== SyncPlayerStatus.Ended)\n        .map(action)\n    );\n  }\n}\n","export function addEventListener<K extends keyof WindowEventMap>(\n  target: Window,\n  type: K,\n  listener: (this: Window, ev: WindowEventMap[K]) => unknown,\n  options?: boolean | AddEventListenerOptions\n): () => void;\nexport function addEventListener<K extends keyof DocumentEventMap>(\n  target: Document,\n  type: K,\n  listener: (this: Document, ev: DocumentEventMap[K]) => unknown,\n  options?: boolean | AddEventListenerOptions\n): () => void;\nexport function addEventListener<K extends keyof HTMLElementEventMap>(\n  target: HTMLElement,\n  type: K,\n  listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => unknown,\n  options?: boolean | AddEventListenerOptions\n): () => void;\nexport function addEventListener<K extends keyof MediaQueryListEventMap>(\n  target: MediaQueryList,\n  type: K,\n  listener: (this: HTMLElement, ev: MediaQueryListEventMap[K]) => unknown,\n  options?: boolean | AddEventListenerOptions\n): () => void;\nexport function addEventListener(\n  target: HTMLElement | Window | Document | MediaQueryList,\n  type: string,\n  listener: (this: HTMLElement | Window | Document, ev: Event) => unknown,\n  options?: boolean | AddEventListenerOptions\n): () => void {\n  target.addEventListener(type, listener, options);\n  return (): void => target.removeEventListener(type, listener, options);\n}\n\nexport const listen = addEventListener;\n","import type { AtomPlayerConfig } from \"../AtomPlayer\";\nimport { AtomPlayer } from \"../AtomPlayer\";\nimport { SyncPlayerStatus } from \"../../Types\";\nimport { listen } from \"./utils\";\n\nexport interface NativeVideoPlayerConfig extends AtomPlayerConfig {\n  video: HTMLVideoElement;\n}\n\n/**\n * **Note**: to play with HLS,\n * ```js\n * if (/\\.m3u8/i.test(videoSRC) && Hls.isSupported()) {\n *     const hls = new Hls();\n *     hls.loadSource(videoSRC);\n *     hls.attachMedia($video);\n * } else if ($video.canPlayType(\"application/vnd.apple.mpegurl\")) {\n *     $video.src = videoSRC;\n * }\n * ```\n */\nexport class NativeVideoPlayer extends AtomPlayer {\n  private readonly video: HTMLVideoElement;\n\n  public constructor(config: NativeVideoPlayerConfig) {\n    super(config);\n\n    this.video = config.video;\n    this.video.controls = false;\n\n    const addVideoListener = (\n      type: keyof HTMLElementEventMap,\n      listener: (e: Event) => void\n    ): void => {\n      this._sideEffect.push(listen(this.video, type, listener));\n    };\n\n    (\n      [\n        \"waiting\",\n        \"canplay\",\n        \"pause\",\n        \"suspend\",\n        \"playing\",\n        \"play\",\n        \"seeking\",\n        \"seeked\",\n        \"stalled\",\n        \"canplaythrough\",\n      ] as (keyof HTMLElementEventMap)[]\n    ).forEach(eventName => {\n      addVideoListener(eventName, e => {\n        if (this.status === SyncPlayerStatus.Ended) {\n          return;\n        }\n\n        const eventType = e.type;\n\n        if (this.video.paused || eventType === \"seeking\") {\n          if (\n            this.status !== SyncPlayerStatus.Pause &&\n            this.status !== SyncPlayerStatus.Ready\n          ) {\n            if (eventType === \"pause\") {\n              this.status = SyncPlayerStatus.Ready;\n            } else {\n              this.status = SyncPlayerStatus.Buffering;\n            }\n          }\n        } else {\n          this.status = SyncPlayerStatus.Playing;\n        }\n      });\n    });\n\n    addVideoListener(\"error\", () => {\n      if (this.status === SyncPlayerStatus.Playing && this.video.paused) {\n        this.status = SyncPlayerStatus.Buffering;\n      }\n    });\n\n    addVideoListener(\"ended\", () => {\n      this.status = SyncPlayerStatus.Ended;\n    });\n\n    const setCurrentTime = (): void => {\n      this.currentTime = this.video.currentTime * 1000;\n    };\n    setCurrentTime();\n    addVideoListener(\"timeupdate\", setCurrentTime);\n\n    const setDuration = (): void => {\n      this.duration = this.video.duration * 1000;\n    };\n    setDuration();\n    addVideoListener(\"durationchange\", setDuration);\n  }\n\n  protected async readyImpl(): Promise<void> {\n    this.video.pause();\n  }\n\n  protected async playImpl(): Promise<void> {\n    try {\n      await this.video.play();\n    } catch {\n      // ignore\n    }\n  }\n\n  protected async pauseImpl(): Promise<void> {\n    this.video.pause();\n  }\n\n  protected async stopImpl(): Promise<void> {\n    this.video.currentTime = this.duration / 1000 - 0.5;\n  }\n\n  protected async seekImpl(ms: number): Promise<void> {\n    this.video.currentTime = ms / 1000;\n  }\n\n  protected setPlaybackRateImpl(value: number): void {\n    this.video.playbackRate = value;\n  }\n}\n","import type { VideoJsPlayer } from \"video.js\";\nimport { AtomPlayer } from \"../../AtomPlayer\";\nimport { SyncPlayerStatus } from \"../../../Types\";\nimport type { VideoPlayerConfig } from \"../Types\";\n\nexport class ChromeAtomPlayer extends AtomPlayer {\n  private readonly video: VideoJsPlayer;\n\n  public constructor(config: VideoPlayerConfig) {\n    super(config);\n\n    this.video = config.video;\n    this.video.controls(false);\n\n    const addVideoListener = (\n      type: string | string[],\n      listener: (e?: Event) => void\n    ): void => {\n      this.video.on(type, listener);\n      this._sideEffect.addDisposer((): void => this.video.off(type, listener));\n    };\n\n    addVideoListener(\n      [\n        \"waiting\",\n        \"canplay\",\n        \"pause\",\n        \"suspend\",\n        \"playing\",\n        \"play\",\n        \"seeking\",\n        \"seeked\",\n        \"stalled\",\n        \"canplaythrough\",\n      ],\n      (e?: Event): void => {\n        if (this.status === SyncPlayerStatus.Ended) {\n          return;\n        }\n\n        const eventType = e?.type;\n\n        if (this.video.paused() || eventType === \"seeking\") {\n          if (\n            this.status !== SyncPlayerStatus.Pause &&\n            this.status !== SyncPlayerStatus.Ready\n          ) {\n            if (eventType === \"pause\") {\n              this.status = SyncPlayerStatus.Ready;\n            } else {\n              this.status = SyncPlayerStatus.Buffering;\n            }\n          }\n        } else {\n          this.status = SyncPlayerStatus.Playing;\n        }\n      }\n    );\n\n    addVideoListener(\"error\", () => {\n      if (this.status === SyncPlayerStatus.Playing && this.video.paused()) {\n        this.status = SyncPlayerStatus.Buffering;\n      }\n    });\n\n    addVideoListener(\"ended\", () => {\n      this.status = SyncPlayerStatus.Ended;\n    });\n\n    const setCurrentTime = (): void => {\n      this.currentTime = (this.video.currentTime() || 0) * 1000;\n    };\n    setCurrentTime();\n    addVideoListener(\"timeupdate\", setCurrentTime);\n\n    const setDuration = (): void => {\n      this.duration = (this.video.duration() || 0) * 1000;\n    };\n    setDuration();\n    addVideoListener(\"durationchange\", setDuration);\n  }\n\n  protected async readyImpl(): Promise<void> {\n    try {\n      this.video.pause();\n    } catch {\n      // ignore\n    }\n  }\n\n  protected async playImpl(): Promise<void> {\n    try {\n      await this.video.play();\n    } catch {\n      // ignore\n    }\n  }\n\n  protected async pauseImpl(): Promise<void> {\n    try {\n      this.video.pause();\n    } catch {\n      // ignore\n    }\n  }\n\n  protected async stopImpl(): Promise<void> {\n    try {\n      this.video.currentTime(this.duration / 1000 - 0.5);\n    } catch {\n      // ignore\n    }\n  }\n\n  protected async seekImpl(ms: number): Promise<void> {\n    try {\n      this.video.currentTime(ms / 1000);\n    } catch {\n      // ignore\n    }\n  }\n\n  protected setPlaybackRateImpl(value: number): void {\n    try {\n      this.video.playbackRate(value);\n    } catch {\n      // ignore\n    }\n  }\n}\n","import type { VideoJsPlayer } from \"video.js\";\nimport { AtomPlayer } from \"../../AtomPlayer\";\nimport { SyncPlayerStatus } from \"../../../Types\";\nimport type { VideoPlayerConfig } from \"../Types\";\n\nexport class SafariAtomPlayer extends AtomPlayer {\n  private readonly video: VideoJsPlayer;\n\n  public constructor(config: VideoPlayerConfig) {\n    super(config);\n\n    this.video = config.video;\n    this.video.controls(false);\n\n    const addVideoListener = (\n      type: string | string[],\n      listener: (e?: Event) => void\n    ): void => {\n      this.video.on(type, listener);\n      this._sideEffect.addDisposer((): void => this.video.off(type, listener));\n    };\n\n    addVideoListener(\n      [\n        \"waiting\",\n        \"canplay\",\n        \"pause\",\n        \"suspend\",\n        \"playing\",\n        \"play\",\n        \"seeking\",\n        \"seeked\",\n        \"stalled\",\n        \"canplaythrough\",\n      ],\n      (e?: Event): void => {\n        if (this.status === SyncPlayerStatus.Ended) {\n          return;\n        }\n\n        const eventType = e?.type;\n\n        if (this.video.paused() || eventType === \"seeking\") {\n          if (\n            this.status !== SyncPlayerStatus.Pause &&\n            this.status !== SyncPlayerStatus.Ready\n          ) {\n            if (eventType === \"pause\") {\n              this.status = SyncPlayerStatus.Ready;\n            } else {\n              this.status = SyncPlayerStatus.Buffering;\n            }\n          }\n        } else {\n          this.checkCurrentTime();\n          this.status = SyncPlayerStatus.Playing;\n        }\n      }\n    );\n\n    addVideoListener(\"error\", () => {\n      if (this.status === SyncPlayerStatus.Playing && this.video.paused()) {\n        this.status = SyncPlayerStatus.Buffering;\n      }\n    });\n\n    addVideoListener(\"ended\", () => {\n      this.status = SyncPlayerStatus.Ended;\n    });\n\n    const setCurrentTime = (): void => {\n      this.currentTime = (this.video.currentTime() || 0) * 1000;\n    };\n    setCurrentTime();\n    addVideoListener(\"timeupdate\", setCurrentTime);\n\n    const setDuration = (): void => {\n      this.duration = (this.video.duration() || 0) * 1000;\n    };\n    setDuration();\n    addVideoListener(\"durationchange\", setDuration);\n\n    this.lastCurrentTime = this.currentTime;\n\n    this._sideEffect.add(() => {\n      const handler = (): void => {\n        if (this.status === SyncPlayerStatus.Playing) {\n          this.checkCurrentTime();\n        } else {\n          this.cleanCheckCurrentTime();\n        }\n      };\n      this.on(\"status\", handler);\n      return (): void => {\n        this.cleanCheckCurrentTime();\n        this.off(\"status\", handler);\n      };\n    });\n  }\n\n  protected async readyImpl(): Promise<void> {\n    this.video.pause();\n  }\n\n  protected async playImpl(): Promise<void> {\n    await this.video.play();\n  }\n\n  protected async pauseImpl(): Promise<void> {\n    this.video.pause();\n  }\n\n  protected async stopImpl(): Promise<void> {\n    this.video.currentTime(this.duration / 1000 - 0.5);\n  }\n\n  protected async seekImpl(ms: number): Promise<void> {\n    this.video.currentTime(ms / 1000);\n  }\n\n  protected setPlaybackRateImpl(value: number): void {\n    this.video.playbackRate(value);\n  }\n\n  private checkCurrentTime = (): void => {\n    if (Number.isNaN(this.checkTimeInterval)) {\n      this.checkTimeInterval = window.setInterval(() => {\n        if (this.lastCurrentTime === this.currentTime) {\n          if (this.status === SyncPlayerStatus.Playing) {\n            this.status = SyncPlayerStatus.Buffering;\n          }\n        } else {\n          this.lastCurrentTime = this.currentTime;\n        }\n      }, 500);\n    }\n  };\n\n  private cleanCheckCurrentTime = (): void => {\n    if (!Number.isNaN(this.checkTimeInterval)) {\n      window.clearTimeout(this.checkTimeInterval);\n      this.checkTimeInterval = NaN;\n    }\n  };\n\n  private lastCurrentTime: number;\n\n  private checkTimeInterval = NaN;\n}\n","import type { AtomPlayer } from \"../AtomPlayer\";\nimport { ChromeAtomPlayer } from \"./ChromeAtomPlayer\";\nimport { SafariAtomPlayer } from \"./SafariAtomPlayer\";\nimport type { VideoPlayerConfig } from \"./Types\";\n\nexport type { VideoPlayerConfig } from \"./Types\";\n\nexport const VideoPlayer = function VideoPlayer(\n  config: VideoPlayerConfig\n): AtomPlayer {\n  return /apple/i.test(navigator.vendor)\n    ? new SafariAtomPlayer(config)\n    : new ChromeAtomPlayer(config);\n} as unknown as new (config: VideoPlayerConfig) => AtomPlayer;\n","import type { Player } from \"white-web-sdk\";\nimport { PlayerPhase } from \"white-web-sdk\";\nimport type { AtomPlayerConfig } from \"../AtomPlayer\";\nimport { AtomPlayer } from \"../AtomPlayer\";\nimport { SyncPlayerStatus } from \"../../Types\";\n\nexport interface WhiteboardPlayerConfig extends AtomPlayerConfig {\n  player: Player;\n}\n\nexport class WhiteboardPlayer extends AtomPlayer {\n  private readonly player: Player;\n\n  public constructor(config: WhiteboardPlayerConfig) {\n    super(config);\n\n    this.player = config.player;\n\n    this._sideEffect.add(() => {\n      const handler = (phase: PlayerPhase): void => {\n        if (this.status === SyncPlayerStatus.Ended) {\n          return;\n        }\n\n        switch (phase) {\n          case PlayerPhase.Ended:\n          case PlayerPhase.Stopped: {\n            this.status = SyncPlayerStatus.Ended;\n            break;\n          }\n          case PlayerPhase.Playing: {\n            this.status = SyncPlayerStatus.Playing;\n            break;\n          }\n          default: {\n            if (\n              this.status !== SyncPlayerStatus.Pause &&\n              this.status !== SyncPlayerStatus.Ready\n            ) {\n              this.status = SyncPlayerStatus.Buffering;\n            }\n            break;\n          }\n        }\n      };\n      this.player.callbacks.on(\"onPhaseChanged\", handler);\n      return (): void => this.player.callbacks.off(\"onPhaseChanged\", handler);\n    });\n\n    this.duration = this.player.timeDuration || 0;\n    this.playbackRate = this.player.playbackSpeed;\n\n    this._sideEffect.add(() => {\n      const handler = (): void => {\n        this.duration = this.player.timeDuration || 0;\n        this.playbackRate = this.player.playbackSpeed;\n      };\n      this.player.callbacks.on(\"onLoadFirstFrame\", handler);\n      return (): void => this.player.callbacks.off(\"onLoadFirstFrame\", handler);\n    });\n\n    this._sideEffect.add(() => {\n      const handler = (currentTime: number): void => {\n        this.currentTime = currentTime;\n      };\n      this.player.callbacks.on(\"onProgressTimeChanged\", handler);\n      return (): void =>\n        this.player.callbacks.off(\"onProgressTimeChanged\", handler);\n    });\n  }\n\n  protected override async initImpl(): Promise<void> {\n    const p = new Promise<void>(resolve => {\n      const { player } = this;\n      const disposerID = this._sideEffect.add(() => {\n        const handler = (phase: PlayerPhase): void => {\n          if (phase === PlayerPhase.Playing) {\n            try {\n              player.pause();\n            } catch {\n              // ignore\n            }\n          }\n          if (phase === PlayerPhase.Pause) {\n            this._sideEffect.flush(disposerID);\n            return resolve();\n          }\n        };\n        player.callbacks.on(\"onPhaseChanged\", handler);\n        return (): void => player.callbacks.off(\"onPhaseChanged\", handler);\n      });\n    });\n\n    this._safeSeek(0);\n\n    await p;\n  }\n\n  protected async readyImpl(): Promise<void> {\n    this._safePause();\n  }\n\n  protected async playImpl(): Promise<void> {\n    const p = new Promise<void>(resolve => {\n      const { player } = this;\n      const disposerID = this._sideEffect.add(() => {\n        const handler = (phase: PlayerPhase): void => {\n          if (phase === PlayerPhase.Playing) {\n            this._sideEffect.flush(disposerID);\n            resolve();\n          }\n        };\n        player.callbacks.on(\"onPhaseChanged\", handler);\n        return (): void => player.callbacks.off(\"onPhaseChanged\", handler);\n      });\n    });\n    this._safePlay();\n    await p;\n  }\n\n  protected async pauseImpl(): Promise<void> {\n    this._safePause();\n  }\n\n  protected async stopImpl(): Promise<void> {\n    this._safeSeek(this.duration);\n  }\n\n  protected async seekImpl(ms: number): Promise<void> {\n    this._safeSeek(ms);\n  }\n\n  protected setPlaybackRateImpl(value: number): void {\n    try {\n      this.player.playbackSpeed = value;\n    } catch {\n      // ignore\n    }\n  }\n\n  private _safeSeek(ms: number): void {\n    try {\n      this.player.seekToProgressTime(ms);\n    } catch {\n      // ignore\n    }\n  }\n\n  private _safePause(): void {\n    try {\n      this.player.pause();\n    } catch {\n      // ignore\n    }\n  }\n\n  private _safePlay(): void {\n    try {\n      this.player.play();\n    } catch {\n      // ignore\n    }\n  }\n}\n","import { SyncPlayerStatus } from \"../..\";\nimport type { AtomPlayerConfig } from \"../AtomPlayer\";\nimport { AtomPlayer } from \"../AtomPlayer\";\n\nexport interface TickPlayerConfig extends AtomPlayerConfig {\n  duration: number;\n}\n\nexport class TickPlayer extends AtomPlayer {\n  private _startTimer: (startTime: number, playbackRate: number) => void;\n  private _stopTimer: () => void;\n  private _resetTimer: (startTime: number, playbackRate: number) => void;\n\n  public constructor({ duration, ...config }: TickPlayerConfig) {\n    super(config);\n    this.duration = duration;\n\n    let playRafTicket = NaN;\n\n    this._startTimer = (startTime: number, playbackRate: number): void => {\n      window.cancelAnimationFrame(playRafTicket);\n      const startTimestamp = Date.now();\n      const playRaf = (): void => {\n        this.currentTime =\n          (Date.now() - startTimestamp) * playbackRate + startTime;\n        if (this.currentTime >= this.duration) {\n          this.stop();\n        } else {\n          playRafTicket = window.requestAnimationFrame(playRaf);\n        }\n      };\n      playRaf();\n    };\n\n    this._stopTimer = (): void => {\n      window.cancelAnimationFrame(playRafTicket);\n      playRafTicket = NaN;\n    };\n\n    this._resetTimer = (startTime: number, playbackRate: number): void => {\n      if (playRafTicket) {\n        this._startTimer(startTime, playbackRate);\n      } else {\n        this.currentTime = startTime;\n      }\n    };\n\n    this._sideEffect.addDisposer(this._stopTimer);\n  }\n\n  protected async readyImpl(): Promise<void> {\n    this._stopTimer();\n  }\n\n  protected async playImpl(): Promise<void> {\n    this._startTimer(this.currentTime, this.playbackRate);\n    this.status = SyncPlayerStatus.Playing;\n  }\n\n  protected async pauseImpl(): Promise<void> {\n    this._stopTimer();\n  }\n\n  protected async stopImpl(): Promise<void> {\n    this._stopTimer();\n    this.currentTime = this.duration;\n  }\n\n  protected async seekImpl(ms: number): Promise<void> {\n    this._resetTimer(ms, this.playbackRate);\n  }\n\n  protected setPlaybackRateImpl(playbackRate: number): void {\n    this._resetTimer(this.currentTime, playbackRate);\n  }\n}\n","import { SyncPlayerStatus } from \"../..\";\nimport type { AtomPlayerConfig, AtomPlayerEvents } from \"../AtomPlayer\";\nimport { AtomPlayer } from \"../AtomPlayer\";\nimport { TickPlayer } from \"../TickPlayer\";\n\nexport interface OffsetPlayerConfig extends AtomPlayerConfig {\n  offset: number;\n  player: AtomPlayer;\n}\n\nexport class OffsetPlayer extends AtomPlayer {\n  private readonly player: AtomPlayer;\n  private readonly timer: TickPlayer;\n\n  private _currentPlayer: AtomPlayer;\n  private get currentPlayer(): AtomPlayer {\n    return this._currentPlayer;\n  }\n  private set currentPlayer(player: AtomPlayer) {\n    if (this._currentPlayer !== player) {\n      this._currentPlayer = player;\n      this.visible = player !== this.timer;\n    }\n  }\n\n  public constructor({ offset, player, ...config }: OffsetPlayerConfig) {\n    super({ ...config, name: config.name || `Offset<${player.name}>` });\n    this.player = player;\n    this._offset = offset || 0;\n\n    this.timer = new TickPlayer({\n      name: `Tick<${this.name}>`,\n      duration: this._offset,\n    });\n    this.playbackRate = this.player.playbackRate;\n\n    this._currentPlayer = this._offset > 0 ? this.timer : this.player;\n\n    this.status = this.currentPlayer.status;\n    this.duration = this.timer.duration + this.player.duration;\n\n    if (this.currentPlayer === this.timer) {\n      this.currentTime = this.timer.currentTime;\n      this._visible = false;\n    } else {\n      this.currentTime = this.player.currentTime + this.offset;\n    }\n\n    this.playbackRate = this.currentPlayer.playbackRate;\n\n    const syncAtomProps = (\n      player: AtomPlayer,\n      event: AtomPlayerEvents,\n      listener: () => void\n    ): void => {\n      player.on(event, listener);\n      this._sideEffect.addDisposer((): void => {\n        player.off(event, listener);\n      });\n    };\n\n    syncAtomProps(this.player, \"status\", () => {\n      if (this.currentPlayer !== this.player) {\n        return;\n      }\n\n      if (this.status === SyncPlayerStatus.Ended) {\n        return;\n      }\n\n      switch (this.player.status) {\n        case SyncPlayerStatus.Playing: {\n          this.status = SyncPlayerStatus.Playing;\n          break;\n        }\n        case SyncPlayerStatus.Buffering: {\n          this.status = SyncPlayerStatus.Buffering;\n          break;\n        }\n        case SyncPlayerStatus.Ready: {\n          this.status = SyncPlayerStatus.Ready;\n          break;\n        }\n      }\n    });\n    syncAtomProps(this.player, \"timeupdate\", () => {\n      if (this.currentPlayer === this.player) {\n        this.currentTime = this.player.currentTime + this.offset;\n      }\n    });\n    syncAtomProps(this.player, \"durationchange\", () => {\n      this.duration = this.timer.duration + this.player.duration;\n    });\n    syncAtomProps(this.player, \"ratechange\", () => {\n      if (this.currentPlayer === this.player) {\n        this.playbackRate = this.player.playbackRate;\n      }\n    });\n\n    syncAtomProps(this.timer, \"status\", async () => {\n      if (this.currentPlayer !== this.timer) {\n        return;\n      }\n\n      if (this.timer.status === SyncPlayerStatus.Ended) {\n        this.currentPlayer = this.player;\n        if (this.status === SyncPlayerStatus.Playing) {\n          await this.player.seek(0);\n          await this.player.play();\n          return;\n        }\n      }\n\n      if (this.status === SyncPlayerStatus.Ended) {\n        return;\n      }\n\n      switch (this.timer.status) {\n        case SyncPlayerStatus.Playing: {\n          this.status = SyncPlayerStatus.Playing;\n          break;\n        }\n        case SyncPlayerStatus.Ready: {\n          this.status = SyncPlayerStatus.Ready;\n          break;\n        }\n      }\n    });\n    syncAtomProps(this.timer, \"timeupdate\", () => {\n      if (this.currentPlayer === this.timer) {\n        this.currentTime = this.timer.currentTime;\n      }\n    });\n    syncAtomProps(this.timer, \"durationchange\", () => {\n      this.duration = this.timer.duration + this.player.duration;\n    });\n    syncAtomProps(this.timer, \"ratechange\", () => {\n      if (this.currentPlayer === this.timer) {\n        this.playbackRate = this.timer.playbackRate;\n      }\n    });\n  }\n\n  protected async readyImpl(silently?: boolean): Promise<void> {\n    await Promise.all([\n      this.player.ready(silently),\n      this.timer.ready(silently),\n    ]);\n  }\n\n  protected playImpl(): Promise<void> {\n    return this.currentPlayer.play();\n  }\n\n  protected async pauseImpl(): Promise<void> {\n    await this.timer.pause();\n    await this.player.pause();\n  }\n\n  protected async stopImpl(): Promise<void> {\n    await this.timer.stop();\n    await this.player.stop();\n  }\n\n  protected async seekImpl(ms: number): Promise<void> {\n    if (ms <= this.offset) {\n      this.currentPlayer = this.timer;\n      if (this.player.status === SyncPlayerStatus.Playing) {\n        await this.player.ready(true);\n      }\n      if (this.player.currentTime !== 0) {\n        await this.player.seek(0);\n      }\n      await this.timer.seek(ms);\n    } else {\n      this.currentPlayer = this.player;\n      if (this.timer.currentTime !== 0) {\n        await this.timer.stop();\n      }\n      await this.player.seek(ms - this.offset);\n    }\n  }\n\n  protected setPlaybackRateImpl(value: number): void {\n    this.player.setPlaybackRate(value);\n    this.timer.setPlaybackRate(value);\n  }\n}\n","import type { AtomPlayerConfig, AtomPlayerEvents } from \"../AtomPlayer\";\nimport { AtomPlayer } from \"../AtomPlayer\";\n\nexport interface SelectionPlayerSelection {\n  start: number;\n  duration: number;\n}\n\nexport interface SelectionPlayerConfig extends AtomPlayerConfig {\n  player: AtomPlayer;\n  selectionList: SelectionPlayerSelection[];\n}\n\ninterface SelectionItem extends SelectionPlayerSelection {\n  /** Start position of resulted timeline */\n  rStart: number;\n}\n\nexport class SelectionPlayer extends AtomPlayer {\n  private readonly player: AtomPlayer;\n  private selectionItems: SelectionItem[];\n\n  public constructor({\n    player,\n    selectionList,\n    ...config\n  }: SelectionPlayerConfig) {\n    super({ ...config, name: config.name || `Selection<${player.name}>` });\n    this.player = player;\n\n    const selectionItems = sanitizeSelectionList(selectionList);\n\n    this.selectionItems = this.sliceSelectionItems(selectionItems);\n\n    this.status = this.player.status;\n    this.playbackRate = this.player.playbackRate;\n    this.duration = this.calcDuration();\n    this.currentTime = this.syncCurrentTime();\n\n    const syncAtomProps = (\n      player: AtomPlayer,\n      event: AtomPlayerEvents,\n      listener: () => void\n    ): void => {\n      player.on(event, listener);\n      this._sideEffect.addDisposer((): void => {\n        player.off(event, listener);\n      });\n    };\n\n    syncAtomProps(this.player, \"status\", () => {\n      this.status = this.player.status;\n    });\n    syncAtomProps(this.player, \"ratechange\", () => {\n      this.playbackRate = this.player.playbackRate;\n    });\n    syncAtomProps(this.player, \"timeupdate\", () => {\n      this.currentTime = this.syncCurrentTime();\n    });\n    syncAtomProps(this.player, \"durationchange\", () => {\n      this.selectionItems = this.sliceSelectionItems(selectionItems);\n      this.duration = this.calcDuration();\n      this.currentTime = this.syncCurrentTime();\n    });\n  }\n\n  protected readyImpl(silently?: boolean): Promise<void> {\n    return this.player.ready(silently);\n  }\n\n  protected playImpl(): Promise<void> {\n    return this.player.play();\n  }\n\n  protected pauseImpl(): Promise<void> {\n    return this.player.pause();\n  }\n\n  protected async stopImpl(): Promise<void> {\n    await this.player.stop();\n    const lastItem = this.selectionItems[this.selectionItems.length - 1];\n    if (lastItem) {\n      await this.player.seek(lastItem.start + lastItem.duration);\n    }\n  }\n\n  protected setPlaybackRateImpl(value: number): void {\n    return this.player.setPlaybackRate(value);\n  }\n\n  protected async seekImpl(ms: number): Promise<void> {\n    if (this.selectionItems.length <= 0) {\n      return this.player.seek(ms);\n    }\n\n    if (ms <= 0) {\n      return this.player.seek(0);\n    }\n\n    if (ms >= this.duration) {\n      return this.player.seek(this.player.duration);\n    }\n\n    for (let i = this.selectionItems.length - 1; i >= 0; i--) {\n      const item = this.selectionItems[i];\n      if (ms >= item.rStart) {\n        return this.player.seek(ms - item.rStart + item.start);\n      }\n    }\n  }\n\n  private syncCurrentTime(): number {\n    const currentTime = this.player.currentTime;\n\n    if (this.selectionItems.length <= 0) {\n      return currentTime;\n    }\n\n    for (let i = 0; i < this.selectionItems.length; i++) {\n      const item = this.selectionItems[i];\n      if (currentTime <= item.start + item.duration) {\n        if (currentTime < item.start) {\n          this.player.seek(item.start);\n          return item.rStart;\n        }\n        return currentTime - item.start + item.rStart;\n      }\n    }\n\n    this.stop();\n    return this.duration;\n  }\n\n  private calcDuration(): number {\n    if (this.player.duration <= 0) {\n      return 0;\n    }\n    const lastItem = this.selectionItems[this.selectionItems.length - 1];\n    return lastItem\n      ? lastItem.rStart + lastItem.duration\n      : this.player.duration;\n  }\n\n  private sliceSelectionItems(\n    selectionItems: SelectionItem[]\n  ): SelectionItem[] {\n    if (this.player.duration <= 0) {\n      return [];\n    }\n    const result: SelectionItem[] = [];\n    for (let i = 0; i < selectionItems.length; i++) {\n      const item = selectionItems[i];\n      if (item.rStart + item.duration <= this.player.duration) {\n        result.push(item);\n      } else {\n        result.push({ ...item, duration: this.player.duration - item.rStart });\n        break;\n      }\n    }\n    return result;\n  }\n}\n\nfunction sanitizeSelectionList(\n  selectionList: SelectionPlayerSelection[]\n): SelectionItem[] {\n  selectionList = selectionList.sort((a, b) => a.start - b.start);\n  const result: SelectionItem[] = [];\n  let lastItem: SelectionItem | null = null;\n  for (let i = 0; i < selectionList.length; i++) {\n    const item = selectionList[i];\n    if (lastItem && item.start <= lastItem.start + lastItem.duration) {\n      lastItem.duration =\n        Math.max(\n          lastItem.start + lastItem.duration,\n          item.start + item.duration\n        ) - lastItem.start;\n    } else {\n      lastItem = {\n        start: item.start,\n        duration: item.duration,\n        rStart: lastItem ? lastItem.rStart + lastItem.duration : 0,\n      };\n      result.push(lastItem);\n    }\n  }\n\n  return result;\n}\n","import { AtomPlayer } from \"./Players/AtomPlayer\";\nimport { ClusterPlayer } from \"./Players/ClusterPlayer\";\n\nexport { AtomPlayer };\n\nexport { NativeVideoPlayer } from \"./Players/NativeVideoPlayer\";\nexport type { NativeVideoPlayerConfig } from \"./Players/NativeVideoPlayer\";\n\nexport { VideoPlayer } from \"./Players/VideoPlayer\";\nexport type { VideoPlayerConfig } from \"./Players/VideoPlayer\";\n\nexport { WhiteboardPlayer } from \"./Players/WhiteboardPlayer\";\nexport type { WhiteboardPlayerConfig } from \"./Players/WhiteboardPlayer\";\n\nexport { OffsetPlayer } from \"./Players/OffsetPlayer\";\nexport type { OffsetPlayerConfig } from \"./Players/OffsetPlayer\";\n\nexport { SelectionPlayer } from \"./Players/SelectionPlayer\";\nexport type {\n  SelectionPlayerConfig,\n  SelectionPlayerSelection,\n} from \"./Players/SelectionPlayer\";\n\nexport { SyncPlayerStatus } from \"./Types\";\n\nexport interface SyncPlayerConfig {\n  players: AtomPlayer[];\n}\n\nexport const SyncPlayer = function SyncPlayer(\n  config: SyncPlayerConfig\n): AtomPlayer {\n  return config.players.reduce(\n    (combinedPlayer, player) =>\n      new ClusterPlayer({ rowPlayer: combinedPlayer, colPlayer: player })\n  );\n} as unknown as new (config: SyncPlayerConfig) => AtomPlayer;\n"],"names":["SyncPlayerStatus","AtomPlayerInitStatus","VideoPlayer","player","SyncPlayer"],"mappings":"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"}