No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

73 líneas
2.3KB

  1. addEventListener('rpc-new', ({detail}) => {
  2. const {uid, kind} = detail.value
  3. if(kind === 'screen') {
  4. const sender = ScreenShare.isSource && ScreenShare.stream
  5. const receiver = !ScreenShare.isSource && ScreenShare.stream
  6. signal({kind: 'rpc-setup', value: {uid, sender, receiver}})
  7. }
  8. })
  9. const ScreenShareConfig = {
  10. view() {
  11. if (ScreenShare.isOff) {
  12. const onclick = ScreenShare.getStream
  13. return m('button', {onclick}, 'start screen sharing')
  14. }
  15. else {
  16. const onclick = () => wire({kind: 'screen-stop'})
  17. return m('button', {onclick}, 'stop screen sharing')
  18. }
  19. }
  20. }
  21. const ScreenShare = {
  22. isSource: false,
  23. stream: new MediaStream(),
  24. get isOff() {
  25. return ScreenShare.stream.getTracks().length === 0
  26. },
  27. async getStream() {
  28. await navigator.mediaDevices
  29. .getDisplayMedia({})
  30. .then(stream => stream
  31. .getTracks()
  32. .forEach(tr => ScreenShare.stream.addTrack(tr, stream))
  33. )
  34. ScreenShare.isSource = true
  35. State.others.forEach(target => {
  36. signal({kind: 'rpc-needed', value: {kind: 'screen', target}})
  37. })
  38. m.redraw()
  39. },
  40. async stopStream() {
  41. ScreenShare.stream.getTracks().forEach(tr => tr.stop())
  42. ScreenShare.stream = new MediaStream()
  43. ScreenShare.isSource = false
  44. m.redraw()
  45. },
  46. view() {
  47. return ScreenShare.isOff ? [] :
  48. m('video.screen[playsinline][autoplay]', {
  49. oncreate: ({dom}) => {
  50. dom.srcObject = ScreenShare.stream
  51. },
  52. onupdate: ({dom}) => {
  53. if(dom.srcObject !== ScreenShare.stream) {
  54. dom.srcObject = ScreenShare.stream
  55. }
  56. },
  57. })
  58. },
  59. }
  60. addEventListener('screen-stop', () => {
  61. ScreenShare.stopStream()
  62. })
  63. addEventListener('join', ({detail: {value: user}}) => {
  64. if(ScreenShare.isSource) {
  65. signal({kind: 'rpc-needed', value: {kind: 'screen', target: user}})
  66. }
  67. })
  68. addEventListener('load', () => {
  69. doNotLog.add('screen-stop')
  70. Headers.push([ScreenShareConfig])
  71. Apps.push([ScreenShare, {key: 'screen-share-container'}])
  72. })