async-matrix 0.1.3 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +131 -0
  3. data/data/matrix-spec/api/client-server/account-data.yaml +389 -0
  4. data/data/matrix-spec/api/client-server/account_deactivation.yaml +149 -0
  5. data/data/matrix-spec/api/client-server/admin.yaml +512 -0
  6. data/data/matrix-spec/api/client-server/administrative_contact.yaml +620 -0
  7. data/data/matrix-spec/api/client-server/appservice_ping.yaml +183 -0
  8. data/data/matrix-spec/api/client-server/appservice_room_directory.yaml +104 -0
  9. data/data/matrix-spec/api/client-server/authed-content-repo.yaml +590 -0
  10. data/data/matrix-spec/api/client-server/banning.yaml +177 -0
  11. data/data/matrix-spec/api/client-server/capabilities.yaml +235 -0
  12. data/data/matrix-spec/api/client-server/content-repo.yaml +887 -0
  13. data/data/matrix-spec/api/client-server/create_room.yaml +306 -0
  14. data/data/matrix-spec/api/client-server/cross_signing.yaml +300 -0
  15. data/data/matrix-spec/api/client-server/definitions/auth_data.yaml +34 -0
  16. data/data/matrix-spec/api/client-server/definitions/auth_response.yaml +62 -0
  17. data/data/matrix-spec/api/client-server/definitions/client_device.yaml +44 -0
  18. data/data/matrix-spec/api/client-server/definitions/client_event.yaml +49 -0
  19. data/data/matrix-spec/api/client-server/definitions/client_event_without_room_id.yaml +147 -0
  20. data/data/matrix-spec/api/client-server/definitions/cross_signing_key.yaml +57 -0
  21. data/data/matrix-spec/api/client-server/definitions/device_keys.yaml +70 -0
  22. data/data/matrix-spec/api/client-server/definitions/errors/error.yaml +26 -0
  23. data/data/matrix-spec/api/client-server/definitions/errors/rate_limited.yaml +34 -0
  24. data/data/matrix-spec/api/client-server/definitions/event_batch.yaml +22 -0
  25. data/data/matrix-spec/api/client-server/definitions/event_filter.yaml +55 -0
  26. data/data/matrix-spec/api/client-server/definitions/invite_3pid.yaml +45 -0
  27. data/data/matrix-spec/api/client-server/definitions/key_backup_auth_data.yaml +36 -0
  28. data/data/matrix-spec/api/client-server/definitions/key_backup_data.yaml +50 -0
  29. data/data/matrix-spec/api/client-server/definitions/key_backup_session_data.yaml +57 -0
  30. data/data/matrix-spec/api/client-server/definitions/m.login.terms_params.yaml +83 -0
  31. data/data/matrix-spec/api/client-server/definitions/m.mentions.yaml +33 -0
  32. data/data/matrix-spec/api/client-server/definitions/m.oauth_params.yaml +30 -0
  33. data/data/matrix-spec/api/client-server/definitions/m.relates_to.yaml +45 -0
  34. data/data/matrix-spec/api/client-server/definitions/megolm_export_session_data.yaml +39 -0
  35. data/data/matrix-spec/api/client-server/definitions/olm_payload.yaml +88 -0
  36. data/data/matrix-spec/api/client-server/definitions/one_time_keys.yaml +27 -0
  37. data/data/matrix-spec/api/client-server/definitions/openid_token.yaml +37 -0
  38. data/data/matrix-spec/api/client-server/definitions/protocol.yaml +44 -0
  39. data/data/matrix-spec/api/client-server/definitions/public_rooms_chunk.yaml +74 -0
  40. data/data/matrix-spec/api/client-server/definitions/public_rooms_response.yaml +59 -0
  41. data/data/matrix-spec/api/client-server/definitions/push_condition.yaml +53 -0
  42. data/data/matrix-spec/api/client-server/definitions/push_rule.yaml +53 -0
  43. data/data/matrix-spec/api/client-server/definitions/push_ruleset.yaml +206 -0
  44. data/data/matrix-spec/api/client-server/definitions/recent_emoji.yaml +29 -0
  45. data/data/matrix-spec/api/client-server/definitions/request_email_validation.yaml +36 -0
  46. data/data/matrix-spec/api/client-server/definitions/request_msisdn_validation.yaml +36 -0
  47. data/data/matrix-spec/api/client-server/definitions/request_token_response.yaml +46 -0
  48. data/data/matrix-spec/api/client-server/definitions/room_event_filter.yaml +60 -0
  49. data/data/matrix-spec/api/client-server/definitions/room_key_backup.yaml +37 -0
  50. data/data/matrix-spec/api/client-server/definitions/room_summary.yaml +44 -0
  51. data/data/matrix-spec/api/client-server/definitions/security.yaml +47 -0
  52. data/data/matrix-spec/api/client-server/definitions/sso_login_flow.yaml +98 -0
  53. data/data/matrix-spec/api/client-server/definitions/state_event_batch.yaml +21 -0
  54. data/data/matrix-spec/api/client-server/definitions/sync_filter.yaml +86 -0
  55. data/data/matrix-spec/api/client-server/definitions/tag.yaml +24 -0
  56. data/data/matrix-spec/api/client-server/definitions/third_party_signed.yaml +45 -0
  57. data/data/matrix-spec/api/client-server/definitions/timeline_batch.yaml +36 -0
  58. data/data/matrix-spec/api/client-server/definitions/user_identifier.yaml +27 -0
  59. data/data/matrix-spec/api/client-server/definitions/wellknown/full.yaml +38 -0
  60. data/data/matrix-spec/api/client-server/definitions/wellknown/homeserver.yaml +25 -0
  61. data/data/matrix-spec/api/client-server/definitions/wellknown/identity_server.yaml +25 -0
  62. data/data/matrix-spec/api/client-server/device_management.yaml +314 -0
  63. data/data/matrix-spec/api/client-server/directory.yaml +318 -0
  64. data/data/matrix-spec/api/client-server/event_context.yaml +161 -0
  65. data/data/matrix-spec/api/client-server/filter.yaml +224 -0
  66. data/data/matrix-spec/api/client-server/inviting.yaml +149 -0
  67. data/data/matrix-spec/api/client-server/joining.yaml +238 -0
  68. data/data/matrix-spec/api/client-server/key_backup.yaml +993 -0
  69. data/data/matrix-spec/api/client-server/keys.yaml +482 -0
  70. data/data/matrix-spec/api/client-server/kicking.yaml +110 -0
  71. data/data/matrix-spec/api/client-server/knocking.yaml +152 -0
  72. data/data/matrix-spec/api/client-server/leaving.yaml +163 -0
  73. data/data/matrix-spec/api/client-server/list_joined_rooms.yaml +68 -0
  74. data/data/matrix-spec/api/client-server/list_public_rooms.yaml +280 -0
  75. data/data/matrix-spec/api/client-server/login.yaml +321 -0
  76. data/data/matrix-spec/api/client-server/login_token.yaml +138 -0
  77. data/data/matrix-spec/api/client-server/logout.yaml +86 -0
  78. data/data/matrix-spec/api/client-server/message_pagination.yaml +194 -0
  79. data/data/matrix-spec/api/client-server/notifications.yaml +152 -0
  80. data/data/matrix-spec/api/client-server/oauth_server_metadata.yaml +238 -0
  81. data/data/matrix-spec/api/client-server/old_sync.yaml +379 -0
  82. data/data/matrix-spec/api/client-server/openid.yaml +98 -0
  83. data/data/matrix-spec/api/client-server/password_management.yaml +246 -0
  84. data/data/matrix-spec/api/client-server/peeking_events.yaml +122 -0
  85. data/data/matrix-spec/api/client-server/policy_server.yaml +82 -0
  86. data/data/matrix-spec/api/client-server/presence.yaml +169 -0
  87. data/data/matrix-spec/api/client-server/profile.yaml +366 -0
  88. data/data/matrix-spec/api/client-server/pusher.yaml +303 -0
  89. data/data/matrix-spec/api/client-server/pushrules.yaml +633 -0
  90. data/data/matrix-spec/api/client-server/read_markers.yaml +103 -0
  91. data/data/matrix-spec/api/client-server/receipts.yaml +139 -0
  92. data/data/matrix-spec/api/client-server/redaction.yaml +116 -0
  93. data/data/matrix-spec/api/client-server/refresh.yaml +119 -0
  94. data/data/matrix-spec/api/client-server/registration.yaml +488 -0
  95. data/data/matrix-spec/api/client-server/registration_tokens.yaml +93 -0
  96. data/data/matrix-spec/api/client-server/relations.yaml +382 -0
  97. data/data/matrix-spec/api/client-server/report_content.yaml +283 -0
  98. data/data/matrix-spec/api/client-server/room_event_by_timestamp.yaml +147 -0
  99. data/data/matrix-spec/api/client-server/room_initial_sync.yaml +188 -0
  100. data/data/matrix-spec/api/client-server/room_send.yaml +130 -0
  101. data/data/matrix-spec/api/client-server/room_state.yaml +159 -0
  102. data/data/matrix-spec/api/client-server/room_summary.yaml +138 -0
  103. data/data/matrix-spec/api/client-server/room_upgrades.yaml +130 -0
  104. data/data/matrix-spec/api/client-server/rooms.yaml +380 -0
  105. data/data/matrix-spec/api/client-server/search.yaml +385 -0
  106. data/data/matrix-spec/api/client-server/space_hierarchy.yaml +237 -0
  107. data/data/matrix-spec/api/client-server/sso_login_redirect.yaml +135 -0
  108. data/data/matrix-spec/api/client-server/support.yaml +142 -0
  109. data/data/matrix-spec/api/client-server/sync.yaml +692 -0
  110. data/data/matrix-spec/api/client-server/tags.yaml +183 -0
  111. data/data/matrix-spec/api/client-server/third_party_lookup.yaml +324 -0
  112. data/data/matrix-spec/api/client-server/third_party_membership.yaml +139 -0
  113. data/data/matrix-spec/api/client-server/threads_list.yaml +167 -0
  114. data/data/matrix-spec/api/client-server/to_device.yaml +104 -0
  115. data/data/matrix-spec/api/client-server/typing.yaml +103 -0
  116. data/data/matrix-spec/api/client-server/users.yaml +136 -0
  117. data/data/matrix-spec/api/client-server/versions.yaml +108 -0
  118. data/data/matrix-spec/api/client-server/voip.yaml +93 -0
  119. data/data/matrix-spec/api/client-server/wellknown.yaml +60 -0
  120. data/data/matrix-spec/api/client-server/whoami.yaml +121 -0
  121. data/data/matrix-spec/event-schemas/examples/core/event.json +6 -0
  122. data/data/matrix-spec/event-schemas/examples/core/room_edu.json +3 -0
  123. data/data/matrix-spec/event-schemas/examples/core/room_event.json +11 -0
  124. data/data/matrix-spec/event-schemas/examples/core/state_event.json +4 -0
  125. data/data/matrix-spec/event-schemas/examples/invite_room_state.json +18 -0
  126. data/data/matrix-spec/event-schemas/examples/knock_room_state.json +18 -0
  127. data/data/matrix-spec/event-schemas/examples/m.accepted_terms.yaml +10 -0
  128. data/data/matrix-spec/event-schemas/examples/m.call.answer.yaml +21 -0
  129. data/data/matrix-spec/event-schemas/examples/m.call.candidates.yaml +16 -0
  130. data/data/matrix-spec/event-schemas/examples/m.call.hangup.yaml +10 -0
  131. data/data/matrix-spec/event-schemas/examples/m.call.invite.yaml +22 -0
  132. data/data/matrix-spec/event-schemas/examples/m.call.negotiate.yaml +22 -0
  133. data/data/matrix-spec/event-schemas/examples/m.call.reject.yaml +9 -0
  134. data/data/matrix-spec/event-schemas/examples/m.call.sdp_stream_metadata_changed.yaml +16 -0
  135. data/data/matrix-spec/event-schemas/examples/m.call.select_answer.yaml +10 -0
  136. data/data/matrix-spec/event-schemas/examples/m.direct.yaml +10 -0
  137. data/data/matrix-spec/event-schemas/examples/m.dummy.yaml +4 -0
  138. data/data/matrix-spec/event-schemas/examples/m.forwarded_room_key.yaml +14 -0
  139. data/data/matrix-spec/event-schemas/examples/m.fully_read.yaml +7 -0
  140. data/data/matrix-spec/event-schemas/examples/m.identity_server.yaml +7 -0
  141. data/data/matrix-spec/event-schemas/examples/m.ignored_user_list.yaml +9 -0
  142. data/data/matrix-spec/event-schemas/examples/m.invite_permission_config.yaml +7 -0
  143. data/data/matrix-spec/event-schemas/examples/m.key.verification.accept.yaml +12 -0
  144. data/data/matrix-spec/event-schemas/examples/m.key.verification.cancel.yaml +8 -0
  145. data/data/matrix-spec/event-schemas/examples/m.key.verification.done.yaml +6 -0
  146. data/data/matrix-spec/event-schemas/examples/m.key.verification.key.yaml +7 -0
  147. data/data/matrix-spec/event-schemas/examples/m.key.verification.mac.yaml +10 -0
  148. data/data/matrix-spec/event-schemas/examples/m.key.verification.ready.yaml +10 -0
  149. data/data/matrix-spec/event-schemas/examples/m.key.verification.request.yaml +11 -0
  150. data/data/matrix-spec/event-schemas/examples/m.key.verification.start$m.sas.v1.yaml +12 -0
  151. data/data/matrix-spec/event-schemas/examples/m.key.verification.start.yaml +8 -0
  152. data/data/matrix-spec/event-schemas/examples/m.key_backup.yaml +7 -0
  153. data/data/matrix-spec/event-schemas/examples/m.marked_unread.yaml +7 -0
  154. data/data/matrix-spec/event-schemas/examples/m.policy.rule.room.yaml +10 -0
  155. data/data/matrix-spec/event-schemas/examples/m.policy.rule.server.yaml +10 -0
  156. data/data/matrix-spec/event-schemas/examples/m.policy.rule.user.yaml +10 -0
  157. data/data/matrix-spec/event-schemas/examples/m.presence.yaml +12 -0
  158. data/data/matrix-spec/event-schemas/examples/m.push_rules.yaml +177 -0
  159. data/data/matrix-spec/event-schemas/examples/m.reaction.yaml +11 -0
  160. data/data/matrix-spec/event-schemas/examples/m.receipt.yaml +18 -0
  161. data/data/matrix-spec/event-schemas/examples/m.recent_emoji.yaml +16 -0
  162. data/data/matrix-spec/event-schemas/examples/m.room.avatar.yaml +14 -0
  163. data/data/matrix-spec/event-schemas/examples/m.room.canonical_alias.yaml +12 -0
  164. data/data/matrix-spec/event-schemas/examples/m.room.create.yaml +13 -0
  165. data/data/matrix-spec/event-schemas/examples/m.room.encrypted$megolm.yaml +11 -0
  166. data/data/matrix-spec/event-schemas/examples/m.room.encrypted$olm.yaml +14 -0
  167. data/data/matrix-spec/event-schemas/examples/m.room.encryption.yaml +10 -0
  168. data/data/matrix-spec/event-schemas/examples/m.room.guest_access.yaml +8 -0
  169. data/data/matrix-spec/event-schemas/examples/m.room.history_visibility.yaml +8 -0
  170. data/data/matrix-spec/event-schemas/examples/m.room.join_rules$restricted.yaml +18 -0
  171. data/data/matrix-spec/event-schemas/examples/m.room.join_rules.yaml +8 -0
  172. data/data/matrix-spec/event-schemas/examples/m.room.member$invite_room_state.yaml +15 -0
  173. data/data/matrix-spec/event-schemas/examples/m.room.member$join_authorised_via_users_server.yaml +12 -0
  174. data/data/matrix-spec/event-schemas/examples/m.room.member$knock_room_state.yaml +15 -0
  175. data/data/matrix-spec/event-schemas/examples/m.room.member$third_party_invite.yaml +20 -0
  176. data/data/matrix-spec/event-schemas/examples/m.room.member.yaml +12 -0
  177. data/data/matrix-spec/event-schemas/examples/m.room.message$m.audio.yaml +14 -0
  178. data/data/matrix-spec/event-schemas/examples/m.room.message$m.emote.yaml +10 -0
  179. data/data/matrix-spec/event-schemas/examples/m.room.message$m.file.yaml +14 -0
  180. data/data/matrix-spec/event-schemas/examples/m.room.message$m.image.yaml +16 -0
  181. data/data/matrix-spec/event-schemas/examples/m.room.message$m.key.verification.request.yaml +19 -0
  182. data/data/matrix-spec/event-schemas/examples/m.room.message$m.location.yaml +18 -0
  183. data/data/matrix-spec/event-schemas/examples/m.room.message$m.notice.yaml +10 -0
  184. data/data/matrix-spec/event-schemas/examples/m.room.message$m.server_notice.yaml +11 -0
  185. data/data/matrix-spec/event-schemas/examples/m.room.message$m.text.yaml +10 -0
  186. data/data/matrix-spec/event-schemas/examples/m.room.message$m.video.yaml +23 -0
  187. data/data/matrix-spec/event-schemas/examples/m.room.name.yaml +8 -0
  188. data/data/matrix-spec/event-schemas/examples/m.room.pinned_events.yaml +8 -0
  189. data/data/matrix-spec/event-schemas/examples/m.room.policy.yaml +11 -0
  190. data/data/matrix-spec/event-schemas/examples/m.room.power_levels.yaml +24 -0
  191. data/data/matrix-spec/event-schemas/examples/m.room.redaction.yaml +8 -0
  192. data/data/matrix-spec/event-schemas/examples/m.room.server_acl.yaml +10 -0
  193. data/data/matrix-spec/event-schemas/examples/m.room.third_party_invite.yaml +14 -0
  194. data/data/matrix-spec/event-schemas/examples/m.room.tombstone.yaml +9 -0
  195. data/data/matrix-spec/event-schemas/examples/m.room.topic.yaml +16 -0
  196. data/data/matrix-spec/event-schemas/examples/m.room_key.withheld.yaml +12 -0
  197. data/data/matrix-spec/event-schemas/examples/m.room_key.yaml +10 -0
  198. data/data/matrix-spec/event-schemas/examples/m.room_key_request$cancel_request.yaml +8 -0
  199. data/data/matrix-spec/event-schemas/examples/m.room_key_request$request.yaml +14 -0
  200. data/data/matrix-spec/event-schemas/examples/m.secret.request.yaml +9 -0
  201. data/data/matrix-spec/event-schemas/examples/m.secret.send.yaml +7 -0
  202. data/data/matrix-spec/event-schemas/examples/m.space.child.yaml +10 -0
  203. data/data/matrix-spec/event-schemas/examples/m.space.parent.yaml +9 -0
  204. data/data/matrix-spec/event-schemas/examples/m.sticker.yaml +22 -0
  205. data/data/matrix-spec/event-schemas/examples/m.tag.yaml +9 -0
  206. data/data/matrix-spec/event-schemas/examples/m.typing.yaml +7 -0
  207. data/data/matrix-spec/event-schemas/moderation_policy_rule.yaml +32 -0
  208. data/data/matrix-spec/event-schemas/schema/components/m_text_content_block.yaml +28 -0
  209. data/data/matrix-spec/event-schemas/schema/components/sdp_stream_metadata.yaml +43 -0
  210. data/data/matrix-spec/event-schemas/schema/components/signed_third_party_invite.yaml +48 -0
  211. data/data/matrix-spec/event-schemas/schema/core-event-schema/call_event.yaml +27 -0
  212. data/data/matrix-spec/event-schemas/schema/core-event-schema/event.yaml +16 -0
  213. data/data/matrix-spec/event-schemas/schema/core-event-schema/msgtype_infos/avatar_info.yaml +30 -0
  214. data/data/matrix-spec/event-schemas/schema/core-event-schema/msgtype_infos/image_info.yaml +52 -0
  215. data/data/matrix-spec/event-schemas/schema/core-event-schema/msgtype_infos/thumbnail_info.yaml +22 -0
  216. data/data/matrix-spec/event-schemas/schema/core-event-schema/room_event.yaml +17 -0
  217. data/data/matrix-spec/event-schemas/schema/core-event-schema/state_event.yaml +8 -0
  218. data/data/matrix-spec/event-schemas/schema/core-event-schema/stripped_state.yaml +48 -0
  219. data/data/matrix-spec/event-schemas/schema/core-event-schema/sync_room_event.yaml +49 -0
  220. data/data/matrix-spec/event-schemas/schema/core-event-schema/sync_state_event.yaml +36 -0
  221. data/data/matrix-spec/event-schemas/schema/core-event-schema/unsigned_prop.yaml +23 -0
  222. data/data/matrix-spec/event-schemas/schema/m.accepted_terms.yaml +25 -0
  223. data/data/matrix-spec/event-schemas/schema/m.call.answer.yaml +44 -0
  224. data/data/matrix-spec/event-schemas/schema/m.call.candidates.yaml +52 -0
  225. data/data/matrix-spec/event-schemas/schema/m.call.hangup.yaml +57 -0
  226. data/data/matrix-spec/event-schemas/schema/m.call.invite.yaml +53 -0
  227. data/data/matrix-spec/event-schemas/schema/m.call.negotiate.yaml +78 -0
  228. data/data/matrix-spec/event-schemas/schema/m.call.reject.yaml +29 -0
  229. data/data/matrix-spec/event-schemas/schema/m.call.sdp_stream_metadata_changed.yaml +24 -0
  230. data/data/matrix-spec/event-schemas/schema/m.call.select_answer.yaml +29 -0
  231. data/data/matrix-spec/event-schemas/schema/m.direct.yaml +29 -0
  232. data/data/matrix-spec/event-schemas/schema/m.dummy.yaml +25 -0
  233. data/data/matrix-spec/event-schemas/schema/m.forwarded_room_key.yaml +70 -0
  234. data/data/matrix-spec/event-schemas/schema/m.fully_read.yaml +26 -0
  235. data/data/matrix-spec/event-schemas/schema/m.identity_server.yaml +28 -0
  236. data/data/matrix-spec/event-schemas/schema/m.ignored_user_list.yaml +30 -0
  237. data/data/matrix-spec/event-schemas/schema/m.invite_permission_config.yaml +21 -0
  238. data/data/matrix-spec/event-schemas/schema/m.key.verification.accept.yaml +63 -0
  239. data/data/matrix-spec/event-schemas/schema/m.key.verification.cancel.yaml +72 -0
  240. data/data/matrix-spec/event-schemas/schema/m.key.verification.done.yaml +24 -0
  241. data/data/matrix-spec/event-schemas/schema/m.key.verification.key.yaml +31 -0
  242. data/data/matrix-spec/event-schemas/schema/m.key.verification.m.relates_to.yaml +23 -0
  243. data/data/matrix-spec/event-schemas/schema/m.key.verification.mac.yaml +43 -0
  244. data/data/matrix-spec/event-schemas/schema/m.key.verification.ready.yaml +41 -0
  245. data/data/matrix-spec/event-schemas/schema/m.key.verification.request.yaml +47 -0
  246. data/data/matrix-spec/event-schemas/schema/m.key.verification.start$m.reciprocate.v1.yaml +45 -0
  247. data/data/matrix-spec/event-schemas/schema/m.key.verification.start$m.sas.v1.yaml +76 -0
  248. data/data/matrix-spec/event-schemas/schema/m.key.verification.start.yaml +46 -0
  249. data/data/matrix-spec/event-schemas/schema/m.key_backup.yaml +24 -0
  250. data/data/matrix-spec/event-schemas/schema/m.marked_unread.yaml +26 -0
  251. data/data/matrix-spec/event-schemas/schema/m.policy.rule.room.yaml +17 -0
  252. data/data/matrix-spec/event-schemas/schema/m.policy.rule.server.yaml +17 -0
  253. data/data/matrix-spec/event-schemas/schema/m.policy.rule.user.yaml +17 -0
  254. data/data/matrix-spec/event-schemas/schema/m.presence.yaml +50 -0
  255. data/data/matrix-spec/event-schemas/schema/m.push_rules.yaml +23 -0
  256. data/data/matrix-spec/event-schemas/schema/m.reaction.yaml +45 -0
  257. data/data/matrix-spec/event-schemas/schema/m.receipt.yaml +65 -0
  258. data/data/matrix-spec/event-schemas/schema/m.recent_emoji.yaml +29 -0
  259. data/data/matrix-spec/event-schemas/schema/m.room.avatar.yaml +29 -0
  260. data/data/matrix-spec/event-schemas/schema/m.room.canonical_alias.yaml +40 -0
  261. data/data/matrix-spec/event-schemas/schema/m.room.create.yaml +86 -0
  262. data/data/matrix-spec/event-schemas/schema/m.room.encrypted.yaml +91 -0
  263. data/data/matrix-spec/event-schemas/schema/m.room.encryption.yaml +38 -0
  264. data/data/matrix-spec/event-schemas/schema/m.room.guest_access.yaml +28 -0
  265. data/data/matrix-spec/event-schemas/schema/m.room.history_visibility.yaml +30 -0
  266. data/data/matrix-spec/event-schemas/schema/m.room.join_rules.yaml +78 -0
  267. data/data/matrix-spec/event-schemas/schema/m.room.member.yaml +174 -0
  268. data/data/matrix-spec/event-schemas/schema/m.room.message$m.audio.yaml +73 -0
  269. data/data/matrix-spec/event-schemas/schema/m.room.message$m.emote.yaml +36 -0
  270. data/data/matrix-spec/event-schemas/schema/m.room.message$m.file.yaml +85 -0
  271. data/data/matrix-spec/event-schemas/schema/m.room.message$m.image.yaml +63 -0
  272. data/data/matrix-spec/event-schemas/schema/m.room.message$m.key.verification.request.yaml +70 -0
  273. data/data/matrix-spec/event-schemas/schema/m.room.message$m.location.yaml +50 -0
  274. data/data/matrix-spec/event-schemas/schema/m.room.message$m.notice.yaml +36 -0
  275. data/data/matrix-spec/event-schemas/schema/m.room.message$m.server_notice.yaml +41 -0
  276. data/data/matrix-spec/event-schemas/schema/m.room.message$m.text.yaml +36 -0
  277. data/data/matrix-spec/event-schemas/schema/m.room.message$m.video.yaml +95 -0
  278. data/data/matrix-spec/event-schemas/schema/m.room.message.yaml +25 -0
  279. data/data/matrix-spec/event-schemas/schema/m.room.name.yaml +35 -0
  280. data/data/matrix-spec/event-schemas/schema/m.room.pinned_events.yaml +27 -0
  281. data/data/matrix-spec/event-schemas/schema/m.room.policy.yaml +41 -0
  282. data/data/matrix-spec/event-schemas/schema/m.room.power_levels.yaml +139 -0
  283. data/data/matrix-spec/event-schemas/schema/m.room.redaction.yaml +29 -0
  284. data/data/matrix-spec/event-schemas/schema/m.room.server_acl.yaml +88 -0
  285. data/data/matrix-spec/event-schemas/schema/m.room.third_party_invite.yaml +79 -0
  286. data/data/matrix-spec/event-schemas/schema/m.room.tombstone.yaml +29 -0
  287. data/data/matrix-spec/event-schemas/schema/m.room.topic.yaml +53 -0
  288. data/data/matrix-spec/event-schemas/schema/m.room_key.withheld.yaml +88 -0
  289. data/data/matrix-spec/event-schemas/schema/m.room_key.yaml +38 -0
  290. data/data/matrix-spec/event-schemas/schema/m.room_key_request.yaml +73 -0
  291. data/data/matrix-spec/event-schemas/schema/m.secret.request.yaml +42 -0
  292. data/data/matrix-spec/event-schemas/schema/m.secret.send.yaml +35 -0
  293. data/data/matrix-spec/event-schemas/schema/m.space.child.yaml +50 -0
  294. data/data/matrix-spec/event-schemas/schema/m.space.parent.yaml +36 -0
  295. data/data/matrix-spec/event-schemas/schema/m.sticker.yaml +36 -0
  296. data/data/matrix-spec/event-schemas/schema/m.tag.yaml +28 -0
  297. data/data/matrix-spec/event-schemas/schema/m.typing.yaml +29 -0
  298. data/lib/async/matrix/api/chain.rb +575 -0
  299. data/lib/async/matrix/api/concat.rb +105 -0
  300. data/lib/async/matrix/api/path_tree.rb +208 -0
  301. data/lib/async/matrix/api.rb +204 -0
  302. data/lib/async/matrix/application_service/bot.rb +235 -0
  303. data/lib/async/matrix/application_service/config/schema/analytics.json +21 -0
  304. data/lib/async/matrix/application_service/config/schema/appservice.json +82 -0
  305. data/lib/async/matrix/application_service/config/schema/backfill.json +91 -0
  306. data/lib/async/matrix/application_service/config/schema/bridge.json +209 -0
  307. data/lib/async/matrix/application_service/config/schema/config.json +61 -0
  308. data/lib/async/matrix/application_service/config/schema/database.json +38 -0
  309. data/lib/async/matrix/application_service/config/schema/direct_media.json +35 -0
  310. data/lib/async/matrix/application_service/config/schema/double_puppet.json +24 -0
  311. data/lib/async/matrix/application_service/config/schema/encryption.json +164 -0
  312. data/lib/async/matrix/application_service/config/schema/homeserver.json +58 -0
  313. data/lib/async/matrix/application_service/config/schema/logging.json +50 -0
  314. data/lib/async/matrix/application_service/config/schema/management_room_texts.json +25 -0
  315. data/lib/async/matrix/application_service/config/schema/matrix.json +45 -0
  316. data/lib/async/matrix/application_service/config/schema/permissions.json +54 -0
  317. data/lib/async/matrix/application_service/config/schema/provisioning.json +23 -0
  318. data/lib/async/matrix/application_service/config/schema/public_media.json +39 -0
  319. data/lib/async/matrix/application_service/config/schema/relay.json +43 -0
  320. data/lib/async/matrix/application_service/config/vivify.rb +110 -0
  321. data/lib/async/matrix/application_service/config.rb +214 -123
  322. data/lib/async/matrix/application_service/dispatcher.rb +115 -113
  323. data/lib/async/matrix/application_service/error_response.rb +26 -26
  324. data/lib/async/matrix/application_service/event.rb +217 -1
  325. data/lib/async/matrix/application_service/server.rb +286 -215
  326. data/lib/async/matrix/application_service/transaction.rb +52 -52
  327. data/lib/async/matrix/application_service/transaction_store.rb +62 -62
  328. data/lib/async/matrix/client.rb +919 -179
  329. data/lib/async/matrix/connection.rb +8 -8
  330. data/lib/async/matrix/endpoint.rb +45 -45
  331. data/lib/async/matrix/error.rb +49 -43
  332. data/lib/async/matrix/media_client.rb +173 -0
  333. data/lib/async/matrix/notifier.rb +92 -92
  334. data/lib/async/matrix/schema/registry.rb +355 -0
  335. data/lib/async/matrix/schema/validation_error.rb +226 -0
  336. data/lib/async/matrix/schema.rb +174 -0
  337. data/lib/async/matrix/server.rb +7 -7
  338. data/lib/async/matrix/stream.rb +7 -7
  339. data/lib/async/matrix/version.rb +1 -1
  340. data/lib/async/matrix.rb +2 -2
  341. metadata +353 -1
@@ -10,222 +10,293 @@ require "console"
10
10
  require "async/matrix"
11
11
 
12
12
  module Async
13
- module Matrix
14
- module ApplicationService
15
- # Rack 3 application implementing the Matrix Application Service API.
16
- #
17
- # Routes:
18
- # PUT /_matrix/app/v1/transactions/{txnId} — receive events from homeserver
19
- # GET /_matrix/app/v1/users/{userId} — user existence query
20
- # GET /_matrix/app/v1/rooms/{roomAlias} — room alias query
21
- # POST /_matrix/app/v1/ping — healthcheck
22
- class Server
23
- CONTENT_JSON = {"content-type" => "application/json"}.freeze
24
- EMPTY_BODY = ["{}"].freeze
25
-
26
- RESP_NOT_FOUND = [404, CONTENT_JSON, ['{"errcode":"M_UNRECOGNIZED"}']].freeze
27
- RESP_FORBIDDEN = [403, CONTENT_JSON, ['{"errcode":"M_FORBIDDEN"}']].freeze
28
- RESP_BAD_JSON = [400, CONTENT_JSON, ['{"errcode":"M_BAD_JSON"}']].freeze
29
- RESP_BAD_METHOD = [405, CONTENT_JSON, ['{"errcode":"M_UNRECOGNIZED"}']].freeze
30
-
31
- def initialize(hs_token:, dispatcher:)
32
- @hs_token = hs_token
33
- @dispatcher = dispatcher
34
- @txn_store = TransactionStore.new
35
- end
36
-
37
- def call(env)
38
- request = Rack::Request.new(env)
39
- method = request.request_method
40
- path = request.path_info
41
-
42
- case path
43
- when %r{\A/_matrix/app/v1/transactions/(.+)\z}
44
- return RESP_BAD_METHOD unless method == "PUT"
45
- return RESP_FORBIDDEN unless authorized?(request)
46
- handle_transaction(request, Regexp.last_match(1))
47
-
48
- when %r{\A/_matrix/app/v1/users/(.+)\z}
49
- return RESP_BAD_METHOD unless method == "GET"
50
- return RESP_FORBIDDEN unless authorized?(request)
51
- [200, CONTENT_JSON, EMPTY_BODY]
52
-
53
- when %r{\A/_matrix/app/v1/rooms/(.+)\z}
54
- return RESP_BAD_METHOD unless method == "GET"
55
- return RESP_FORBIDDEN unless authorized?(request)
56
- RESP_NOT_FOUND
57
-
58
- when "/_matrix/app/v1/ping"
59
- return RESP_BAD_METHOD unless method == "POST"
60
- [200, CONTENT_JSON, EMPTY_BODY]
61
-
62
- else
63
- RESP_NOT_FOUND
64
- end
65
- end
66
-
67
- private
68
-
69
- def authorized?(request)
70
- token = extract_token(request)
71
- return false unless token
72
- secure_compare(token, @hs_token)
73
- end
74
-
75
- def extract_token(request)
76
- auth = request.get_header("HTTP_AUTHORIZATION")
77
- if auth && auth.start_with?("Bearer ")
78
- return auth.delete_prefix("Bearer ")
79
- end
80
- request.params["access_token"]
81
- end
82
-
83
- def secure_compare(a, b)
84
- return false unless a.bytesize == b.bytesize
85
- l = a.unpack("C*")
86
- r = b.unpack("C*")
87
- result = 0
88
- l.each_with_index { |byte, i| result |= byte ^ r[i] }
89
- result.zero?
90
- end
91
-
92
- def handle_transaction(request, txn_id)
93
- if @txn_store.seen?(txn_id)
94
- Console.debug(self) { "Duplicate transaction #{txn_id} — skipping" }
95
- return [200, CONTENT_JSON, EMPTY_BODY]
96
- end
97
-
98
- body = parse_json(request)
99
- return RESP_BAD_JSON unless body
100
-
101
- Console.info(self) {
102
- event_count = (body["events"] || []).size
103
- "Transaction #{txn_id}: #{event_count} event(s)"
104
- }
105
-
106
- @dispatcher.dispatch_transaction(body)
107
- @txn_store.mark_seen(txn_id)
108
-
109
- [200, CONTENT_JSON, EMPTY_BODY]
110
- end
111
-
112
- def parse_json(request)
113
- raw = request.body&.read
114
- return nil if raw.nil? || raw.empty?
115
- JSON.parse(raw)
116
- rescue JSON::ParserError => e
117
- Console.error(self) { "Bad JSON in transaction: #{e.message}" }
118
- nil
119
- end
120
- end
121
- end
122
- end
13
+ module Matrix
14
+ module ApplicationService
15
+ # Rack 3 application implementing the Matrix Application Service API.
16
+ #
17
+ # Routes:
18
+ # PUT /_matrix/app/v1/transactions/{txnId} — receive events from homeserver
19
+ # GET /_matrix/app/v1/users/{userId} — user existence query
20
+ # GET /_matrix/app/v1/rooms/{roomAlias} — room alias query
21
+ # POST /_matrix/app/v1/ping — healthcheck
22
+ class Server
23
+ CONTENT_JSON = {"content-type" => "application/json"}.freeze
24
+ EMPTY_BODY = ["{}"].freeze
25
+
26
+ RESP_NOT_FOUND = [404, CONTENT_JSON, ['{"errcode":"M_UNRECOGNIZED"}']].freeze
27
+ RESP_FORBIDDEN = [403, CONTENT_JSON, ['{"errcode":"M_FORBIDDEN"}']].freeze
28
+ RESP_BAD_JSON = [400, CONTENT_JSON, ['{"errcode":"M_BAD_JSON"}']].freeze
29
+ RESP_BAD_METHOD = [405, CONTENT_JSON, ['{"errcode":"M_UNRECOGNIZED"}']].freeze
30
+
31
+ def initialize(hs_token:, dispatcher: Dispatcher.new)
32
+ @hs_token = hs_token
33
+ @dispatcher = dispatcher
34
+ @txn_store = TransactionStore.new
35
+ end
36
+
37
+ # Register a Bot or a plain handler on the internal dispatcher.
38
+ #
39
+ # Accepts either:
40
+ # - A Bot (responds to #handlers) — registers all its handlers
41
+ # - A plain handler (responds to #event_types and #call)
42
+ #
43
+ def register(handler)
44
+ if handler.respond_to?(:handlers)
45
+ handler.handlers.each { |h| @dispatcher.register(h) }
46
+ else
47
+ @dispatcher.register(handler)
48
+ end
49
+ end
50
+
51
+ def call(env)
52
+ request = Rack::Request.new(env)
53
+ method = request.request_method
54
+ path = request.path_info
55
+
56
+ case path
57
+ when %r{\A/_matrix/app/v1/transactions/(.+)\z}
58
+ return RESP_BAD_METHOD unless method == "PUT"
59
+ return RESP_FORBIDDEN unless authorized?(request)
60
+ handle_transaction(request, Regexp.last_match(1))
61
+
62
+ when %r{\A/_matrix/app/v1/users/(.+)\z}
63
+ return RESP_BAD_METHOD unless method == "GET"
64
+ return RESP_FORBIDDEN unless authorized?(request)
65
+ [200, CONTENT_JSON, EMPTY_BODY]
66
+
67
+ when %r{\A/_matrix/app/v1/rooms/(.+)\z}
68
+ return RESP_BAD_METHOD unless method == "GET"
69
+ return RESP_FORBIDDEN unless authorized?(request)
70
+ RESP_NOT_FOUND
71
+
72
+ when "/_matrix/app/v1/ping"
73
+ return RESP_BAD_METHOD unless method == "POST"
74
+ [200, CONTENT_JSON, EMPTY_BODY]
75
+
76
+ else
77
+ RESP_NOT_FOUND
78
+ end
79
+ end
80
+
81
+ private
82
+
83
+ def authorized?(request)
84
+ extract_token(request).then do |token|
85
+ if token
86
+ secure_compare(token, @hs_token)
87
+ else
88
+ false
89
+ end
90
+ end
91
+ end
92
+
93
+ def extract_token(request)
94
+ auth = request.get_header("HTTP_AUTHORIZATION")
95
+ if auth && auth.start_with?("Bearer ")
96
+ auth.delete_prefix("Bearer ")
97
+ else
98
+ request.params["access_token"]
99
+ end
100
+ end
101
+
102
+ def secure_compare(a, b)
103
+ if a.bytesize == b.bytesize
104
+ l = a.unpack("C*")
105
+ r = b.unpack("C*")
106
+ result = 0
107
+ l.each_with_index { |byte, i| result |= byte ^ r[i] }
108
+ result.zero?
109
+ else
110
+ false
111
+ end
112
+ end
113
+
114
+ def handle_transaction(request, txn_id)
115
+ if @txn_store.seen?(txn_id)
116
+ Console.debug(self) { "Duplicate transaction #{txn_id} — skipping" }
117
+ [200, CONTENT_JSON, EMPTY_BODY]
118
+ else
119
+ parse_json(request).then do |body|
120
+ if body
121
+ Console.info(self) {
122
+ event_count = (body["events"] || []).size
123
+ "Transaction #{txn_id}: #{event_count} event(s)"
124
+ }
125
+
126
+ @dispatcher.dispatch_transaction(body)
127
+ @txn_store.mark_seen(txn_id)
128
+
129
+ [200, CONTENT_JSON, EMPTY_BODY]
130
+ else
131
+ RESP_BAD_JSON
132
+ end
133
+ end
134
+ end
135
+ end
136
+
137
+ def parse_json(request)
138
+ request.body&.read.then do |raw|
139
+ if raw && !raw.empty?
140
+ JSON.parse(raw)
141
+ end
142
+ end
143
+ rescue JSON::ParserError => e
144
+ Console.error(self) { "Bad JSON in transaction: #{e.message}" }
145
+ nil
146
+ end
147
+ end
148
+ end
149
+ end
123
150
  end
124
151
 
125
152
  test do
126
- require "stringio"
127
- require "async/matrix"
128
-
129
- describe "Async::Matrix::ApplicationService::Server" do
130
- def build_server(hs_token: "secret")
131
- dispatcher = Async::Matrix::ApplicationService::Dispatcher.new
132
- Async::Matrix::ApplicationService::Server.new(hs_token: hs_token, dispatcher: dispatcher)
133
- end
134
-
135
- def env(method, path, headers: {}, body: nil, params: {})
136
- rack_env = {
137
- "REQUEST_METHOD" => method,
138
- "PATH_INFO" => path,
139
- "QUERY_STRING" => params.map { |k, v| "#{k}=#{v}" }.join("&"),
140
- "rack.input" => body ? StringIO.new(body) : StringIO.new("")
141
- }
142
- headers.each { |k, v| rack_env["HTTP_#{k.upcase.tr("-", "_")}"] = v }
143
- rack_env
144
- end
145
-
146
- # --- Ping ---
147
-
148
- it "responds to POST /ping with 200" do
149
- server = build_server
150
- status, _, _ = server.call(env("POST", "/_matrix/app/v1/ping"))
151
- status.should == 200
152
- end
153
-
154
- it "rejects GET /ping with 405" do
155
- server = build_server
156
- status, _, _ = server.call(env("GET", "/_matrix/app/v1/ping"))
157
- status.should == 405
158
- end
159
-
160
- # --- Auth ---
161
-
162
- it "rejects transactions without a token" do
163
- server = build_server
164
- status, _, _ = server.call(env("PUT", "/_matrix/app/v1/transactions/txn1"))
165
- status.should == 403
166
- end
167
-
168
- it "rejects transactions with wrong token" do
169
- server = build_server(hs_token: "correct")
170
- status, _, _ = server.call(env("PUT", "/_matrix/app/v1/transactions/txn1",
171
- headers: {"authorization" => "Bearer wrong"}))
172
- status.should == 403
173
- end
174
-
175
- # --- Transactions ---
176
-
177
- it "accepts valid transactions with Bearer auth" do
178
- server = build_server(hs_token: "secret")
179
- status, _, _ = server.call(env("PUT", "/_matrix/app/v1/transactions/txn1",
180
- headers: {"authorization" => "Bearer secret"},
181
- body: '{"events":[]}'))
182
- status.should == 200
183
- end
184
-
185
- it "deduplicates transactions" do
186
- server = build_server(hs_token: "secret")
187
- rack = env("PUT", "/_matrix/app/v1/transactions/txn1",
188
- headers: {"authorization" => "Bearer secret"},
189
- body: '{"events":[]}')
190
- server.call(rack)
191
- # Second call with same txn_id
192
- rack2 = env("PUT", "/_matrix/app/v1/transactions/txn1",
193
- headers: {"authorization" => "Bearer secret"},
194
- body: '{"events":[]}')
195
- status, _, _ = server.call(rack2)
196
- status.should == 200
197
- end
198
-
199
- it "rejects bad JSON" do
200
- server = build_server(hs_token: "secret")
201
- status, _, _ = server.call(env("PUT", "/_matrix/app/v1/transactions/txn1",
202
- headers: {"authorization" => "Bearer secret"},
203
- body: "not json"))
204
- status.should == 400
205
- end
206
-
207
- # --- Users / Rooms ---
208
-
209
- it "responds 200 for user queries" do
210
- server = build_server(hs_token: "secret")
211
- status, _, _ = server.call(env("GET", "/_matrix/app/v1/users/@bot:localhost",
212
- headers: {"authorization" => "Bearer secret"}))
213
- status.should == 200
214
- end
215
-
216
- it "responds 404 for room queries" do
217
- server = build_server(hs_token: "secret")
218
- status, _, _ = server.call(env("GET", "/_matrix/app/v1/rooms/#room:localhost",
219
- headers: {"authorization" => "Bearer secret"}))
220
- status.should == 404
221
- end
222
-
223
- # --- Unknown routes ---
224
-
225
- it "responds 404 for unknown paths" do
226
- server = build_server
227
- status, _, _ = server.call(env("GET", "/unknown"))
228
- status.should == 404
229
- end
230
- end
153
+ require "stringio"
154
+
155
+ describe "Async::Matrix::ApplicationService::Server" do
156
+ def build_server(hs_token: "secret")
157
+ dispatcher = Async::Matrix::ApplicationService::Dispatcher.new
158
+ Async::Matrix::ApplicationService::Server.new(hs_token: hs_token, dispatcher: dispatcher)
159
+ end
160
+
161
+ def env(method, path, headers: {}, body: nil, params: {})
162
+ rack_env = {
163
+ "REQUEST_METHOD" => method,
164
+ "PATH_INFO" => path,
165
+ "QUERY_STRING" => params.map { |k, v| "#{k}=#{v}" }.join("&"),
166
+ "rack.input" => body ? StringIO.new(body) : StringIO.new("")
167
+ }
168
+ headers.each { |k, v| rack_env["HTTP_#{k.upcase.tr("-", "_")}"] = v }
169
+ rack_env
170
+ end
171
+
172
+ # --- Ping ---
173
+
174
+ it "responds to POST /ping with 200" do
175
+ server = build_server
176
+ status, _, _ = server.call(env("POST", "/_matrix/app/v1/ping"))
177
+ status.should == 200
178
+ end
179
+
180
+ it "rejects GET /ping with 405" do
181
+ server = build_server
182
+ status, _, _ = server.call(env("GET", "/_matrix/app/v1/ping"))
183
+ status.should == 405
184
+ end
185
+
186
+ # --- Auth ---
187
+
188
+ it "rejects transactions without a token" do
189
+ server = build_server
190
+ status, _, _ = server.call(env("PUT", "/_matrix/app/v1/transactions/txn1"))
191
+ status.should == 403
192
+ end
193
+
194
+ it "rejects transactions with wrong token" do
195
+ server = build_server(hs_token: "correct")
196
+ status, _, _ = server.call(env("PUT", "/_matrix/app/v1/transactions/txn1",
197
+ headers: {"authorization" => "Bearer wrong"}))
198
+ status.should == 403
199
+ end
200
+
201
+ # --- Transactions ---
202
+
203
+ it "accepts valid transactions with Bearer auth" do
204
+ server = build_server(hs_token: "secret")
205
+ status, _, _ = server.call(env("PUT", "/_matrix/app/v1/transactions/txn1",
206
+ headers: {"authorization" => "Bearer secret"},
207
+ body: '{"events":[]}'))
208
+ status.should == 200
209
+ end
210
+
211
+ it "deduplicates transactions" do
212
+ server = build_server(hs_token: "secret")
213
+ rack = env("PUT", "/_matrix/app/v1/transactions/txn1",
214
+ headers: {"authorization" => "Bearer secret"},
215
+ body: '{"events":[]}')
216
+ server.call(rack)
217
+ # Second call with same txn_id
218
+ rack2 = env("PUT", "/_matrix/app/v1/transactions/txn1",
219
+ headers: {"authorization" => "Bearer secret"},
220
+ body: '{"events":[]}')
221
+ status, _, _ = server.call(rack2)
222
+ status.should == 200
223
+ end
224
+
225
+ it "rejects bad JSON" do
226
+ server = build_server(hs_token: "secret")
227
+ status, _, _ = server.call(env("PUT", "/_matrix/app/v1/transactions/txn1",
228
+ headers: {"authorization" => "Bearer secret"},
229
+ body: "not json"))
230
+ status.should == 400
231
+ end
232
+
233
+ # --- Users / Rooms ---
234
+
235
+ it "responds 200 for user queries" do
236
+ server = build_server(hs_token: "secret")
237
+ status, _, _ = server.call(env("GET", "/_matrix/app/v1/users/@bot:localhost",
238
+ headers: {"authorization" => "Bearer secret"}))
239
+ status.should == 200
240
+ end
241
+
242
+ it "responds 404 for room queries" do
243
+ server = build_server(hs_token: "secret")
244
+ status, _, _ = server.call(env("GET", "/_matrix/app/v1/rooms/#room:localhost",
245
+ headers: {"authorization" => "Bearer secret"}))
246
+ status.should == 404
247
+ end
248
+
249
+ # --- Unknown routes ---
250
+
251
+ it "responds 404 for unknown paths" do
252
+ server = build_server
253
+ status, _, _ = server.call(env("GET", "/unknown"))
254
+ status.should == 404
255
+ end
256
+
257
+ # --- Default dispatcher + register ---
258
+
259
+ it "creates a default dispatcher when none is provided" do
260
+ server = Async::Matrix::ApplicationService::Server.new(hs_token: "secret")
261
+ status, _, _ = server.call(env("POST", "/_matrix/app/v1/ping"))
262
+ status.should == 200
263
+ end
264
+
265
+ it "registers a plain handler via register" do
266
+ server = Async::Matrix::ApplicationService::Server.new(hs_token: "secret")
267
+
268
+ received = []
269
+ handler = Object.new
270
+ handler.define_singleton_method(:event_types) { ["m.room.message"] }
271
+ handler.define_singleton_method(:call) { |e| received << e }
272
+
273
+ server.register(handler)
274
+
275
+ server.call(env("PUT", "/_matrix/app/v1/transactions/txn_reg",
276
+ headers: {"authorization" => "Bearer secret"},
277
+ body: '{"events":[{"type":"m.room.message","content":{"body":"hi"}}]}'))
278
+
279
+ received.length.should == 1
280
+ end
281
+
282
+ it "registers a bot (object with #handlers) via register" do
283
+ server = Async::Matrix::ApplicationService::Server.new(hs_token: "secret")
284
+
285
+ received = []
286
+ handler = Object.new
287
+ handler.define_singleton_method(:event_types) { ["m.room.message"] }
288
+ handler.define_singleton_method(:call) { |e| received << e }
289
+
290
+ bot = Object.new
291
+ bot.define_singleton_method(:handlers) { [handler] }
292
+
293
+ server.register(bot)
294
+
295
+ server.call(env("PUT", "/_matrix/app/v1/transactions/txn_bot",
296
+ headers: {"authorization" => "Bearer secret"},
297
+ body: '{"events":[{"type":"m.room.message","content":{"body":"hi"}}]}'))
298
+
299
+ received.length.should == 1
300
+ end
301
+ end
231
302
  end
@@ -7,64 +7,64 @@ require "bundler/setup"
7
7
  require "async/matrix"
8
8
 
9
9
  module Async
10
- module Matrix
11
- module ApplicationService
12
- class Transaction
13
- attr_reader :events, :ephemeral
10
+ module Matrix
11
+ module ApplicationService
12
+ class Transaction
13
+ attr_reader :events, :ephemeral
14
14
 
15
- def initialize(data)
16
- @events = (data["events"] || []).map { |e| Event.new(e) }
17
- @ephemeral = (data["de.sorunome.msc2409.ephemeral"] || data["ephemeral"] || []).map { |e| Event.new(e) }
18
- end
19
- end
20
- end
21
- end
15
+ def initialize(data)
16
+ @events = (data["events"] || []).map { |e| Schema.parse(e) }
17
+ @ephemeral = (data["de.sorunome.msc2409.ephemeral"] || data["ephemeral"] || []).map { |e| Schema.parse(e) }
18
+ end
19
+ end
20
+ end
21
+ end
22
22
  end
23
23
 
24
24
  test do
25
- describe "Async::Matrix::ApplicationService::Transaction" do
26
- it "wraps events array" do
27
- txn = Async::Matrix::ApplicationService::Transaction.new({
28
- "events" => [
29
- {"type" => "m.room.message", "content" => {"body" => "one"}},
30
- {"type" => "m.room.message", "content" => {"body" => "two"}}
31
- ]
32
- })
33
- txn.events.length.should == 2
34
- txn.events.first.content.body.should == "one"
35
- txn.events.last.content.body.should == "two"
36
- end
25
+ describe "Async::Matrix::ApplicationService::Transaction" do
26
+ it "wraps events array" do
27
+ txn = Async::Matrix::ApplicationService::Transaction.new({
28
+ "events" => [
29
+ {"type" => "m.room.message", "content" => {"body" => "one"}},
30
+ {"type" => "m.room.message", "content" => {"body" => "two"}}
31
+ ]
32
+ })
33
+ txn.events.length.should == 2
34
+ txn.events.first.content.body.should == "one"
35
+ txn.events.last.content.body.should == "two"
36
+ end
37
37
 
38
- it "defaults to empty events when missing" do
39
- txn = Async::Matrix::ApplicationService::Transaction.new({})
40
- txn.events.should.be.empty
41
- end
38
+ it "defaults to empty events when missing" do
39
+ txn = Async::Matrix::ApplicationService::Transaction.new({})
40
+ txn.events.should.be.empty
41
+ end
42
42
 
43
- it "parses MSC2409 ephemeral events" do
44
- txn = Async::Matrix::ApplicationService::Transaction.new({
45
- "events" => [],
46
- "de.sorunome.msc2409.ephemeral" => [
47
- {"type" => "m.typing", "content" => {}}
48
- ]
49
- })
50
- txn.ephemeral.length.should == 1
51
- txn.ephemeral.first.type.should == "m.typing"
52
- end
43
+ it "parses MSC2409 ephemeral events" do
44
+ txn = Async::Matrix::ApplicationService::Transaction.new({
45
+ "events" => [],
46
+ "de.sorunome.msc2409.ephemeral" => [
47
+ {"type" => "m.typing", "content" => {}}
48
+ ]
49
+ })
50
+ txn.ephemeral.length.should == 1
51
+ txn.ephemeral.first.type.should == "m.typing"
52
+ end
53
53
 
54
- it "falls back to ephemeral key" do
55
- txn = Async::Matrix::ApplicationService::Transaction.new({
56
- "events" => [],
57
- "ephemeral" => [
58
- {"type" => "m.receipt", "content" => {}}
59
- ]
60
- })
61
- txn.ephemeral.length.should == 1
62
- txn.ephemeral.first.type.should == "m.receipt"
63
- end
54
+ it "falls back to ephemeral key" do
55
+ txn = Async::Matrix::ApplicationService::Transaction.new({
56
+ "events" => [],
57
+ "ephemeral" => [
58
+ {"type" => "m.receipt", "content" => {}}
59
+ ]
60
+ })
61
+ txn.ephemeral.length.should == 1
62
+ txn.ephemeral.first.type.should == "m.receipt"
63
+ end
64
64
 
65
- it "defaults to empty ephemeral when missing" do
66
- txn = Async::Matrix::ApplicationService::Transaction.new({"events" => []})
67
- txn.ephemeral.should.be.empty
68
- end
69
- end
65
+ it "defaults to empty ephemeral when missing" do
66
+ txn = Async::Matrix::ApplicationService::Transaction.new({"events" => []})
67
+ txn.ephemeral.should.be.empty
68
+ end
69
+ end
70
70
  end