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.

76 líneas
2.4KB

  1. const ScreenShareConfig = {
  2. view() {
  3. const start = async () => {
  4. await ScreenShare.getStream()
  5. wire({kind: 'screen-share-start'})
  6. }
  7. const stop = () => wire({kind: 'screen-share-stop'})
  8. if (ScreenShare.source === null) {
  9. return m('button', {onclick: start}, 'start screen sharing')
  10. }
  11. else if (ScreenShare.isSelf) {
  12. return m('button', {onclick: stop}, 'stop screen sharing')
  13. }
  14. else {
  15. return m('button[disabled]', `${ScreenShare.source} is screen sharing`)
  16. }
  17. }
  18. }
  19. const ScreenShare = {
  20. source: null,
  21. stream: new MediaStream(),
  22. get isSelf() {
  23. return ScreenShare.source === State.username
  24. },
  25. async getStream() {
  26. const stream = await navigator.mediaDevices.getDisplayMedia({})
  27. stream.getTracks()
  28. .forEach(tr => ScreenShare.stream.addTrack(tr, stream))
  29. },
  30. async stopStream() {
  31. ScreenShare.stream.getTracks()
  32. .forEach(tr => tr.stop())
  33. ScreenShare.stream = new MediaStream()
  34. },
  35. view() {
  36. const style = {
  37. overflow: 'scroll',
  38. backgroundColor: 'gray',
  39. color: 'white',
  40. fontFamily: 'monospace',
  41. position: 'relative',
  42. }
  43. return m('.screen-share', {style},
  44. ScreenShare.isSelf ? m('span', 'You are sharing your screen') :
  45. ScreenShare.source ? m('video[playsinline][autoplay]', {srcObject: ScreenShare.stream})
  46. : [],
  47. )
  48. },
  49. }
  50. function sendScreen(target, stream) {
  51. signal({kind: 'screen-start', value: {target, stream}})
  52. }
  53. addEventListener('screen-share-start', async ({detail: {source}}) => {
  54. const isNew = ScreenShare.source === null
  55. ScreenShare.source = source
  56. if(isNew && ScreenShare.isSelf) {
  57. State.others.forEach(user => sendScreen(user, ScreenShare.stream))
  58. }
  59. })
  60. addEventListener('screen-share-stop', () => {
  61. ScreenShare.stopStream()
  62. ScreenShare.source = null
  63. })
  64. addEventListener('join', ({detail: {value: user}}) => {
  65. if(ScreenShare.isSelf) {
  66. wire({kind: 'screen-share-start', target: user})
  67. sendScreen(user, ScreenShare.stream)
  68. }
  69. })
  70. addEventListener('load', () => {
  71. doNotLog.add('screen-share-start')
  72. doNotLog.add('screen-share-stop')
  73. Headers.push([ScreenShareConfig])
  74. Apps.push([ScreenShare, {key: 'screen-share-container'}])
  75. })