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
@@ -4,134 +4,225 @@
4
4
  # Copyright, 2026, by General Intelligence Systems.
5
5
 
6
6
  require "bundler/setup"
7
+ require "forwardable"
8
+ require "json_schemer"
9
+ require "pathname"
7
10
  require "yaml"
8
11
  require "async/matrix"
12
+ require_relative "config/vivify"
9
13
 
10
14
  module Async
11
- module Matrix
12
- module ApplicationService
13
- # Loads and validates an Application Service YAML configuration file.
14
- #
15
- # Expected YAML structure:
16
- #
17
- # homeserver:
18
- # url: "http://synapse:8008"
19
- # domain: "localhost"
20
- # appservice:
21
- # as_token: "..."
22
- # hs_token: "..."
23
- # bot_mxid: "@bot:localhost"
24
- # server:
25
- # bind: "http://0.0.0.0:9292" # optional
26
- #
27
- class Config
28
- attr_reader :homeserver_url, :domain, :as_token, :hs_token, :bot_mxid, :bind
29
-
30
- def initialize(data)
31
- hs = data.fetch("homeserver")
32
- as = data.fetch("appservice")
33
- sv = data.fetch("server", {})
34
-
35
- @homeserver_url = hs.fetch("url").chomp("/")
36
- @domain = hs.fetch("domain")
37
- @as_token = as.fetch("as_token")
38
- @hs_token = as.fetch("hs_token")
39
- @bot_mxid = as.fetch("bot_mxid")
40
- @bind = sv.fetch("bind", "http://0.0.0.0:9292")
41
-
42
- validate!
43
- end
44
-
45
- def self.load(path)
46
- raise Async::Matrix::NotFoundError.new("M_NOT_FOUND", "Config not found: #{path}") unless File.exist?(path)
47
-
48
- data = YAML.safe_load_file(path, permitted_classes: [Symbol])
49
- new(data)
50
- end
51
-
52
- private
53
-
54
- def validate!
55
- raise Async::Matrix::BadJsonError.new("M_BAD_JSON", "homeserver.url is required") if @homeserver_url.empty?
56
- raise Async::Matrix::BadJsonError.new("M_BAD_JSON", "appservice.as_token is required") if @as_token.empty?
57
- raise Async::Matrix::BadJsonError.new("M_BAD_JSON", "appservice.hs_token is required") if @hs_token.empty?
58
- raise Async::Matrix::BadJsonError.new("M_BAD_JSON", "appservice.bot_mxid is required") if @bot_mxid.empty?
59
-
60
- if @as_token.include?("CHANGE_ME") || @hs_token.include?("CHANGE_ME")
61
- raise Async::Matrix::AuthError.new("M_FORBIDDEN", "Replace placeholder tokens in config before starting")
62
- end
63
- end
64
- end
65
- end
66
- end
15
+ module Matrix
16
+ module ApplicationService
17
+ # Loads, validates, and provides dot-notation access to a mautrix
18
+ # bridgev2-compatible YAML configuration file.
19
+ #
20
+ # The full schema mirrors the Go structs defined in
21
+ # mautrix/go v0.27.0 bridgev2/bridgeconfig — split across multiple
22
+ # JSON Schema files under config/schema/ and composed at runtime via $ref.
23
+ #
24
+ # Validated config data is exposed through Vivify-enhanced hashes,
25
+ # giving natural dot-notation access to every nested field:
26
+ #
27
+ # config = Config.load("bridge.yml")
28
+ # config.homeserver.address # => "http://synapse:8008"
29
+ # config.homeserver.domain # => "localhost"
30
+ # config.appservice.as_token # => "secret..."
31
+ # config.appservice.bot.username # => "bot"
32
+ # config.bot_mxid # => "@bot:localhost"
33
+ #
34
+ class Config
35
+ extend Forwardable
36
+
37
+ SCHEMA_DIR = Pathname.new(__dir__).join("config", "schema").freeze
38
+
39
+ # Delegate every top-level config section to the vivified data hash.
40
+ def_delegators :@data,
41
+ :network, :bridge, :database, :homeserver, :appservice,
42
+ :matrix, :analytics, :provisioning, :public_media, :direct_media,
43
+ :backfill, :double_puppet, :encryption, :logging,
44
+ :management_room_texts, :env_config_prefix
45
+
46
+ def initialize(data)
47
+ self.class.validate!(data)
48
+ @data = Vivify.deep_vivify(data)
49
+ end
50
+
51
+ # Load and validate a YAML config file from disk.
52
+ def self.load(path)
53
+ raise Async::Matrix::NotFoundError.new(
54
+ "M_NOT_FOUND", "Config not found: #{path}"
55
+ ) unless File.exist?(path)
56
+
57
+ data = YAML.safe_load_file(path, permitted_classes: [Symbol])
58
+ new(data)
59
+ end
60
+
61
+ # Convenience: derive the bot's full Matrix ID from
62
+ # appservice.bot.username + homeserver.domain.
63
+ def bot_mxid
64
+ "@#{appservice.bot.username}:#{homeserver.domain}"
65
+ end
66
+
67
+ # ------------------------------------------------------------------
68
+ # Schema loading & validation
69
+ # ------------------------------------------------------------------
70
+
71
+ def self.schema
72
+ @schema ||= JSONSchemer.schema(
73
+ SCHEMA_DIR.join("config.json"),
74
+ insert_property_defaults: true
75
+ )
76
+ end
77
+
78
+ def self.validate!(data)
79
+ errors = schema.validate(data).to_a
80
+ return if errors.empty?
81
+
82
+ messages = errors.map { |e| e["error"] }.join("; ")
83
+ raise Async::Matrix::BadJsonError.new(
84
+ "M_BAD_JSON", "Config validation failed: #{messages}"
85
+ )
86
+ end
87
+ end
88
+ end
89
+ end
67
90
  end
68
91
 
69
92
  test do
70
- require "tempfile"
71
-
72
- describe "Async::Matrix::ApplicationService::Config" do
73
- it "parses a valid config hash" do
74
- config = Async::Matrix::ApplicationService::Config.new({
75
- "homeserver" => {"url" => "http://localhost:8008", "domain" => "localhost"},
76
- "appservice" => {"as_token" => "as123", "hs_token" => "hs456", "bot_mxid" => "@bot:localhost"}
77
- })
78
- config.homeserver_url.should == "http://localhost:8008"
79
- config.domain.should == "localhost"
80
- config.as_token.should == "as123"
81
- config.hs_token.should == "hs456"
82
- config.bot_mxid.should == "@bot:localhost"
83
- config.bind.should == "http://0.0.0.0:9292"
84
- end
85
-
86
- it "strips trailing slash from homeserver_url" do
87
- config = Async::Matrix::ApplicationService::Config.new({
88
- "homeserver" => {"url" => "http://localhost:8008/", "domain" => "localhost"},
89
- "appservice" => {"as_token" => "as123", "hs_token" => "hs456", "bot_mxid" => "@bot:localhost"}
90
- })
91
- config.homeserver_url.should == "http://localhost:8008"
92
- end
93
-
94
- it "raises BadJsonError for empty as_token" do
95
- lambda {
96
- Async::Matrix::ApplicationService::Config.new({
97
- "homeserver" => {"url" => "http://localhost:8008", "domain" => "localhost"},
98
- "appservice" => {"as_token" => "", "hs_token" => "hs456", "bot_mxid" => "@bot:localhost"}
99
- })
100
- }.should.raise(Async::Matrix::BadJsonError)
101
- end
102
-
103
- it "raises AuthError for placeholder tokens" do
104
- lambda {
105
- Async::Matrix::ApplicationService::Config.new({
106
- "homeserver" => {"url" => "http://localhost:8008", "domain" => "localhost"},
107
- "appservice" => {"as_token" => "CHANGE_ME", "hs_token" => "hs456", "bot_mxid" => "@bot:localhost"}
108
- })
109
- }.should.raise(Async::Matrix::AuthError)
110
- end
111
-
112
- it "loads from a YAML file" do
113
- file = Tempfile.new(["config", ".yml"])
114
- file.write(<<~YAML)
115
- homeserver:
116
- url: "http://localhost:8008"
117
- domain: "localhost"
118
- appservice:
119
- as_token: "as123"
120
- hs_token: "hs456"
121
- bot_mxid: "@bot:localhost"
122
- YAML
123
- file.close
124
-
125
- config = Async::Matrix::ApplicationService::Config.load(file.path)
126
- config.homeserver_url.should == "http://localhost:8008"
127
- ensure
128
- file.unlink
129
- end
130
-
131
- it "raises NotFoundError for missing file" do
132
- lambda {
133
- Async::Matrix::ApplicationService::Config.load("/nonexistent/path.yml")
134
- }.should.raise(Async::Matrix::NotFoundError)
135
- end
136
- end
93
+ require "tempfile"
94
+
95
+ describe "Async::Matrix::ApplicationService::Config" do
96
+ def minimal_data
97
+ {
98
+ "homeserver" => {
99
+ "address" => "http://localhost:8008",
100
+ "domain" => "localhost"
101
+ },
102
+ "appservice" => {
103
+ "as_token" => "as_secret_token_value",
104
+ "hs_token" => "hs_secret_token_value",
105
+ "bot" => { "username" => "bot" }
106
+ }
107
+ }
108
+ end
109
+
110
+ it "parses a minimal valid config" do
111
+ config = Async::Matrix::ApplicationService::Config.new(minimal_data)
112
+ config.homeserver.address.should == "http://localhost:8008"
113
+ config.homeserver.domain.should == "localhost"
114
+ config.appservice.as_token.should == "as_secret_token_value"
115
+ config.appservice.hs_token.should == "hs_secret_token_value"
116
+ config.appservice.bot.username.should == "bot"
117
+ end
118
+
119
+ it "derives bot_mxid from appservice.bot.username and homeserver.domain" do
120
+ config = Async::Matrix::ApplicationService::Config.new(minimal_data)
121
+ config.bot_mxid.should == "@bot:localhost"
122
+ end
123
+
124
+ it "inserts property defaults from the schema" do
125
+ config = Async::Matrix::ApplicationService::Config.new(minimal_data)
126
+ config.appservice.hostname.should == "0.0.0.0"
127
+ config.appservice.port.should == 29318
128
+ config.homeserver.software.should == "standard"
129
+ end
130
+
131
+ it "provides dot-notation access to deeply nested fields" do
132
+ data = minimal_data.merge(
133
+ "encryption" => {
134
+ "allow" => true,
135
+ "rotation" => { "messages" => 200 }
136
+ }
137
+ )
138
+ config = Async::Matrix::ApplicationService::Config.new(data)
139
+ config.encryption.allow.should == true
140
+ config.encryption.rotation.messages.should == 200
141
+ end
142
+
143
+ it "autovivifies missing optional sections as empty hashes" do
144
+ config = Async::Matrix::ApplicationService::Config.new(minimal_data)
145
+ config.analytics.should.be.kind_of Hash
146
+ config.analytics.should.be.empty?
147
+ end
148
+
149
+ it "raises BadJsonError when homeserver.address is missing" do
150
+ data = {
151
+ "homeserver" => { "domain" => "localhost" },
152
+ "appservice" => { "as_token" => "a", "hs_token" => "b" }
153
+ }
154
+ lambda {
155
+ Async::Matrix::ApplicationService::Config.new(data)
156
+ }.should.raise(Async::Matrix::BadJsonError)
157
+ end
158
+
159
+ it "raises BadJsonError when appservice.as_token is empty" do
160
+ data = {
161
+ "homeserver" => { "address" => "http://localhost:8008", "domain" => "localhost" },
162
+ "appservice" => { "as_token" => "", "hs_token" => "b" }
163
+ }
164
+ lambda {
165
+ Async::Matrix::ApplicationService::Config.new(data)
166
+ }.should.raise(Async::Matrix::BadJsonError)
167
+ end
168
+
169
+ it "raises BadJsonError for unknown top-level keys" do
170
+ data = minimal_data.merge("bogus" => "nope")
171
+ lambda {
172
+ Async::Matrix::ApplicationService::Config.new(data)
173
+ }.should.raise(Async::Matrix::BadJsonError)
174
+ end
175
+
176
+ it "validates enum constraints (homeserver.software)" do
177
+ data = minimal_data
178
+ data["homeserver"]["software"] = "invalid_value"
179
+ lambda {
180
+ Async::Matrix::ApplicationService::Config.new(data)
181
+ }.should.raise(Async::Matrix::BadJsonError)
182
+ end
183
+
184
+ it "loads from a YAML file" do
185
+ file = Tempfile.new(["config", ".yml"])
186
+ file.write(<<~YAML)
187
+ homeserver:
188
+ address: "http://localhost:8008"
189
+ domain: "localhost"
190
+ appservice:
191
+ as_token: "as123_secret"
192
+ hs_token: "hs456_secret"
193
+ bot:
194
+ username: "testbot"
195
+ YAML
196
+ file.close
197
+
198
+ config = Async::Matrix::ApplicationService::Config.load(file.path)
199
+ config.homeserver.address.should == "http://localhost:8008"
200
+ config.bot_mxid.should == "@testbot:localhost"
201
+ ensure
202
+ file.unlink
203
+ end
204
+
205
+ it "raises NotFoundError for missing file" do
206
+ lambda {
207
+ Async::Matrix::ApplicationService::Config.load("/nonexistent/path.yml")
208
+ }.should.raise(Async::Matrix::NotFoundError)
209
+ end
210
+
211
+ it "accepts the full bridge config with permissions as string presets" do
212
+ data = minimal_data.merge(
213
+ "bridge" => {
214
+ "command_prefix" => "!signal",
215
+ "permissions" => {
216
+ "*" => "relay",
217
+ "localhost" => "user",
218
+ "@admin:localhost" => "admin"
219
+ }
220
+ }
221
+ )
222
+ config = Async::Matrix::ApplicationService::Config.new(data)
223
+ config.bridge.command_prefix.should == "!signal"
224
+ config.bridge.permissions[:"*"].should == "relay"
225
+ config.bridge.permissions[:"@admin:localhost"].should == "admin"
226
+ end
227
+ end
137
228
  end
@@ -8,120 +8,122 @@ require "console"
8
8
  require "async/matrix"
9
9
 
10
10
  module Async
11
- module Matrix
12
- module ApplicationService
13
- # Routes incoming Matrix events to registered handler objects.
14
- #
15
- # Each handler declares the event types it handles via `#event_types`.
16
- # When an event arrives, the dispatcher finds all matching handlers
17
- # and calls them. Errors in one handler do not prevent others from running.
18
- class Dispatcher
19
- def initialize
20
- @handlers = Hash.new { |h, k| h[k] = [] }
21
- end
22
-
23
- def register(handler)
24
- handler.event_types.each do |type|
25
- @handlers[type] << handler
26
- Console.info(self) { "Registered #{handler.class.name} for #{type}" }
27
- end
28
- end
29
-
30
- def dispatch(event)
31
- type = event.type
32
- handlers = @handlers[type]
33
-
34
- if handlers.empty?
35
- Console.debug(self) { "No handler for event type: #{type}" }
36
- return
37
- end
38
-
39
- handlers.each do |handler|
40
- handler.call(event)
41
- rescue => e
42
- Console.error(self) { "Handler #{handler.class.name} raised #{e.class}: #{e.message}" }
43
- end
44
- end
45
-
46
- def dispatch_transaction(body)
47
- txn = Transaction.new(body)
48
- txn.events.each { |event| dispatch(event) }
49
- txn.ephemeral.each { |event| dispatch(event) }
50
- end
51
-
52
- def handler_count
53
- @handlers.values.flatten.size
54
- end
55
- end
56
- end
57
- end
11
+ module Matrix
12
+ module ApplicationService
13
+ # Routes incoming Matrix events to registered handler objects.
14
+ #
15
+ # Each handler declares the event types it handles via `#event_types`.
16
+ # When an event arrives, the dispatcher finds all matching handlers
17
+ # and calls them. Errors in one handler do not prevent others from running.
18
+ class Dispatcher
19
+ def initialize
20
+ @handlers = Hash.new { |h, k| h[k] = [] }
21
+ end
22
+
23
+ def register(handler)
24
+ handler.event_types.each do |type|
25
+ @handlers[type] << handler
26
+ Console.info(self) { "Registered #{handler.class.name} for #{type}" }
27
+ end
28
+ end
29
+
30
+ def dispatch_transaction(body)
31
+ Transaction.new(body).then do |txn|
32
+ txn.events.each { |event| dispatch(event) }
33
+ txn.ephemeral.each { |event| dispatch(event) }
34
+ end
35
+ end
36
+
37
+ def dispatch(event)
38
+ type = event.type
39
+ handlers = @handlers[type]
40
+
41
+ if handlers.empty?
42
+ Console.debug(self) { "No handler for event type: #{type}" }
43
+ else
44
+ handlers.each do |handler|
45
+ begin
46
+ handler.call(event)
47
+ rescue => e
48
+ Console.error(self) { "Handler #{handler.class.name} raised #{e.class}: #{e.message}" }
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ def handler_count
55
+ @handlers.values.flatten.size
56
+ end
57
+ end
58
+ end
59
+ end
58
60
  end
59
61
 
60
62
  test do
61
- describe "Async::Matrix::ApplicationService::Dispatcher" do
62
- it "registers and dispatches to handlers" do
63
- received = []
64
- handler = Object.new
65
- handler.define_singleton_method(:event_types) { ["m.room.message"] }
66
- handler.define_singleton_method(:call) { |event| received << event }
67
-
68
- dispatcher = Async::Matrix::ApplicationService::Dispatcher.new
69
- dispatcher.register(handler)
70
- dispatcher.handler_count.should == 1
71
-
72
- event = Async::Matrix::ApplicationService::Event.new({
73
- "type" => "m.room.message",
74
- "content" => {"body" => "hi"}
75
- })
76
- dispatcher.dispatch(event)
77
- received.length.should == 1
78
- received.first.content.body.should == "hi"
79
- end
80
-
81
- it "ignores events with no matching handler" do
82
- dispatcher = Async::Matrix::ApplicationService::Dispatcher.new
83
- event = Async::Matrix::ApplicationService::Event.new({"type" => "m.unknown"})
84
- lambda { dispatcher.dispatch(event) }.should.not.raise
85
- end
86
-
87
- it "continues dispatching when a handler raises" do
88
- results = []
89
- bad_handler = Object.new
90
- bad_handler.define_singleton_method(:event_types) { ["m.room.message"] }
91
- bad_handler.define_singleton_method(:call) { |_| raise "boom" }
92
-
93
- good_handler = Object.new
94
- good_handler.define_singleton_method(:event_types) { ["m.room.message"] }
95
- good_handler.define_singleton_method(:call) { |e| results << e }
96
-
97
- dispatcher = Async::Matrix::ApplicationService::Dispatcher.new
98
- dispatcher.register(bad_handler)
99
- dispatcher.register(good_handler)
100
-
101
- event = Async::Matrix::ApplicationService::Event.new({
102
- "type" => "m.room.message",
103
- "content" => {"body" => "test"}
104
- })
105
- dispatcher.dispatch(event)
106
- results.length.should == 1
107
- end
108
-
109
- it "dispatches a full transaction" do
110
- received = []
111
- handler = Object.new
112
- handler.define_singleton_method(:event_types) { ["m.room.message"] }
113
- handler.define_singleton_method(:call) { |e| received << e }
114
-
115
- dispatcher = Async::Matrix::ApplicationService::Dispatcher.new
116
- dispatcher.register(handler)
117
-
118
- dispatcher.dispatch_transaction({
119
- "events" => [
120
- {"type" => "m.room.message", "content" => {"body" => "one"}},
121
- {"type" => "m.room.message", "content" => {"body" => "two"}}
122
- ]
123
- })
124
- received.length.should == 2
125
- end
126
- end
63
+ describe "Async::Matrix::ApplicationService::Dispatcher" do
64
+ it "registers and dispatches to handlers" do
65
+ received = []
66
+ handler = Object.new
67
+ handler.define_singleton_method(:event_types) { ["m.room.message"] }
68
+ handler.define_singleton_method(:call) { |event| received << event }
69
+
70
+ dispatcher = Async::Matrix::ApplicationService::Dispatcher.new
71
+ dispatcher.register(handler)
72
+ dispatcher.handler_count.should == 1
73
+
74
+ event = Async::Matrix::ApplicationService::Event.new({
75
+ "type" => "m.room.message",
76
+ "content" => {"body" => "hi"}
77
+ })
78
+ dispatcher.dispatch(event)
79
+ received.length.should == 1
80
+ received.first.content.body.should == "hi"
81
+ end
82
+
83
+ it "ignores events with no matching handler" do
84
+ dispatcher = Async::Matrix::ApplicationService::Dispatcher.new
85
+ event = Async::Matrix::ApplicationService::Event.new({"type" => "m.unknown"})
86
+ lambda { dispatcher.dispatch(event) }.should.not.raise
87
+ end
88
+
89
+ it "continues dispatching when a handler raises" do
90
+ results = []
91
+ bad_handler = Object.new
92
+ bad_handler.define_singleton_method(:event_types) { ["m.room.message"] }
93
+ bad_handler.define_singleton_method(:call) { |_| raise "boom" }
94
+
95
+ good_handler = Object.new
96
+ good_handler.define_singleton_method(:event_types) { ["m.room.message"] }
97
+ good_handler.define_singleton_method(:call) { |e| results << e }
98
+
99
+ dispatcher = Async::Matrix::ApplicationService::Dispatcher.new
100
+ dispatcher.register(bad_handler)
101
+ dispatcher.register(good_handler)
102
+
103
+ event = Async::Matrix::ApplicationService::Event.new({
104
+ "type" => "m.room.message",
105
+ "content" => {"body" => "test"}
106
+ })
107
+ dispatcher.dispatch(event)
108
+ results.length.should == 1
109
+ end
110
+
111
+ it "dispatches a full transaction" do
112
+ received = []
113
+ handler = Object.new
114
+ handler.define_singleton_method(:event_types) { ["m.room.message"] }
115
+ handler.define_singleton_method(:call) { |e| received << e }
116
+
117
+ dispatcher = Async::Matrix::ApplicationService::Dispatcher.new
118
+ dispatcher.register(handler)
119
+
120
+ dispatcher.dispatch_transaction({
121
+ "events" => [
122
+ {"type" => "m.room.message", "content" => {"body" => "one"}},
123
+ {"type" => "m.room.message", "content" => {"body" => "two"}}
124
+ ]
125
+ })
126
+ received.length.should == 2
127
+ end
128
+ end
127
129
  end
@@ -7,35 +7,35 @@ require "bundler/setup"
7
7
  require "async/matrix"
8
8
 
9
9
  module Async
10
- module Matrix
11
- module ApplicationService
12
- class ErrorResponse
13
- attr_reader :errcode, :error
10
+ module Matrix
11
+ module ApplicationService
12
+ class ErrorResponse
13
+ attr_reader :errcode, :error
14
14
 
15
- def initialize(data)
16
- @errcode = data["errcode"]
17
- @error = data["error"]
18
- end
19
- end
20
- end
21
- end
15
+ def initialize(data)
16
+ @errcode = data["errcode"]
17
+ @error = data["error"]
18
+ end
19
+ end
20
+ end
21
+ end
22
22
  end
23
23
 
24
24
  test do
25
- describe "Async::Matrix::ApplicationService::ErrorResponse" do
26
- it "parses errcode and error" do
27
- resp = Async::Matrix::ApplicationService::ErrorResponse.new({
28
- "errcode" => "M_FORBIDDEN",
29
- "error" => "Access denied"
30
- })
31
- resp.errcode.should == "M_FORBIDDEN"
32
- resp.error.should == "Access denied"
33
- end
25
+ describe "Async::Matrix::ApplicationService::ErrorResponse" do
26
+ it "parses errcode and error" do
27
+ resp = Async::Matrix::ApplicationService::ErrorResponse.new({
28
+ "errcode" => "M_FORBIDDEN",
29
+ "error" => "Access denied"
30
+ })
31
+ resp.errcode.should == "M_FORBIDDEN"
32
+ resp.error.should == "Access denied"
33
+ end
34
34
 
35
- it "handles missing fields" do
36
- resp = Async::Matrix::ApplicationService::ErrorResponse.new({})
37
- resp.errcode.should.be.nil
38
- resp.error.should.be.nil
39
- end
40
- end
35
+ it "handles missing fields" do
36
+ resp = Async::Matrix::ApplicationService::ErrorResponse.new({})
37
+ resp.errcode.should.be.nil
38
+ resp.error.should.be.nil
39
+ end
40
+ end
41
41
  end