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
@@ -0,0 +1,164 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "encryption.json",
4
+ "description": "End-to-end encryption settings. Maps to mautrix bridgev2/bridgeconfig.EncryptionConfig.",
5
+ "type": "object",
6
+ "properties": {
7
+ "allow": {
8
+ "type": "boolean",
9
+ "default": false,
10
+ "description": "Allow encryption in portal rooms."
11
+ },
12
+ "default": {
13
+ "type": "boolean",
14
+ "default": false,
15
+ "description": "Enable encryption in new portal rooms by default."
16
+ },
17
+ "require": {
18
+ "type": "boolean",
19
+ "default": false,
20
+ "description": "Require encryption — drop messages in unencrypted rooms."
21
+ },
22
+ "appservice": {
23
+ "type": "boolean",
24
+ "default": false,
25
+ "description": "Enable appservice-level encryption (MSC3202)."
26
+ },
27
+ "msc4190": {
28
+ "type": "boolean",
29
+ "default": false,
30
+ "description": "Enable device management via MSC4190."
31
+ },
32
+ "msc4392": {
33
+ "type": "boolean",
34
+ "default": false,
35
+ "description": "Enable MSC4392 support."
36
+ },
37
+ "self_sign": {
38
+ "type": "boolean",
39
+ "default": false,
40
+ "description": "Self-sign the bridge device's keys."
41
+ },
42
+ "plaintext_mentions": {
43
+ "type": "boolean",
44
+ "default": false,
45
+ "description": "Include plaintext mentions alongside encrypted content."
46
+ },
47
+ "pickle_key": {
48
+ "type": "string",
49
+ "description": "Key for pickling Olm sessions. Set to 'generate' for auto-generation."
50
+ },
51
+ "allow_key_sharing": {
52
+ "type": "boolean",
53
+ "default": false,
54
+ "description": "Allow sharing Megolm keys with verified devices on request."
55
+ },
56
+ "delete_keys": {
57
+ "$ref": "#/$defs/DeleteKeys"
58
+ },
59
+ "verification_levels": {
60
+ "$ref": "#/$defs/VerificationLevels"
61
+ },
62
+ "rotation": {
63
+ "$ref": "#/$defs/Rotation"
64
+ }
65
+ },
66
+ "additionalProperties": false,
67
+ "$defs": {
68
+ "DeleteKeys": {
69
+ "description": "Key deletion policy settings.",
70
+ "type": "object",
71
+ "properties": {
72
+ "delete_outbound_on_ack": {
73
+ "type": "boolean",
74
+ "default": false,
75
+ "description": "Delete outbound sessions after all devices have acknowledged."
76
+ },
77
+ "dont_store_outbound": {
78
+ "type": "boolean",
79
+ "default": false,
80
+ "description": "Don't store outbound sessions at all."
81
+ },
82
+ "ratchet_on_decrypt": {
83
+ "type": "boolean",
84
+ "default": false,
85
+ "description": "Ratchet inbound sessions forward after decrypting a message."
86
+ },
87
+ "delete_fully_used_on_decrypt": {
88
+ "type": "boolean",
89
+ "default": false,
90
+ "description": "Delete inbound sessions that have been fully used after decryption."
91
+ },
92
+ "delete_prev_on_new_session": {
93
+ "type": "boolean",
94
+ "default": false,
95
+ "description": "Delete previous inbound session when a new one is received."
96
+ },
97
+ "delete_on_device_delete": {
98
+ "type": "boolean",
99
+ "default": false,
100
+ "description": "Delete keys associated with a device when that device is deleted."
101
+ },
102
+ "periodically_delete_expired": {
103
+ "type": "boolean",
104
+ "default": false,
105
+ "description": "Periodically delete expired inbound sessions."
106
+ },
107
+ "delete_outdated_inbound": {
108
+ "type": "boolean",
109
+ "default": false,
110
+ "description": "Delete outdated inbound sessions."
111
+ }
112
+ },
113
+ "additionalProperties": false
114
+ },
115
+ "VerificationLevels": {
116
+ "description": "Minimum verification trust levels for various operations.",
117
+ "type": "object",
118
+ "properties": {
119
+ "receive": {
120
+ "type": "string",
121
+ "description": "Minimum trust level for receiving messages."
122
+ },
123
+ "send": {
124
+ "type": "string",
125
+ "description": "Minimum trust level for sending messages."
126
+ },
127
+ "share": {
128
+ "type": "string",
129
+ "description": "Minimum trust level for sharing keys."
130
+ }
131
+ },
132
+ "additionalProperties": false
133
+ },
134
+ "Rotation": {
135
+ "description": "Megolm session rotation settings.",
136
+ "type": "object",
137
+ "properties": {
138
+ "enable_custom": {
139
+ "type": "boolean",
140
+ "default": false,
141
+ "description": "Enable custom rotation settings (otherwise use server defaults)."
142
+ },
143
+ "milliseconds": {
144
+ "type": "integer",
145
+ "minimum": 0,
146
+ "default": 604800000,
147
+ "description": "Rotate sessions after this many milliseconds."
148
+ },
149
+ "messages": {
150
+ "type": "integer",
151
+ "minimum": 0,
152
+ "default": 100,
153
+ "description": "Rotate sessions after this many messages."
154
+ },
155
+ "disable_device_change_key_rotation": {
156
+ "type": "boolean",
157
+ "default": false,
158
+ "description": "Don't rotate keys when a device list changes."
159
+ }
160
+ },
161
+ "additionalProperties": false
162
+ }
163
+ }
164
+ }
@@ -0,0 +1,58 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "homeserver.json",
4
+ "description": "Homeserver connection settings. Maps to mautrix bridgev2/bridgeconfig.HomeserverConfig.",
5
+ "type": "object",
6
+ "properties": {
7
+ "address": {
8
+ "type": "string",
9
+ "minLength": 1,
10
+ "description": "The URL of the homeserver's client-server API (e.g. http://synapse:8008)."
11
+ },
12
+ "domain": {
13
+ "type": "string",
14
+ "minLength": 1,
15
+ "description": "The server_name of the homeserver (e.g. example.com)."
16
+ },
17
+ "async_media": {
18
+ "type": "boolean",
19
+ "default": false,
20
+ "description": "Does the homeserver support asynchronous media uploads (MSC2246)?"
21
+ },
22
+ "public_address": {
23
+ "type": "string",
24
+ "description": "Public-facing base URL if the homeserver's API is behind a reverse proxy."
25
+ },
26
+ "software": {
27
+ "type": "string",
28
+ "enum": ["standard", "asmux", "hungry"],
29
+ "default": "standard",
30
+ "description": "The type of homeserver software (standard, asmux, or hungry)."
31
+ },
32
+ "status_endpoint": {
33
+ "type": "string",
34
+ "description": "URL to push bridge status updates to."
35
+ },
36
+ "message_send_checkpoint_endpoint": {
37
+ "type": "string",
38
+ "description": "URL to push message send checkpoints to."
39
+ },
40
+ "websocket": {
41
+ "type": "boolean",
42
+ "default": false,
43
+ "description": "Use websocket appservice transactions instead of HTTP."
44
+ },
45
+ "websocket_proxy": {
46
+ "type": "string",
47
+ "description": "HTTP proxy URL for the websocket connection."
48
+ },
49
+ "ping_interval_seconds": {
50
+ "type": "integer",
51
+ "minimum": 0,
52
+ "default": 0,
53
+ "description": "Interval in seconds between websocket pings. 0 disables."
54
+ }
55
+ },
56
+ "required": ["address", "domain"],
57
+ "additionalProperties": false
58
+ }
@@ -0,0 +1,50 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "logging.json",
4
+ "description": "Logging configuration. Maps to go.mau.fi/zeroconfig.Config (zerolog-based). Kept permissive since the full zeroconfig schema is external.",
5
+ "type": "object",
6
+ "properties": {
7
+ "min_level": {
8
+ "type": "string",
9
+ "enum": ["trace", "debug", "info", "warn", "error", "fatal"],
10
+ "default": "debug",
11
+ "description": "Minimum log level."
12
+ },
13
+ "writers": {
14
+ "type": "array",
15
+ "items": {
16
+ "type": "object",
17
+ "properties": {
18
+ "type": {
19
+ "type": "string",
20
+ "description": "Writer type (e.g. 'stdout', 'file')."
21
+ },
22
+ "format": {
23
+ "type": "string",
24
+ "enum": ["pretty-colored", "pretty", "json"],
25
+ "description": "Log output format."
26
+ },
27
+ "filename": {
28
+ "type": "string",
29
+ "description": "Log file path (for file writer type)."
30
+ },
31
+ "max_size": {
32
+ "type": "integer",
33
+ "description": "Maximum log file size in bytes before rotation."
34
+ },
35
+ "max_backups": {
36
+ "type": "integer",
37
+ "description": "Maximum number of old log files to keep."
38
+ },
39
+ "compress": {
40
+ "type": "boolean",
41
+ "description": "Compress rotated log files."
42
+ }
43
+ },
44
+ "additionalProperties": true
45
+ },
46
+ "description": "Log output writers."
47
+ }
48
+ },
49
+ "additionalProperties": true
50
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "management_room_texts.json",
4
+ "description": "Management room message templates. Maps to mautrix bridgev2/bridgeconfig.ManagementRoomTexts.",
5
+ "type": "object",
6
+ "properties": {
7
+ "welcome": {
8
+ "type": "string",
9
+ "description": "Welcome message sent when a user opens the management room."
10
+ },
11
+ "welcome_connected": {
12
+ "type": "string",
13
+ "description": "Welcome message variant for users who are already connected."
14
+ },
15
+ "welcome_unconnected": {
16
+ "type": "string",
17
+ "description": "Welcome message variant for users who are not yet connected."
18
+ },
19
+ "additional_help": {
20
+ "type": "string",
21
+ "description": "Additional help text appended to the help command output."
22
+ }
23
+ },
24
+ "additionalProperties": false
25
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "matrix.json",
4
+ "description": "Matrix protocol behavior settings. Maps to mautrix bridgev2/bridgeconfig.MatrixConfig.",
5
+ "type": "object",
6
+ "properties": {
7
+ "message_status_events": {
8
+ "type": "boolean",
9
+ "default": false,
10
+ "description": "Send message status events (MSC3381) for bridge message processing."
11
+ },
12
+ "delivery_receipts": {
13
+ "type": "boolean",
14
+ "default": false,
15
+ "description": "Send delivery receipts after successfully bridging a message."
16
+ },
17
+ "message_error_notices": {
18
+ "type": "boolean",
19
+ "default": true,
20
+ "description": "Send error notices to the room when a message fails to bridge."
21
+ },
22
+ "sync_direct_chat_list": {
23
+ "type": "boolean",
24
+ "default": false,
25
+ "description": "Sync the m.direct account data event with bridged DM rooms."
26
+ },
27
+ "federate_rooms": {
28
+ "type": "boolean",
29
+ "default": true,
30
+ "description": "Allow portal rooms to federate."
31
+ },
32
+ "upload_file_threshold": {
33
+ "type": "integer",
34
+ "minimum": 0,
35
+ "default": 5242880,
36
+ "description": "Maximum file size in bytes to upload directly (default 5 MiB)."
37
+ },
38
+ "ghost_extra_profile_info": {
39
+ "type": "boolean",
40
+ "default": false,
41
+ "description": "Set extra profile info (e.g. identifiers) on ghost users."
42
+ }
43
+ },
44
+ "additionalProperties": false
45
+ }
@@ -0,0 +1,54 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "permissions.json",
4
+ "description": "Permission level definition. Maps to mautrix bridgev2/bridgeconfig.Permissions. Used as values in the bridge.permissions map.",
5
+ "oneOf": [
6
+ {
7
+ "type": "string",
8
+ "enum": ["block", "relay", "commands", "user", "admin"],
9
+ "description": "Named permission preset."
10
+ },
11
+ {
12
+ "type": "object",
13
+ "properties": {
14
+ "send_events": {
15
+ "type": "boolean",
16
+ "default": false,
17
+ "description": "Allow bridging events from the remote network to Matrix."
18
+ },
19
+ "commands": {
20
+ "type": "boolean",
21
+ "default": false,
22
+ "description": "Allow using bridge commands."
23
+ },
24
+ "login": {
25
+ "type": "boolean",
26
+ "default": false,
27
+ "description": "Allow logging into the bridge."
28
+ },
29
+ "double_puppet": {
30
+ "type": "boolean",
31
+ "default": false,
32
+ "description": "Allow enabling double-puppeting."
33
+ },
34
+ "admin": {
35
+ "type": "boolean",
36
+ "default": false,
37
+ "description": "Allow bridge administration commands."
38
+ },
39
+ "manage_relay": {
40
+ "type": "boolean",
41
+ "default": false,
42
+ "description": "Allow managing relay mode."
43
+ },
44
+ "max_logins": {
45
+ "type": "integer",
46
+ "minimum": 0,
47
+ "default": 0,
48
+ "description": "Maximum number of simultaneous logins. 0 means unlimited."
49
+ }
50
+ },
51
+ "additionalProperties": false
52
+ }
53
+ ]
54
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "provisioning.json",
4
+ "description": "Provisioning API settings. Maps to mautrix bridgev2/bridgeconfig.ProvisioningConfig.",
5
+ "type": "object",
6
+ "properties": {
7
+ "shared_secret": {
8
+ "type": "string",
9
+ "description": "Shared secret for provisioning API authentication. Set to 'generate' for auto-generation."
10
+ },
11
+ "debug_endpoints": {
12
+ "type": "boolean",
13
+ "default": false,
14
+ "description": "Enable debug/profiling endpoints on the provisioning API."
15
+ },
16
+ "enable_session_transfers": {
17
+ "type": "boolean",
18
+ "default": false,
19
+ "description": "Enable transferring login sessions between devices."
20
+ }
21
+ },
22
+ "additionalProperties": false
23
+ }
@@ -0,0 +1,39 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "public_media.json",
4
+ "description": "Public media proxy settings. Maps to mautrix bridgev2/bridgeconfig.PublicMediaConfig.",
5
+ "type": "object",
6
+ "properties": {
7
+ "enabled": {
8
+ "type": "boolean",
9
+ "default": false,
10
+ "description": "Enable the public media proxy."
11
+ },
12
+ "signing_key": {
13
+ "type": "string",
14
+ "description": "Signing key for public media URLs. Set to 'generate' for auto-generation."
15
+ },
16
+ "expiry": {
17
+ "type": "integer",
18
+ "minimum": 0,
19
+ "default": 0,
20
+ "description": "Expiry time for public media URLs in seconds. 0 means no expiry."
21
+ },
22
+ "hash_length": {
23
+ "type": "integer",
24
+ "minimum": 0,
25
+ "default": 32,
26
+ "description": "Length of the hash in public media URLs."
27
+ },
28
+ "path_prefix": {
29
+ "type": "string",
30
+ "description": "URL path prefix for the public media endpoint."
31
+ },
32
+ "use_database": {
33
+ "type": "boolean",
34
+ "default": false,
35
+ "description": "Store public media URL mappings in the database."
36
+ }
37
+ },
38
+ "additionalProperties": false
39
+ }
@@ -0,0 +1,43 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "relay.json",
4
+ "description": "Relay mode settings. Maps to mautrix bridgev2/bridgeconfig.RelayConfig.",
5
+ "type": "object",
6
+ "properties": {
7
+ "enabled": {
8
+ "type": "boolean",
9
+ "default": false,
10
+ "description": "Enable relay mode for bridging messages from non-logged-in users."
11
+ },
12
+ "admin_only": {
13
+ "type": "boolean",
14
+ "default": false,
15
+ "description": "Only allow admins to enable relay mode in a room."
16
+ },
17
+ "prefer_default": {
18
+ "type": "boolean",
19
+ "default": false,
20
+ "description": "Prefer default relays over room-specific relays."
21
+ },
22
+ "allow_bridge": {
23
+ "type": "boolean",
24
+ "default": false,
25
+ "description": "Allow relayed bridging of messages."
26
+ },
27
+ "default_relays": {
28
+ "type": "array",
29
+ "items": { "type": "string" },
30
+ "description": "Default user login IDs to use for relaying."
31
+ },
32
+ "message_formats": {
33
+ "type": "object",
34
+ "additionalProperties": { "type": "string" },
35
+ "description": "Go text/template strings for formatting relayed messages, keyed by message type (e.g. 'm.text')."
36
+ },
37
+ "displayname_format": {
38
+ "type": "string",
39
+ "description": "Go text/template string for formatting relayed displaynames."
40
+ }
41
+ },
42
+ "additionalProperties": false
43
+ }
@@ -0,0 +1,110 @@
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 ApplicationService
9
+ class Config
10
+ # Mixin that gives a Hash dot-notation accessors with autovivification.
11
+ #
12
+ # Not applied globally — only extended onto the validated config hash
13
+ # and its nested children so the rest of the world is unaffected.
14
+ #
15
+ # h = {}.extend(Vivify)
16
+ # h.foo.bar.baz = 42
17
+ # h # => { foo: { bar: { baz: 42 } } }
18
+ #
19
+ module Vivify
20
+ def method_missing(name, *args)
21
+ key = name.to_s
22
+
23
+ if key.end_with?("=")
24
+ self[key.chomp("=").to_sym] = args.first
25
+ elsif key?(name.to_sym)
26
+ self[name.to_sym]
27
+ elsif key.start_with?("to_")
28
+ super
29
+ else
30
+ self[name.to_sym] = {}.extend(Vivify)
31
+ end
32
+ end
33
+
34
+ def respond_to_missing?(name, _priv = false)
35
+ name.to_s.end_with?("=") || key?(name.to_sym) || super
36
+ end
37
+
38
+ # Recursively symbolize keys and extend every nested Hash with Vivify.
39
+ #
40
+ # Call this on the raw (string-keyed) hash that comes out of
41
+ # YAML.safe_load / JSON Schema validation before wrapping it in Config.
42
+ def self.deep_vivify(obj)
43
+ case obj
44
+ when Hash
45
+ result = {}
46
+ obj.each { |k, v| result[k.to_s.to_sym] = deep_vivify(v) }
47
+ result.extend(Vivify)
48
+ when Array
49
+ obj.map { |v| deep_vivify(v) }
50
+ else
51
+ obj
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+
60
+ test do
61
+ V = Async::Matrix::ApplicationService::Config::Vivify
62
+
63
+ describe "Vivify" do
64
+ it "provides dot-notation read access to symbol keys" do
65
+ h = { foo: "bar" }.extend(V)
66
+ h.foo.should == "bar"
67
+ end
68
+
69
+ it "provides dot-notation write access" do
70
+ h = {}.extend(V)
71
+ h.foo = 42
72
+ h[:foo].should == 42
73
+ end
74
+
75
+ it "autovivifies missing keys as vivified hashes" do
76
+ h = {}.extend(V)
77
+ h.a.b.c = "deep"
78
+ h[:a][:b][:c].should == "deep"
79
+ end
80
+
81
+ it "delegates to_* methods to super (no autovivify)" do
82
+ h = { x: 1 }.extend(V)
83
+ h.to_a.should == [[:x, 1]]
84
+ end
85
+ end
86
+
87
+ describe "Vivify.deep_vivify" do
88
+ it "symbolizes string keys" do
89
+ result = V.deep_vivify({"a" => 1})
90
+ result[:a].should == 1
91
+ end
92
+
93
+ it "recursively vivifies nested hashes" do
94
+ result = V.deep_vivify({"outer" => {"inner" => "val"}})
95
+ result.outer.inner.should == "val"
96
+ end
97
+
98
+ it "vivifies hashes inside arrays" do
99
+ result = V.deep_vivify({"list" => [{"name" => "x"}]})
100
+ result.list.first.name.should == "x"
101
+ end
102
+
103
+ it "passes scalars through unchanged" do
104
+ result = V.deep_vivify({"n" => 42, "s" => "hi", "b" => true})
105
+ result.n.should == 42
106
+ result.s.should == "hi"
107
+ result.b.should == true
108
+ end
109
+ end
110
+ end