Source: components/bridge-context.js

  1. const Promise = require("bluebird");
  2. const MatrixUser = require("../models/users/matrix");
  3. const MatrixRoom = require("../models/rooms/matrix");
  4. /**
  5. * Bridge context.
  6. *
  7. * @property {Object} senders Data models on senders of this event
  8. * @property {MatrixUser} senders.matrix The sender of this event
  9. * @property {?RemoteUser} senders.remote The first linked remote sender: remotes[0]
  10. * @property {RemoteUser[]} senders.remotes The linked remote senders
  11. * @property {Object} targets Data models on targets (e.g. state_key in
  12. * m.room.member) of this event.
  13. * @property {?MatrixUser} targets.matrix The target of this event if applicable.
  14. * @property {?RemoteUser} targets.remote The first linked remote target: remotes[0]
  15. * @property {RemoteUser[]} targets.remotes The linked remote targets
  16. * @property {Object} rooms Data models on rooms concerning this event.
  17. * @property {MatrixRoom} rooms.matrix The room for this event.
  18. * @property {?RemoteRoom} rooms.remote The first linked remote room: remotes[0]
  19. * @property {RemoteRoom[]} rooms.remotes The linked remote rooms for this event
  20. */
  21. class BridgeContext {
  22. /**
  23. * @param {Object} ctx Event related data
  24. * @param {string} ctx.sender Matrix user ID of the sender.
  25. * @param {string=} ctx.target Matrix user ID of the target.
  26. * @param {string} ctx.room Matrix room ID.
  27. */
  28. constructor(ctx) {
  29. this._ctx = ctx;
  30. this.senders = {
  31. matrix: new MatrixUser(ctx.sender),
  32. remote: null,
  33. remotes: [],
  34. };
  35. this.targets = {
  36. matrix: ctx.target ? new MatrixUser(ctx.target) : null,
  37. remote: null,
  38. remotes: [],
  39. };
  40. this.rooms = {
  41. matrix: new MatrixRoom(ctx.room),
  42. remote: null,
  43. remotes: [],
  44. };
  45. }
  46. /**
  47. * Returns this instance after its initialization.
  48. *
  49. * @param {RoomBridgeStore} roomStore
  50. * @param {UserBridgeStore} userStore
  51. * @returns {Promise<BridgeContext>}
  52. */
  53. async get(roomStore, userStore) {
  54. return Promise.try(() => {
  55. return [
  56. roomStore.getLinkedRemoteRooms(this._ctx.room),
  57. userStore.getRemoteUsersFromMatrixId(this._ctx.sender),
  58. (this._ctx.target ?
  59. userStore.getRemoteUsersFromMatrixId(this._ctx.target) :
  60. Promise.resolve([])
  61. ),
  62. roomStore.getMatrixRoom(this._ctx.room),
  63. userStore.getMatrixUser(this._ctx.sender)
  64. ];
  65. }).spread((remoteRooms, remoteSenders, remoteTargets, mxRoom, mxSender) => {
  66. if (remoteRooms.length) {
  67. this.rooms.remotes = remoteRooms;
  68. this.rooms.remote = remoteRooms[0];
  69. }
  70. if (remoteSenders.length) {
  71. this.senders.remotes = remoteSenders;
  72. this.senders.remote = remoteSenders[0];
  73. }
  74. if (remoteTargets.length) {
  75. this.targets.remotes = remoteTargets;
  76. this.targets.remote = remoteTargets[0];
  77. }
  78. if (mxRoom) {
  79. this.rooms.matrix = mxRoom;
  80. }
  81. if (mxSender) {
  82. this.senders.matrix = mxSender;
  83. }
  84. }).catch(e => {throw wrap(e, Error, "Could not retrieve bridge context");})
  85. .return(this);
  86. }
  87. }
  88. module.exports = BridgeContext;