Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

72 lines
2.2KB

  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. const style = {
  48. overflow: 'scroll',
  49. backgroundColor: 'gray',
  50. color: 'white',
  51. fontFamily: 'monospace',
  52. position: 'relative',
  53. }
  54. return ScreenShare.isOff ? [] : m('.screen-share', {style},
  55. m('video[playsinline][autoplay]', {srcObject: ScreenShare.stream})
  56. )
  57. },
  58. }
  59. addEventListener('screen-stop', () => {
  60. ScreenShare.stopStream()
  61. })
  62. addEventListener('join', ({detail: {value: user}}) => {
  63. if(ScreenShare.isSource) {
  64. signal({kind: 'rpc-needed', value: {kind: 'screen', target: user}})
  65. }
  66. })
  67. addEventListener('load', () => {
  68. doNotLog.add('screen-stop')
  69. Headers.push([ScreenShareConfig])
  70. Apps.push([ScreenShare, {key: 'screen-share-container'}])
  71. })