matrix.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // Handle messages coming from [Matrix] client if embedded as a [Widget] in some room.
  2. // [Matrix]: https://matrix.org/
  3. // [Widget]: https://docs.google.com/document/d/1uPF7XWY_dXTKVKV7jZQ2KmsI19wn9-kFRgQ1tFQP7wQ/edit
  4. class MatrixWidget {
  5. constructor () {
  6. this.widgetId = null
  7. window.addEventListener('message', this.onMessage.bind(this))
  8. }
  9. onMessage (event) {
  10. this.widgetId = this.widgetId || event.data.widgetId
  11. switch (event.data.api) {
  12. case 'fromWidget':
  13. break
  14. case 'toWidget':
  15. switch (event.data.action) {
  16. case 'capabilities':
  17. this.sendResponse(event, {
  18. capabilities: ['m.always_on_screen']
  19. })
  20. break
  21. }
  22. break
  23. default:
  24. break
  25. }
  26. }
  27. sendContentLoaded () {
  28. this.sendMessage({
  29. action: 'content_loaded'
  30. })
  31. }
  32. setAlwaysOnScreen (value) {
  33. // Extension of main spec, see https://github.com/matrix-org/matrix-doc/issues/1354
  34. this.sendMessage({
  35. action: 'set_always_on_screen',
  36. value: value, // once for spec compliance
  37. data: { value: value } // and once for Riot
  38. })
  39. }
  40. sendMessage (message) {
  41. if (!this.widgetId) return
  42. message.api = message.api || 'fromWidget'
  43. message.widgetId = message.widgetId || this.widgetId
  44. message.requestId = message.requestId || Math.random().toString(36)
  45. window.parent.postMessage(message, '*')
  46. }
  47. sendResponse (event, response) {
  48. event.data.response = response
  49. event.source.postMessage(event.data, event.origin)
  50. }
  51. }
  52. window.matrixWidget = new MatrixWidget()