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