async-matrix 3.0.0-arm-linux-musl

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 (333) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +200 -0
  3. data/README.md +108 -0
  4. data/data/discord-api-spec/openapi.json +40404 -0
  5. data/data/matrix-spec/api/client-server/account-data.yaml +389 -0
  6. data/data/matrix-spec/api/client-server/account_deactivation.yaml +149 -0
  7. data/data/matrix-spec/api/client-server/admin.yaml +512 -0
  8. data/data/matrix-spec/api/client-server/administrative_contact.yaml +620 -0
  9. data/data/matrix-spec/api/client-server/appservice_ping.yaml +183 -0
  10. data/data/matrix-spec/api/client-server/appservice_room_directory.yaml +104 -0
  11. data/data/matrix-spec/api/client-server/authed-content-repo.yaml +590 -0
  12. data/data/matrix-spec/api/client-server/banning.yaml +177 -0
  13. data/data/matrix-spec/api/client-server/capabilities.yaml +235 -0
  14. data/data/matrix-spec/api/client-server/content-repo.yaml +887 -0
  15. data/data/matrix-spec/api/client-server/create_room.yaml +306 -0
  16. data/data/matrix-spec/api/client-server/cross_signing.yaml +300 -0
  17. data/data/matrix-spec/api/client-server/definitions/auth_data.yaml +34 -0
  18. data/data/matrix-spec/api/client-server/definitions/auth_response.yaml +62 -0
  19. data/data/matrix-spec/api/client-server/definitions/client_device.yaml +44 -0
  20. data/data/matrix-spec/api/client-server/definitions/client_event.yaml +49 -0
  21. data/data/matrix-spec/api/client-server/definitions/client_event_without_room_id.yaml +147 -0
  22. data/data/matrix-spec/api/client-server/definitions/cross_signing_key.yaml +57 -0
  23. data/data/matrix-spec/api/client-server/definitions/device_keys.yaml +70 -0
  24. data/data/matrix-spec/api/client-server/definitions/errors/error.yaml +26 -0
  25. data/data/matrix-spec/api/client-server/definitions/errors/rate_limited.yaml +34 -0
  26. data/data/matrix-spec/api/client-server/definitions/event_batch.yaml +22 -0
  27. data/data/matrix-spec/api/client-server/definitions/event_filter.yaml +55 -0
  28. data/data/matrix-spec/api/client-server/definitions/invite_3pid.yaml +45 -0
  29. data/data/matrix-spec/api/client-server/definitions/key_backup_auth_data.yaml +36 -0
  30. data/data/matrix-spec/api/client-server/definitions/key_backup_data.yaml +50 -0
  31. data/data/matrix-spec/api/client-server/definitions/key_backup_session_data.yaml +57 -0
  32. data/data/matrix-spec/api/client-server/definitions/m.login.terms_params.yaml +83 -0
  33. data/data/matrix-spec/api/client-server/definitions/m.mentions.yaml +33 -0
  34. data/data/matrix-spec/api/client-server/definitions/m.oauth_params.yaml +30 -0
  35. data/data/matrix-spec/api/client-server/definitions/m.relates_to.yaml +45 -0
  36. data/data/matrix-spec/api/client-server/definitions/megolm_export_session_data.yaml +39 -0
  37. data/data/matrix-spec/api/client-server/definitions/olm_payload.yaml +88 -0
  38. data/data/matrix-spec/api/client-server/definitions/one_time_keys.yaml +27 -0
  39. data/data/matrix-spec/api/client-server/definitions/openid_token.yaml +37 -0
  40. data/data/matrix-spec/api/client-server/definitions/protocol.yaml +44 -0
  41. data/data/matrix-spec/api/client-server/definitions/public_rooms_chunk.yaml +74 -0
  42. data/data/matrix-spec/api/client-server/definitions/public_rooms_response.yaml +59 -0
  43. data/data/matrix-spec/api/client-server/definitions/push_condition.yaml +53 -0
  44. data/data/matrix-spec/api/client-server/definitions/push_rule.yaml +53 -0
  45. data/data/matrix-spec/api/client-server/definitions/push_ruleset.yaml +206 -0
  46. data/data/matrix-spec/api/client-server/definitions/recent_emoji.yaml +29 -0
  47. data/data/matrix-spec/api/client-server/definitions/request_email_validation.yaml +36 -0
  48. data/data/matrix-spec/api/client-server/definitions/request_msisdn_validation.yaml +36 -0
  49. data/data/matrix-spec/api/client-server/definitions/request_token_response.yaml +46 -0
  50. data/data/matrix-spec/api/client-server/definitions/room_event_filter.yaml +60 -0
  51. data/data/matrix-spec/api/client-server/definitions/room_key_backup.yaml +37 -0
  52. data/data/matrix-spec/api/client-server/definitions/room_summary.yaml +44 -0
  53. data/data/matrix-spec/api/client-server/definitions/security.yaml +47 -0
  54. data/data/matrix-spec/api/client-server/definitions/sso_login_flow.yaml +98 -0
  55. data/data/matrix-spec/api/client-server/definitions/state_event_batch.yaml +21 -0
  56. data/data/matrix-spec/api/client-server/definitions/sync_filter.yaml +86 -0
  57. data/data/matrix-spec/api/client-server/definitions/tag.yaml +24 -0
  58. data/data/matrix-spec/api/client-server/definitions/third_party_signed.yaml +45 -0
  59. data/data/matrix-spec/api/client-server/definitions/timeline_batch.yaml +36 -0
  60. data/data/matrix-spec/api/client-server/definitions/user_identifier.yaml +27 -0
  61. data/data/matrix-spec/api/client-server/definitions/wellknown/full.yaml +38 -0
  62. data/data/matrix-spec/api/client-server/definitions/wellknown/homeserver.yaml +25 -0
  63. data/data/matrix-spec/api/client-server/definitions/wellknown/identity_server.yaml +25 -0
  64. data/data/matrix-spec/api/client-server/device_management.yaml +314 -0
  65. data/data/matrix-spec/api/client-server/directory.yaml +318 -0
  66. data/data/matrix-spec/api/client-server/event_context.yaml +161 -0
  67. data/data/matrix-spec/api/client-server/filter.yaml +224 -0
  68. data/data/matrix-spec/api/client-server/inviting.yaml +149 -0
  69. data/data/matrix-spec/api/client-server/joining.yaml +238 -0
  70. data/data/matrix-spec/api/client-server/key_backup.yaml +993 -0
  71. data/data/matrix-spec/api/client-server/keys.yaml +482 -0
  72. data/data/matrix-spec/api/client-server/kicking.yaml +110 -0
  73. data/data/matrix-spec/api/client-server/knocking.yaml +152 -0
  74. data/data/matrix-spec/api/client-server/leaving.yaml +163 -0
  75. data/data/matrix-spec/api/client-server/list_joined_rooms.yaml +68 -0
  76. data/data/matrix-spec/api/client-server/list_public_rooms.yaml +280 -0
  77. data/data/matrix-spec/api/client-server/login.yaml +321 -0
  78. data/data/matrix-spec/api/client-server/login_token.yaml +138 -0
  79. data/data/matrix-spec/api/client-server/logout.yaml +86 -0
  80. data/data/matrix-spec/api/client-server/message_pagination.yaml +194 -0
  81. data/data/matrix-spec/api/client-server/notifications.yaml +152 -0
  82. data/data/matrix-spec/api/client-server/oauth_server_metadata.yaml +238 -0
  83. data/data/matrix-spec/api/client-server/old_sync.yaml +379 -0
  84. data/data/matrix-spec/api/client-server/openid.yaml +98 -0
  85. data/data/matrix-spec/api/client-server/password_management.yaml +246 -0
  86. data/data/matrix-spec/api/client-server/peeking_events.yaml +122 -0
  87. data/data/matrix-spec/api/client-server/policy_server.yaml +82 -0
  88. data/data/matrix-spec/api/client-server/presence.yaml +169 -0
  89. data/data/matrix-spec/api/client-server/profile.yaml +366 -0
  90. data/data/matrix-spec/api/client-server/pusher.yaml +303 -0
  91. data/data/matrix-spec/api/client-server/pushrules.yaml +633 -0
  92. data/data/matrix-spec/api/client-server/read_markers.yaml +103 -0
  93. data/data/matrix-spec/api/client-server/receipts.yaml +139 -0
  94. data/data/matrix-spec/api/client-server/redaction.yaml +116 -0
  95. data/data/matrix-spec/api/client-server/refresh.yaml +119 -0
  96. data/data/matrix-spec/api/client-server/registration.yaml +488 -0
  97. data/data/matrix-spec/api/client-server/registration_tokens.yaml +93 -0
  98. data/data/matrix-spec/api/client-server/relations.yaml +382 -0
  99. data/data/matrix-spec/api/client-server/report_content.yaml +283 -0
  100. data/data/matrix-spec/api/client-server/room_event_by_timestamp.yaml +147 -0
  101. data/data/matrix-spec/api/client-server/room_initial_sync.yaml +188 -0
  102. data/data/matrix-spec/api/client-server/room_send.yaml +130 -0
  103. data/data/matrix-spec/api/client-server/room_state.yaml +159 -0
  104. data/data/matrix-spec/api/client-server/room_summary.yaml +138 -0
  105. data/data/matrix-spec/api/client-server/room_upgrades.yaml +130 -0
  106. data/data/matrix-spec/api/client-server/rooms.yaml +380 -0
  107. data/data/matrix-spec/api/client-server/search.yaml +385 -0
  108. data/data/matrix-spec/api/client-server/space_hierarchy.yaml +237 -0
  109. data/data/matrix-spec/api/client-server/sso_login_redirect.yaml +135 -0
  110. data/data/matrix-spec/api/client-server/support.yaml +142 -0
  111. data/data/matrix-spec/api/client-server/sync.yaml +692 -0
  112. data/data/matrix-spec/api/client-server/tags.yaml +183 -0
  113. data/data/matrix-spec/api/client-server/third_party_lookup.yaml +324 -0
  114. data/data/matrix-spec/api/client-server/third_party_membership.yaml +139 -0
  115. data/data/matrix-spec/api/client-server/threads_list.yaml +167 -0
  116. data/data/matrix-spec/api/client-server/to_device.yaml +104 -0
  117. data/data/matrix-spec/api/client-server/typing.yaml +103 -0
  118. data/data/matrix-spec/api/client-server/users.yaml +136 -0
  119. data/data/matrix-spec/api/client-server/versions.yaml +108 -0
  120. data/data/matrix-spec/api/client-server/voip.yaml +93 -0
  121. data/data/matrix-spec/api/client-server/wellknown.yaml +60 -0
  122. data/data/matrix-spec/api/client-server/whoami.yaml +121 -0
  123. data/data/matrix-spec/event-schemas/examples/core/event.json +6 -0
  124. data/data/matrix-spec/event-schemas/examples/core/room_edu.json +3 -0
  125. data/data/matrix-spec/event-schemas/examples/core/room_event.json +11 -0
  126. data/data/matrix-spec/event-schemas/examples/core/state_event.json +4 -0
  127. data/data/matrix-spec/event-schemas/examples/invite_room_state.json +18 -0
  128. data/data/matrix-spec/event-schemas/examples/knock_room_state.json +18 -0
  129. data/data/matrix-spec/event-schemas/examples/m.accepted_terms.yaml +10 -0
  130. data/data/matrix-spec/event-schemas/examples/m.call.answer.yaml +21 -0
  131. data/data/matrix-spec/event-schemas/examples/m.call.candidates.yaml +16 -0
  132. data/data/matrix-spec/event-schemas/examples/m.call.hangup.yaml +10 -0
  133. data/data/matrix-spec/event-schemas/examples/m.call.invite.yaml +22 -0
  134. data/data/matrix-spec/event-schemas/examples/m.call.negotiate.yaml +22 -0
  135. data/data/matrix-spec/event-schemas/examples/m.call.reject.yaml +9 -0
  136. data/data/matrix-spec/event-schemas/examples/m.call.sdp_stream_metadata_changed.yaml +16 -0
  137. data/data/matrix-spec/event-schemas/examples/m.call.select_answer.yaml +10 -0
  138. data/data/matrix-spec/event-schemas/examples/m.direct.yaml +10 -0
  139. data/data/matrix-spec/event-schemas/examples/m.dummy.yaml +4 -0
  140. data/data/matrix-spec/event-schemas/examples/m.forwarded_room_key.yaml +14 -0
  141. data/data/matrix-spec/event-schemas/examples/m.fully_read.yaml +7 -0
  142. data/data/matrix-spec/event-schemas/examples/m.identity_server.yaml +7 -0
  143. data/data/matrix-spec/event-schemas/examples/m.ignored_user_list.yaml +9 -0
  144. data/data/matrix-spec/event-schemas/examples/m.invite_permission_config.yaml +7 -0
  145. data/data/matrix-spec/event-schemas/examples/m.key.verification.accept.yaml +12 -0
  146. data/data/matrix-spec/event-schemas/examples/m.key.verification.cancel.yaml +8 -0
  147. data/data/matrix-spec/event-schemas/examples/m.key.verification.done.yaml +6 -0
  148. data/data/matrix-spec/event-schemas/examples/m.key.verification.key.yaml +7 -0
  149. data/data/matrix-spec/event-schemas/examples/m.key.verification.mac.yaml +10 -0
  150. data/data/matrix-spec/event-schemas/examples/m.key.verification.ready.yaml +10 -0
  151. data/data/matrix-spec/event-schemas/examples/m.key.verification.request.yaml +11 -0
  152. data/data/matrix-spec/event-schemas/examples/m.key.verification.start$m.sas.v1.yaml +12 -0
  153. data/data/matrix-spec/event-schemas/examples/m.key.verification.start.yaml +8 -0
  154. data/data/matrix-spec/event-schemas/examples/m.key_backup.yaml +7 -0
  155. data/data/matrix-spec/event-schemas/examples/m.marked_unread.yaml +7 -0
  156. data/data/matrix-spec/event-schemas/examples/m.policy.rule.room.yaml +10 -0
  157. data/data/matrix-spec/event-schemas/examples/m.policy.rule.server.yaml +10 -0
  158. data/data/matrix-spec/event-schemas/examples/m.policy.rule.user.yaml +10 -0
  159. data/data/matrix-spec/event-schemas/examples/m.presence.yaml +12 -0
  160. data/data/matrix-spec/event-schemas/examples/m.push_rules.yaml +177 -0
  161. data/data/matrix-spec/event-schemas/examples/m.reaction.yaml +11 -0
  162. data/data/matrix-spec/event-schemas/examples/m.receipt.yaml +18 -0
  163. data/data/matrix-spec/event-schemas/examples/m.recent_emoji.yaml +16 -0
  164. data/data/matrix-spec/event-schemas/examples/m.room.avatar.yaml +14 -0
  165. data/data/matrix-spec/event-schemas/examples/m.room.canonical_alias.yaml +12 -0
  166. data/data/matrix-spec/event-schemas/examples/m.room.create.yaml +13 -0
  167. data/data/matrix-spec/event-schemas/examples/m.room.encrypted$megolm.yaml +11 -0
  168. data/data/matrix-spec/event-schemas/examples/m.room.encrypted$olm.yaml +14 -0
  169. data/data/matrix-spec/event-schemas/examples/m.room.encryption.yaml +10 -0
  170. data/data/matrix-spec/event-schemas/examples/m.room.guest_access.yaml +8 -0
  171. data/data/matrix-spec/event-schemas/examples/m.room.history_visibility.yaml +8 -0
  172. data/data/matrix-spec/event-schemas/examples/m.room.join_rules$restricted.yaml +18 -0
  173. data/data/matrix-spec/event-schemas/examples/m.room.join_rules.yaml +8 -0
  174. data/data/matrix-spec/event-schemas/examples/m.room.member$invite_room_state.yaml +15 -0
  175. data/data/matrix-spec/event-schemas/examples/m.room.member$join_authorised_via_users_server.yaml +12 -0
  176. data/data/matrix-spec/event-schemas/examples/m.room.member$knock_room_state.yaml +15 -0
  177. data/data/matrix-spec/event-schemas/examples/m.room.member$third_party_invite.yaml +20 -0
  178. data/data/matrix-spec/event-schemas/examples/m.room.member.yaml +12 -0
  179. data/data/matrix-spec/event-schemas/examples/m.room.message$m.audio.yaml +14 -0
  180. data/data/matrix-spec/event-schemas/examples/m.room.message$m.emote.yaml +10 -0
  181. data/data/matrix-spec/event-schemas/examples/m.room.message$m.file.yaml +14 -0
  182. data/data/matrix-spec/event-schemas/examples/m.room.message$m.image.yaml +16 -0
  183. data/data/matrix-spec/event-schemas/examples/m.room.message$m.key.verification.request.yaml +19 -0
  184. data/data/matrix-spec/event-schemas/examples/m.room.message$m.location.yaml +18 -0
  185. data/data/matrix-spec/event-schemas/examples/m.room.message$m.notice.yaml +10 -0
  186. data/data/matrix-spec/event-schemas/examples/m.room.message$m.server_notice.yaml +11 -0
  187. data/data/matrix-spec/event-schemas/examples/m.room.message$m.text.yaml +10 -0
  188. data/data/matrix-spec/event-schemas/examples/m.room.message$m.video.yaml +23 -0
  189. data/data/matrix-spec/event-schemas/examples/m.room.name.yaml +8 -0
  190. data/data/matrix-spec/event-schemas/examples/m.room.pinned_events.yaml +8 -0
  191. data/data/matrix-spec/event-schemas/examples/m.room.policy.yaml +11 -0
  192. data/data/matrix-spec/event-schemas/examples/m.room.power_levels.yaml +24 -0
  193. data/data/matrix-spec/event-schemas/examples/m.room.redaction.yaml +8 -0
  194. data/data/matrix-spec/event-schemas/examples/m.room.server_acl.yaml +10 -0
  195. data/data/matrix-spec/event-schemas/examples/m.room.third_party_invite.yaml +14 -0
  196. data/data/matrix-spec/event-schemas/examples/m.room.tombstone.yaml +9 -0
  197. data/data/matrix-spec/event-schemas/examples/m.room.topic.yaml +16 -0
  198. data/data/matrix-spec/event-schemas/examples/m.room_key.withheld.yaml +12 -0
  199. data/data/matrix-spec/event-schemas/examples/m.room_key.yaml +10 -0
  200. data/data/matrix-spec/event-schemas/examples/m.room_key_request$cancel_request.yaml +8 -0
  201. data/data/matrix-spec/event-schemas/examples/m.room_key_request$request.yaml +14 -0
  202. data/data/matrix-spec/event-schemas/examples/m.secret.request.yaml +9 -0
  203. data/data/matrix-spec/event-schemas/examples/m.secret.send.yaml +7 -0
  204. data/data/matrix-spec/event-schemas/examples/m.space.child.yaml +10 -0
  205. data/data/matrix-spec/event-schemas/examples/m.space.parent.yaml +9 -0
  206. data/data/matrix-spec/event-schemas/examples/m.sticker.yaml +22 -0
  207. data/data/matrix-spec/event-schemas/examples/m.tag.yaml +9 -0
  208. data/data/matrix-spec/event-schemas/examples/m.typing.yaml +7 -0
  209. data/data/matrix-spec/event-schemas/moderation_policy_rule.yaml +32 -0
  210. data/data/matrix-spec/event-schemas/schema/components/m_text_content_block.yaml +28 -0
  211. data/data/matrix-spec/event-schemas/schema/components/sdp_stream_metadata.yaml +43 -0
  212. data/data/matrix-spec/event-schemas/schema/components/signed_third_party_invite.yaml +48 -0
  213. data/data/matrix-spec/event-schemas/schema/core-event-schema/call_event.yaml +27 -0
  214. data/data/matrix-spec/event-schemas/schema/core-event-schema/event.yaml +16 -0
  215. data/data/matrix-spec/event-schemas/schema/core-event-schema/msgtype_infos/avatar_info.yaml +30 -0
  216. data/data/matrix-spec/event-schemas/schema/core-event-schema/msgtype_infos/image_info.yaml +52 -0
  217. data/data/matrix-spec/event-schemas/schema/core-event-schema/msgtype_infos/thumbnail_info.yaml +22 -0
  218. data/data/matrix-spec/event-schemas/schema/core-event-schema/room_event.yaml +17 -0
  219. data/data/matrix-spec/event-schemas/schema/core-event-schema/state_event.yaml +8 -0
  220. data/data/matrix-spec/event-schemas/schema/core-event-schema/stripped_state.yaml +48 -0
  221. data/data/matrix-spec/event-schemas/schema/core-event-schema/sync_room_event.yaml +49 -0
  222. data/data/matrix-spec/event-schemas/schema/core-event-schema/sync_state_event.yaml +36 -0
  223. data/data/matrix-spec/event-schemas/schema/core-event-schema/unsigned_prop.yaml +23 -0
  224. data/data/matrix-spec/event-schemas/schema/m.accepted_terms.yaml +25 -0
  225. data/data/matrix-spec/event-schemas/schema/m.call.answer.yaml +44 -0
  226. data/data/matrix-spec/event-schemas/schema/m.call.candidates.yaml +52 -0
  227. data/data/matrix-spec/event-schemas/schema/m.call.hangup.yaml +57 -0
  228. data/data/matrix-spec/event-schemas/schema/m.call.invite.yaml +53 -0
  229. data/data/matrix-spec/event-schemas/schema/m.call.negotiate.yaml +78 -0
  230. data/data/matrix-spec/event-schemas/schema/m.call.reject.yaml +29 -0
  231. data/data/matrix-spec/event-schemas/schema/m.call.sdp_stream_metadata_changed.yaml +24 -0
  232. data/data/matrix-spec/event-schemas/schema/m.call.select_answer.yaml +29 -0
  233. data/data/matrix-spec/event-schemas/schema/m.direct.yaml +29 -0
  234. data/data/matrix-spec/event-schemas/schema/m.dummy.yaml +25 -0
  235. data/data/matrix-spec/event-schemas/schema/m.forwarded_room_key.yaml +70 -0
  236. data/data/matrix-spec/event-schemas/schema/m.fully_read.yaml +26 -0
  237. data/data/matrix-spec/event-schemas/schema/m.identity_server.yaml +28 -0
  238. data/data/matrix-spec/event-schemas/schema/m.ignored_user_list.yaml +30 -0
  239. data/data/matrix-spec/event-schemas/schema/m.invite_permission_config.yaml +21 -0
  240. data/data/matrix-spec/event-schemas/schema/m.key.verification.accept.yaml +63 -0
  241. data/data/matrix-spec/event-schemas/schema/m.key.verification.cancel.yaml +72 -0
  242. data/data/matrix-spec/event-schemas/schema/m.key.verification.done.yaml +24 -0
  243. data/data/matrix-spec/event-schemas/schema/m.key.verification.key.yaml +31 -0
  244. data/data/matrix-spec/event-schemas/schema/m.key.verification.m.relates_to.yaml +23 -0
  245. data/data/matrix-spec/event-schemas/schema/m.key.verification.mac.yaml +43 -0
  246. data/data/matrix-spec/event-schemas/schema/m.key.verification.ready.yaml +41 -0
  247. data/data/matrix-spec/event-schemas/schema/m.key.verification.request.yaml +47 -0
  248. data/data/matrix-spec/event-schemas/schema/m.key.verification.start$m.reciprocate.v1.yaml +45 -0
  249. data/data/matrix-spec/event-schemas/schema/m.key.verification.start$m.sas.v1.yaml +76 -0
  250. data/data/matrix-spec/event-schemas/schema/m.key.verification.start.yaml +46 -0
  251. data/data/matrix-spec/event-schemas/schema/m.key_backup.yaml +24 -0
  252. data/data/matrix-spec/event-schemas/schema/m.marked_unread.yaml +26 -0
  253. data/data/matrix-spec/event-schemas/schema/m.policy.rule.room.yaml +17 -0
  254. data/data/matrix-spec/event-schemas/schema/m.policy.rule.server.yaml +17 -0
  255. data/data/matrix-spec/event-schemas/schema/m.policy.rule.user.yaml +17 -0
  256. data/data/matrix-spec/event-schemas/schema/m.presence.yaml +50 -0
  257. data/data/matrix-spec/event-schemas/schema/m.push_rules.yaml +23 -0
  258. data/data/matrix-spec/event-schemas/schema/m.reaction.yaml +45 -0
  259. data/data/matrix-spec/event-schemas/schema/m.receipt.yaml +65 -0
  260. data/data/matrix-spec/event-schemas/schema/m.recent_emoji.yaml +29 -0
  261. data/data/matrix-spec/event-schemas/schema/m.room.avatar.yaml +29 -0
  262. data/data/matrix-spec/event-schemas/schema/m.room.canonical_alias.yaml +40 -0
  263. data/data/matrix-spec/event-schemas/schema/m.room.create.yaml +86 -0
  264. data/data/matrix-spec/event-schemas/schema/m.room.encrypted.yaml +91 -0
  265. data/data/matrix-spec/event-schemas/schema/m.room.encryption.yaml +38 -0
  266. data/data/matrix-spec/event-schemas/schema/m.room.guest_access.yaml +28 -0
  267. data/data/matrix-spec/event-schemas/schema/m.room.history_visibility.yaml +30 -0
  268. data/data/matrix-spec/event-schemas/schema/m.room.join_rules.yaml +78 -0
  269. data/data/matrix-spec/event-schemas/schema/m.room.member.yaml +174 -0
  270. data/data/matrix-spec/event-schemas/schema/m.room.message$m.audio.yaml +73 -0
  271. data/data/matrix-spec/event-schemas/schema/m.room.message$m.emote.yaml +36 -0
  272. data/data/matrix-spec/event-schemas/schema/m.room.message$m.file.yaml +85 -0
  273. data/data/matrix-spec/event-schemas/schema/m.room.message$m.image.yaml +63 -0
  274. data/data/matrix-spec/event-schemas/schema/m.room.message$m.key.verification.request.yaml +70 -0
  275. data/data/matrix-spec/event-schemas/schema/m.room.message$m.location.yaml +50 -0
  276. data/data/matrix-spec/event-schemas/schema/m.room.message$m.notice.yaml +36 -0
  277. data/data/matrix-spec/event-schemas/schema/m.room.message$m.server_notice.yaml +41 -0
  278. data/data/matrix-spec/event-schemas/schema/m.room.message$m.text.yaml +36 -0
  279. data/data/matrix-spec/event-schemas/schema/m.room.message$m.video.yaml +95 -0
  280. data/data/matrix-spec/event-schemas/schema/m.room.message.yaml +25 -0
  281. data/data/matrix-spec/event-schemas/schema/m.room.name.yaml +35 -0
  282. data/data/matrix-spec/event-schemas/schema/m.room.pinned_events.yaml +27 -0
  283. data/data/matrix-spec/event-schemas/schema/m.room.policy.yaml +41 -0
  284. data/data/matrix-spec/event-schemas/schema/m.room.power_levels.yaml +139 -0
  285. data/data/matrix-spec/event-schemas/schema/m.room.redaction.yaml +29 -0
  286. data/data/matrix-spec/event-schemas/schema/m.room.server_acl.yaml +88 -0
  287. data/data/matrix-spec/event-schemas/schema/m.room.third_party_invite.yaml +79 -0
  288. data/data/matrix-spec/event-schemas/schema/m.room.tombstone.yaml +29 -0
  289. data/data/matrix-spec/event-schemas/schema/m.room.topic.yaml +53 -0
  290. data/data/matrix-spec/event-schemas/schema/m.room_key.withheld.yaml +88 -0
  291. data/data/matrix-spec/event-schemas/schema/m.room_key.yaml +38 -0
  292. data/data/matrix-spec/event-schemas/schema/m.room_key_request.yaml +73 -0
  293. data/data/matrix-spec/event-schemas/schema/m.secret.request.yaml +42 -0
  294. data/data/matrix-spec/event-schemas/schema/m.secret.send.yaml +35 -0
  295. data/data/matrix-spec/event-schemas/schema/m.space.child.yaml +50 -0
  296. data/data/matrix-spec/event-schemas/schema/m.space.parent.yaml +36 -0
  297. data/data/matrix-spec/event-schemas/schema/m.sticker.yaml +36 -0
  298. data/data/matrix-spec/event-schemas/schema/m.tag.yaml +28 -0
  299. data/data/matrix-spec/event-schemas/schema/m.typing.yaml +29 -0
  300. data/lib/async/matrix/3.3/async_matrix_e2ee.so +0 -0
  301. data/lib/async/matrix/3.4/async_matrix_e2ee.so +0 -0
  302. data/lib/async/matrix/4.0/async_matrix_e2ee.so +0 -0
  303. data/lib/async/matrix/api/chain.rb +604 -0
  304. data/lib/async/matrix/api/concat.rb +107 -0
  305. data/lib/async/matrix/api/path_tree.rb +232 -0
  306. data/lib/async/matrix/api.rb +205 -0
  307. data/lib/async/matrix/auth_error.rb +20 -0
  308. data/lib/async/matrix/bad_json_error.rb +20 -0
  309. data/lib/async/matrix/client.rb +966 -0
  310. data/lib/async/matrix/config/vivify.rb +107 -0
  311. data/lib/async/matrix/config.rb +184 -0
  312. data/lib/async/matrix/connection.rb +19 -0
  313. data/lib/async/matrix/content.rb +106 -0
  314. data/lib/async/matrix/double_puppet_client.rb +82 -0
  315. data/lib/async/matrix/e2ee.rb +129 -0
  316. data/lib/async/matrix/endpoint.rb +57 -0
  317. data/lib/async/matrix/error.rb +40 -0
  318. data/lib/async/matrix/error_response.rb +37 -0
  319. data/lib/async/matrix/event.rb +197 -0
  320. data/lib/async/matrix/homeserver_error.rb +20 -0
  321. data/lib/async/matrix/invalid_endpoint_error.rb +20 -0
  322. data/lib/async/matrix/media_client.rb +181 -0
  323. data/lib/async/matrix/not_found_error.rb +20 -0
  324. data/lib/async/matrix/notifier.rb +108 -0
  325. data/lib/async/matrix/response_too_large_error.rb +20 -0
  326. data/lib/async/matrix/schema/registry.rb +381 -0
  327. data/lib/async/matrix/schema/validation_error.rb +232 -0
  328. data/lib/async/matrix/schema.rb +170 -0
  329. data/lib/async/matrix/server.rb +18 -0
  330. data/lib/async/matrix/stream.rb +18 -0
  331. data/lib/async/matrix/version.rb +10 -0
  332. data/lib/async/matrix.rb +15 -0
  333. metadata +494 -0
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Released under the Apache License, Version 2.0.
4
+ # Copyright, 2026, by General Intelligence Systems.
5
+
6
+ module Async
7
+ module Matrix
8
+ module Api
9
+ # StringBuilder concat handler that renders a method chain into URL path segments.
10
+ #
11
+ # Convention:
12
+ # - Bare methods become path segments: .account.whoami -> ["account", "whoami"]
13
+ # - Methods with args inject the arg as a path segment after the method name:
14
+ # .rooms("!abc:ex.com") -> ["rooms", "!abc:ex.com"]
15
+ # - .call("literal") injects a raw path segment:
16
+ # .("m.room.message") -> ["m.room.message"]
17
+ #
18
+ # The handler returns an array of raw (unencoded) segments.
19
+ # URL-encoding is applied later when constructing the final URL.
20
+ #
21
+ class Concat
22
+ def self.call(buffer)
23
+ new(buffer).segments
24
+ end
25
+
26
+ def initialize(buffer)
27
+ if buffer.respond_to?(:to_a)
28
+ @buffer = buffer.to_a
29
+ else
30
+ @buffer = buffer
31
+ end
32
+ end
33
+
34
+ def segments
35
+ [].tap do |result|
36
+ @buffer.each do |entry|
37
+ case entry
38
+ when Symbol
39
+ # :slash, :dash -- ignore in URL context
40
+ next
41
+ when Array
42
+ name, args = entry
43
+ unless name.is_a?(String)
44
+ next
45
+ end
46
+
47
+ if args.nil? || args.empty?
48
+ # Bare method -> path segment
49
+ result << name
50
+ else
51
+ # Method with args -> method name as segment, then each arg as segment
52
+ result << name
53
+ args.each do |arg|
54
+ if arg.is_a?(Hash)
55
+ next
56
+ end # kwargs are not path segments
57
+ result << arg.to_s
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ __END__
70
+ require "string_builder"
71
+
72
+ describe "Async::Matrix::Api::Concat" do
73
+ it "converts bare methods to path segments" do
74
+ sb = StringBuilder.new
75
+ sb.account.whoami
76
+ segments = Async::Matrix::Api::Concat.call(sb)
77
+ segments.should == %w[account whoami]
78
+ end
79
+
80
+ it "converts methods with args to segment + arg" do
81
+ sb = StringBuilder.new
82
+ sb.rooms("!abc:ex.com").ban
83
+ segments = Async::Matrix::Api::Concat.call(sb)
84
+ segments.should == %w[rooms !abc:ex.com ban]
85
+ end
86
+
87
+ it "handles methods with multiple args" do
88
+ sb = StringBuilder.new
89
+ sb.rooms("!abc:ex.com").state("m.room.name", "some_key")
90
+ segments = Async::Matrix::Api::Concat.call(sb)
91
+ segments.should == %w[rooms !abc:ex.com state m.room.name some_key]
92
+ end
93
+
94
+ it "handles deep paths" do
95
+ sb = StringBuilder.new
96
+ sb.rooms("!abc:ex.com").state("m.room.name", "")
97
+ segments = Async::Matrix::Api::Concat.call(sb)
98
+ segments.should == ["rooms", "!abc:ex.com", "state", "m.room.name", ""]
99
+ end
100
+
101
+ it "ignores kwargs in segments" do
102
+ sb = StringBuilder.new
103
+ sb.account.whoami
104
+ segments = Async::Matrix::Api::Concat.call(sb)
105
+ segments.should == %w[account whoami]
106
+ end
107
+ end
@@ -0,0 +1,232 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Released under the Apache License, Version 2.0.
4
+ # Copyright, 2026, by General Intelligence Systems.
5
+
6
+ require "yaml"
7
+ require "pathname"
8
+
9
+ module Async
10
+ module Matrix
11
+ module Api
12
+ # A trie of valid Matrix API paths, built from OpenAPI 3.1.0 YAML schemas.
13
+ #
14
+ # Each leaf node stores the set of HTTP methods valid at that path.
15
+ # Template segments like {roomId} become wildcard nodes that match any value.
16
+ #
17
+ # Example:
18
+ # tree = PathTree.load
19
+ # tree.match(["_matrix", "client", "v3", "rooms", "!abc:ex.com", "ban"], "POST")
20
+ # # => { valid: true, operation_id: "ban", methods: ["post"] }
21
+ #
22
+ class PathTree
23
+ SCHEMA_DIR = Pathname.new(File.expand_path("../../../../data/matrix-spec/api/client-server", __dir__))
24
+
25
+ Node = Struct.new(
26
+ :children,
27
+ :wildcard,
28
+ :methods,
29
+ :operation_ids,
30
+ keyword_init: true,
31
+ ) do
32
+ def initialize(**)
33
+ super
34
+ self.children ||= {}
35
+ self.methods ||= []
36
+ self.operation_ids ||= {}
37
+ end
38
+ end
39
+
40
+ attr_reader :root
41
+
42
+ def initialize
43
+ @root = Node.new
44
+ end
45
+
46
+ # Load all OpenAPI schemas from data/ and build the tree.
47
+ def self.load(schema_dir: SCHEMA_DIR)
48
+ new.tap do |tree|
49
+ Pathname.glob(schema_dir / "*.yaml").each do |path|
50
+ tree.load_schema(path)
51
+ end
52
+ end
53
+ end
54
+
55
+ # Parse a single OpenAPI YAML file and insert its paths into the tree.
56
+ def load_schema(path)
57
+ doc = YAML.safe_load(File.read(path), permitted_classes: [Symbol], aliases: true)
58
+ if doc.is_a?(Hash)
59
+ base_path = extract_base_path(doc)
60
+ paths = doc["paths"]
61
+ if paths.is_a?(Hash)
62
+ paths.each do |path_template, methods_hash|
63
+ unless methods_hash.is_a?(Hash)
64
+ next
65
+ end
66
+
67
+ # Build full path: basePath + path_template
68
+ full_path = "#{base_path}#{path_template.strip}"
69
+ segments = full_path.split("/").reject(&:empty?)
70
+
71
+ methods_hash.each do |method, operation|
72
+ unless %w[get post put delete patch head].include?(method)
73
+ next
74
+ end
75
+ if operation.is_a?(Hash)
76
+ operation_id = operation["operationId"]
77
+ else
78
+ operation_id = nil
79
+ end
80
+ insert(segments, method, operation_id)
81
+ end
82
+ end
83
+ else
84
+ nil
85
+ end
86
+ else
87
+ nil
88
+ end
89
+ end
90
+
91
+ # Insert a path (as array of segments) with an HTTP method into the trie.
92
+ def insert(segments, method, operation_id = nil)
93
+ node = @root
94
+ segments.each do |segment|
95
+ if segment.start_with?("{") && segment.end_with?("}")
96
+ # Wildcard segment — matches any value
97
+ node.wildcard ||= Node.new
98
+ node = node.wildcard
99
+ else
100
+ node.children[segment] ||= Node.new
101
+ node = node.children[segment]
102
+ end
103
+ end
104
+ unless node.methods.include?(method.downcase)
105
+ node.methods << method.downcase
106
+ end
107
+ if operation_id
108
+ node.operation_ids[method.downcase] = operation_id
109
+ end
110
+ end
111
+
112
+ # Match a concrete path (array of segments) against the trie.
113
+ # Returns a result hash.
114
+ def match(segments, method = nil)
115
+ node = segments.inject(@root) do |current, segment|
116
+ if current.nil?
117
+ nil
118
+ elsif current.children.key?(segment)
119
+ current.children[segment]
120
+ elsif current.wildcard
121
+ current.wildcard
122
+ end
123
+ end
124
+
125
+ if node.nil?
126
+ {valid: false, methods: [], operation_id: nil}
127
+ elsif method
128
+ method_down = method.downcase
129
+ valid = node.methods.include?(method_down)
130
+ {valid: valid, methods: node.methods, operation_id: node.operation_ids[method_down]}
131
+ else
132
+ {valid: node.methods.any?, methods: node.methods, operation_id: nil}
133
+ end
134
+ end
135
+
136
+ private
137
+
138
+ def extract_base_path(doc)
139
+ servers = doc["servers"]
140
+ if servers.is_a?(Array) && servers.first.is_a?(Hash)
141
+ server = servers.first
142
+ variables = server["variables"] || {}
143
+ base_path_var = variables["basePath"]
144
+ if base_path_var.is_a?(Hash)
145
+ base_path_var["default"] || ""
146
+ else
147
+ ""
148
+ end
149
+ else
150
+ ""
151
+ end
152
+ end
153
+ end
154
+ end
155
+ end
156
+ end
157
+
158
+ __END__
159
+ describe "Async::Matrix::Api::PathTree" do
160
+ def make_tree
161
+ tree = Async::Matrix::Api::PathTree.new
162
+ # Simulate a few endpoints manually
163
+ tree.insert(%w[_matrix client v3 account whoami], "get", "getAccountWhoami")
164
+ tree.insert(%w[_matrix client v3 createRoom], "post", "createRoom")
165
+ tree.insert(%w[_matrix client v3 rooms {roomId} ban], "post", "ban")
166
+ tree.insert(%w[_matrix client v3 rooms {roomId} unban], "post", "unban")
167
+ tree.insert(%w[_matrix client v3 rooms {roomId} state {eventType} {stateKey}], "get", "getRoomStateWithKey")
168
+ tree.insert(%w[_matrix client v3 rooms {roomId} state {eventType} {stateKey}], "put", "setRoomStateWithKey")
169
+ tree.insert(%w[_matrix client v3 rooms {roomId} messages], "get", "getRoomMessages")
170
+ tree.insert(%w[_matrix client v3 profile {userId} displayname], "get", "getDisplayName")
171
+ tree.insert(%w[_matrix client v3 profile {userId} displayname], "put", "setDisplayName")
172
+ tree
173
+ end
174
+
175
+ it "matches a simple path" do
176
+ tree = make_tree
177
+ result = tree.match(%w[_matrix client v3 account whoami], "GET")
178
+ result[:valid].should == true
179
+ result[:operation_id].should == "getAccountWhoami"
180
+ end
181
+
182
+ it "rejects unknown paths" do
183
+ tree = make_tree
184
+ result = tree.match(%w[_matrix client v3 account foobar], "GET")
185
+ result[:valid].should == false
186
+ end
187
+
188
+ it "matches wildcard segments" do
189
+ tree = make_tree
190
+ result = tree.match(%w[_matrix client v3 rooms !abc:ex.com ban], "POST")
191
+ result[:valid].should == true
192
+ result[:operation_id].should == "ban"
193
+ end
194
+
195
+ it "matches deep wildcard paths" do
196
+ tree = make_tree
197
+ result = tree.match(%w[_matrix client v3 rooms !abc:ex.com state m.room.name some_key], "GET")
198
+ result[:valid].should == true
199
+ result[:operation_id].should == "getRoomStateWithKey"
200
+ end
201
+
202
+ it "rejects wrong HTTP method" do
203
+ tree = make_tree
204
+ result = tree.match(%w[_matrix client v3 account whoami], "POST")
205
+ result[:valid].should == false
206
+ end
207
+
208
+ it "reports available methods" do
209
+ tree = make_tree
210
+ result = tree.match(%w[_matrix client v3 profile @user:ex.com displayname])
211
+ result[:valid].should == true
212
+ result[:methods].should.include "get"
213
+ result[:methods].should.include "put"
214
+ end
215
+
216
+ it "loads from real schema files" do
217
+ skip "schemas not present" unless Async::Matrix::Api::PathTree::SCHEMA_DIR.exist?
218
+ tree = Async::Matrix::Api::PathTree.load
219
+ # createRoom should exist
220
+ result = tree.match(%w[_matrix client v3 createRoom], "POST")
221
+ result[:valid].should == true
222
+ # rooms/{id}/ban should exist
223
+ result = tree.match(%w[_matrix client v3 rooms !test:ex.com ban], "POST")
224
+ result[:valid].should == true
225
+ # sync should exist
226
+ result = tree.match(%w[_matrix client v3 sync], "GET")
227
+ result[:valid].should == true
228
+ # nonsense should not
229
+ result = tree.match(%w[_matrix client v3 totallyFake], "GET")
230
+ result[:valid].should == false
231
+ end
232
+ end
@@ -0,0 +1,205 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Released under the Apache License, Version 2.0.
4
+ # Copyright, 2026, by General Intelligence Systems.
5
+
6
+ module Async
7
+ module Matrix
8
+ # Runtime-generated Matrix Client-Server API built from official OpenAPI schemas.
9
+ #
10
+ # Loads the OpenAPI 3.1.0 YAML files from data/matrix-spec/api/client-server/
11
+ # at require-time and builds a PathTree trie of all valid endpoints. API calls
12
+ # are constructed via StringBuilder method chains, validated against the tree,
13
+ # and terminated by .get(), .post(), .put(), or .delete().
14
+ #
15
+ # Usage:
16
+ # # Via Client:
17
+ # client.api.account.whoami.get
18
+ # client.api.createRoom.post(name: "Pub", preset: "public_chat")
19
+ # client.api.rooms("!room:ex.com").ban.post(user_id: "@bad:ex.com")
20
+ # client.api.rooms("!room:ex.com").messages.get(dir: "b", limit: 10)
21
+ #
22
+ # # Standalone (for inspection):
23
+ # gateway = Async::Matrix::Api::Gateway.new(client)
24
+ # chain = gateway.chain
25
+ # chain.rooms("!room:ex.com").state("m.room.name", "").get
26
+ #
27
+ module Api
28
+ # The shared PathTree instance, loaded once from the bundled schemas.
29
+ def self.path_tree
30
+ @path_tree ||= PathTree.load
31
+ end
32
+
33
+ # Reset the cached path tree (useful for testing or reloading schemas).
34
+ def self.reset!
35
+ @path_tree = nil
36
+ end
37
+
38
+ # Gateway produces Chain instances bound to a specific Client.
39
+ # Each call to a method on the Gateway starts a new chain.
40
+ class Gateway
41
+ def initialize(client, prefix: %w[_matrix client v3])
42
+ @client = client
43
+ @prefix = prefix
44
+ end
45
+
46
+ # Start a fresh chain. Every method call on the gateway creates
47
+ # a new chain so chains are never reused.
48
+ def chain
49
+ Chain.new(client: @client, path_tree: Api.path_tree, prefix: @prefix)
50
+ end
51
+
52
+ # Forward all unknown methods to a fresh chain, starting the path.
53
+ def method_missing(name, *args, **kwargs, &block)
54
+ if name.start_with?("to_")
55
+ super
56
+ else
57
+ chain.__send__(
58
+ name,
59
+ *args,
60
+ **kwargs,
61
+ &block
62
+ )
63
+ end
64
+ end
65
+
66
+ def respond_to_missing?(name, include_private = false)
67
+ !name.start_with?("to_") || super
68
+ end
69
+
70
+ def inspect
71
+ "#<#{self.class} prefix=/#{@prefix.join("/")}>"
72
+ end
73
+ end
74
+ end
75
+
76
+ end
77
+ end
78
+
79
+ __END__
80
+ describe "Async::Matrix::Api::Gateway" do
81
+ # Stub client that records calls instead of making HTTP requests.
82
+ StubClient = Struct.new(:calls) do
83
+ def initialize
84
+ super([])
85
+ end
86
+
87
+ def get(path, max_retries: nil)
88
+ calls << [:get, path, {max_retries: max_retries}]
89
+ {"stub" => true}
90
+ end
91
+
92
+ def post(path, body = {}, max_retries: nil)
93
+ calls << [:post, path, body, {max_retries: max_retries}]
94
+ {"stub" => true}
95
+ end
96
+
97
+ def put(path, body = {}, max_retries: nil)
98
+ calls << [:put, path, body, {max_retries: max_retries}]
99
+ {"stub" => true}
100
+ end
101
+
102
+ def request(method, path, body = nil, max_retries: nil)
103
+ calls << [method.downcase.to_sym, path, body, {max_retries: max_retries}]
104
+ {"stub" => true}
105
+ end
106
+ end
107
+
108
+ def make_gateway
109
+ client = StubClient.new
110
+ # Build a small tree manually for deterministic tests
111
+ tree = Async::Matrix::Api::PathTree.new
112
+ tree.insert(%w[_matrix client v3 account whoami], "get")
113
+ tree.insert(%w[_matrix client v3 createRoom], "post")
114
+ tree.insert(%w[_matrix client v3 rooms {roomId} ban], "post")
115
+ tree.insert(%w[_matrix client v3 rooms {roomId} messages], "get")
116
+ tree.insert(%w[_matrix client v3 rooms {roomId} send {eventType} {txnId}], "put")
117
+ tree.insert(%w[_matrix client v3 profile {userId} displayname], "put")
118
+ tree.insert(%w[_matrix client v3 join {roomIdOrAlias}], "post")
119
+ tree.insert(%w[_matrix client v3 rooms {roomId} leave], "post")
120
+
121
+ # Inject our test tree
122
+ Async::Matrix::Api.instance_variable_set(:@path_tree, tree)
123
+
124
+ gateway = Async::Matrix::Api::Gateway.new(client)
125
+ [gateway, client]
126
+ end
127
+
128
+ it "GET /account/whoami" do
129
+ gw, client = make_gateway
130
+ gw.account.whoami.get
131
+ client.calls.last[0].should == :get
132
+ client.calls.last[1].should == "/_matrix/client/v3/account/whoami"
133
+ end
134
+
135
+ it "POST /createRoom with body" do
136
+ gw, client = make_gateway
137
+ gw.createRoom.post(name: "Pub", preset: "public_chat")
138
+ client.calls.last[0].should == :post
139
+ client.calls.last[1].should == "/_matrix/client/v3/createRoom"
140
+ client.calls.last[2].should == {name: "Pub", preset: "public_chat"}
141
+ end
142
+
143
+ it "POST /rooms/{roomId}/ban with body" do
144
+ gw, client = make_gateway
145
+ gw.rooms("!abc:ex.com").ban.post(user_id: "@bad:ex.com", reason: "spam")
146
+ client.calls.last[0].should == :post
147
+ client.calls.last[1].should == "/_matrix/client/v3/rooms/%21abc%3Aex.com/ban"
148
+ client.calls.last[2].should == {user_id: "@bad:ex.com", reason: "spam"}
149
+ end
150
+
151
+ it "GET /rooms/{roomId}/messages with query params" do
152
+ gw, client = make_gateway
153
+ gw.rooms("!abc:ex.com").messages.get(dir: "b", limit: 10)
154
+ call = client.calls.last
155
+ call[0].should == :get
156
+ call[1].should.include "/_matrix/client/v3/rooms/%21abc%3Aex.com/messages?"
157
+ call[1].should.include "dir=b"
158
+ call[1].should.include "limit=10"
159
+ end
160
+
161
+ it "PUT /rooms/{roomId}/send/{eventType}/{txnId}" do
162
+ gw, client = make_gateway
163
+ gw.rooms("!abc:ex.com").send("m.room.message", "txn-1").put(msgtype: "m.text", body: "hi")
164
+ call = client.calls.last
165
+ call[0].should == :put
166
+ call[1].should == "/_matrix/client/v3/rooms/%21abc%3Aex.com/send/m.room.message/txn-1"
167
+ call[2].should == {msgtype: "m.text", body: "hi"}
168
+ end
169
+
170
+ it "PUT /profile/{userId}/displayname" do
171
+ gw, client = make_gateway
172
+ gw.profile("@user:ex.com").displayname.put(displayname: "Bob")
173
+ call = client.calls.last
174
+ call[0].should == :put
175
+ call[1].should == "/_matrix/client/v3/profile/%40user%3Aex.com/displayname"
176
+ call[2].should == {displayname: "Bob"}
177
+ end
178
+
179
+ it "POST /join/{roomIdOrAlias}" do
180
+ gw, client = make_gateway
181
+ gw.join("!abc:ex.com").post
182
+ call = client.calls.last
183
+ call[0].should == :post
184
+ call[1].should == "/_matrix/client/v3/join/%21abc%3Aex.com"
185
+ end
186
+
187
+ it "raises InvalidEndpointError for unknown path" do
188
+ gw, _ = make_gateway
189
+ lambda { gw.totally.bogus.endpoint.get }.should.raise Async::Matrix::InvalidEndpointError
190
+ end
191
+
192
+ it "raises InvalidEndpointError for wrong method" do
193
+ gw, _ = make_gateway
194
+ lambda { gw.account.whoami.post }.should.raise Async::Matrix::InvalidEndpointError
195
+ end
196
+
197
+ it "each gateway method call starts a fresh chain" do
198
+ gw, client = make_gateway
199
+ gw.account.whoami.get
200
+ gw.createRoom.post(name: "test")
201
+ client.calls.length.should == 2
202
+ client.calls[0][1].should == "/_matrix/client/v3/account/whoami"
203
+ client.calls[1][1].should == "/_matrix/client/v3/createRoom"
204
+ end
205
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Released under the Apache License, Version 2.0.
4
+ # Copyright, 2026, by General Intelligence Systems.
5
+
6
+ # Async::Matrix::Error is this class's superclass, so it has to exist before
7
+ # this file finishes loading — the glob in async/matrix.rb sorts
8
+ # alphabetically and would otherwise get here first.
9
+ require_relative "error"
10
+
11
+ module Async
12
+ module Matrix
13
+ class AuthError < Error; end
14
+ end
15
+ end
16
+
17
+ __END__
18
+ it "AuthError inherits from Error" do
19
+ Async::Matrix::AuthError.new("M_FORBIDDEN", "denied").should.be.kind_of Async::Matrix::Error
20
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Released under the Apache License, Version 2.0.
4
+ # Copyright, 2026, by General Intelligence Systems.
5
+
6
+ # Async::Matrix::Error is this class's superclass, so it has to exist before
7
+ # this file finishes loading — the glob in async/matrix.rb sorts
8
+ # alphabetically and would otherwise get here first.
9
+ require_relative "error"
10
+
11
+ module Async
12
+ module Matrix
13
+ class BadJsonError < Error; end
14
+ end
15
+ end
16
+
17
+ __END__
18
+ it "BadJsonError inherits from Error" do
19
+ Async::Matrix::BadJsonError.new("M_BAD_JSON", "invalid").should.be.kind_of Async::Matrix::Error
20
+ end