@startuml

participant SegmentLoader order 1
participant "media-segment-request" order 2
participant "videojs-contrib-media-sources" order 3
participant mux.js order 4
participant "Native Source Buffer" order 5

SegmentLoader -> "media-segment-request" : mediaSegmentRequest(...)

group Request
  "media-segment-request" -> SegmentLoader : doneFn(...)
  note left
    At end of all requests
    (key/segment/init segment)
  end note
  SegmentLoader -> SegmentLoader : handleSegment(...)
  note left
    "Probe" (parse) segment for
    timing and track information
  end note
  SegmentLoader -> "videojs-contrib-media-sources" : append to "fake" source buffer
  note left
    Source buffer here is a
    wrapper around native buffers
  end note
  group Transmux
    "videojs-contrib-media-sources" -> mux.js : postMessage(...setAudioAppendStart...)
    note left
      Used for checking for overlap when
      prefixing audio with silence.
    end note
    "videojs-contrib-media-sources" -> mux.js : postMessage(...alignGopsWith...)
    note left
      Used for aligning gops when overlapping
      content (switching renditions) to fix
      some browser glitching.
    end note

    "videojs-contrib-media-sources" -> mux.js : postMessage(...push...)
    note left
      Pushes bytes into the transmuxer pipeline.
    end note
    "videojs-contrib-media-sources" -> mux.js : postMessage(...flush...)
    "mux.js" -> "videojs-contrib-media-sources" : postMessage(...data...)
    "videojs-contrib-media-sources" -> "Native Source Buffer" : append
    "Native Source Buffer" -> "videojs-contrib-media-sources" : //updateend//
    "videojs-contrib-media-sources" -> SegmentLoader : handleUpdateEnd(...)
  end
end
SegmentLoader -> SegmentLoader : handleUpdateEnd_()
note left
  Saves segment timing info
  and starts next request.
end note

@enduml
