Compare commits

...

7 commits

Author SHA1 Message Date
Andrew Morgan 2d936af72a
Merge 42a1bc370f into 13aa6e83ae 2025-12-05 18:28:21 +00:00
Andrew Morgan 42a1bc370f newsfile 2025-12-05 15:57:28 +00:00
Andrew Morgan 17acd978a4 Display "(deprecated)" next to deprecated endpoints 2025-12-05 15:48:20 +00:00
Andrew Morgan 1213f81676 Move each spec's intro above the endpoints list
This just looks visually nicer. You have an introduction paragraph, then
the list of endpoints, then the spec.
2025-12-05 15:47:08 +00:00
Andrew Morgan f03730455d Place the endpoints list just under the description of each API
We needed to override Docsy's default page renderers to show it. Because
the Client-Server API uses a different render chain than the other
endpoint pages, we have to override two of Docsy's pages (`content.html` and `single.html`).

In order to reduce duplication, we then put the shared content into a
`spec-content.html` partial.
2025-12-05 15:46:16 +00:00
Andrew Morgan 56d48eb3a8 Add an endpoints table of contents
A simple list of endpoints that one can ctrl-f through.
2025-12-05 15:12:15 +00:00
Andrew Morgan 82a67a1fab Store each endpoint's metadata in a slice on Page
Such that we can later construct the table of contents with the data.
2025-12-05 15:11:17 +00:00
15 changed files with 172 additions and 79 deletions

View file

@ -257,6 +257,51 @@ Custom SCSS for the Matrix spec
} }
.endpoints-toc {
summary {
cursor: pointer;
font-weight: $font-weight-bold;
font-size: 1.05rem;
margin-bottom: 0.5rem;
}
.endpoint-list {
list-style: none;
padding-left: 0;
margin: 0;
}
.endpoint-list li {
margin: 0.2rem 0;
}
.endpoint-list a {
text-decoration: none;
color: inherit;
}
.endpoint-list .http-api-method {
font-weight: $font-weight-bold;
margin-right: 0.35rem;
}
.endpoint-path {
font-family: $font-family-monospace;
color: $secondary;
}
.endpoint-deprecated {
color: $danger;
font-weight: $font-weight-bold;
margin-left: 0.35rem;
}
}
.page-description {
margin-bottom: 1rem;
color: inherit;
}
/* Styles for alert boxes */ /* Styles for alert boxes */
.alert { .alert {
&.note { &.note {

View file

@ -0,0 +1 @@
Add a list of endpoints to the top of each spec page.

View file

@ -2,16 +2,14 @@
title: "Application Service API" title: "Application Service API"
weight: 30 weight: 30
type: docs type: docs
description: |
The Matrix client-server API and server-server APIs provide a consistent,
self-contained federated messaging fabric but leave little room for custom
server-side behaviour such as gateways, filters, or extensible hooks. The
Application Service API defines a standard way to add this extensible
functionality, independent of the underlying homeserver implementation.
--- ---
The Matrix client-server API and server-server APIs provide the means to
implement a consistent self-contained federated messaging fabric.
However, they provide limited means of implementing custom server-side
behaviour in Matrix (e.g. gateways, filters, extensible hooks etc). The
Application Service API (AS API) defines a standard API to allow such
extensible functionality to be implemented irrespective of the
underlying homeserver implementation.
## Application Services ## Application Services
Application services are passive and can only observe events from the Application services are passive and can only observe events from the

View file

@ -2,14 +2,14 @@
title: "Client-Server API" title: "Client-Server API"
weight: 10 weight: 10
type: docs type: docs
description: |
The client-server API allows clients to send messages, control rooms and
synchronise conversation history. It is designed to support both lightweight
clients which store no state and lazy-load data from the server as required,
as well as heavyweight clients which maintain a full local persistent copy of
server state.
--- ---
The client-server API allows clients to
send messages, control rooms and synchronise conversation history. It is
designed to support both lightweight clients which store no state and
lazy-load data from the server as required - as well as heavyweight
clients which maintain a full local persistent copy of server state.
## API Standards ## API Standards
{{% boxes/note %}} {{% boxes/note %}}

View file

@ -2,16 +2,14 @@
title: "Identity Service API" title: "Identity Service API"
weight: 40 weight: 40
type: docs type: docs
--- description: |
The Matrix client-server and server-server APIs are largely expressed in The Matrix client-server and server-server APIs are largely expressed in
Matrix user identifiers. From time to time, it is useful to refer to Matrix user identifiers. Sometimes it is useful to refer to users by other
users by other ("third-party") identifiers, or "3PID"s, e.g. their email (“third-party”) identifiers such as email addresses or phone numbers. The
address or phone number. This Identity Service Specification describes Identity Service API describes how mappings between 3PIDs and Matrix user
how mappings between third-party identifiers and Matrix user identifiers IDs can be established, validated, and used; in practice this has been
can be established, validated, and used. This description technically applied to email addresses and phone numbers.
may apply to any 3PID, but in practice has only been applied ---
specifically to email addresses and phone numbers.
## General principles ## General principles

View file

@ -2,12 +2,11 @@
title: "Push Gateway API" title: "Push Gateway API"
weight: 50 weight: 50
type: docs type: docs
description: |
Clients may want to receive push notifications when events are received at the
homeserver. This is managed by a distinct entity called the Push Gateway.
--- ---
Clients may want to receive push notifications when events are received
at the homeserver. This is managed by a distinct entity called the Push
Gateway.
## Overview ## Overview
A client's homeserver forwards information about received events to the A client's homeserver forwards information about received events to the

View file

@ -2,18 +2,13 @@
title: "Server-Server API" title: "Server-Server API"
weight: 20 weight: 20
type: docs type: docs
--- description: |
Matrix homeservers use the Federation APIs (also known as server-server APIs)
Matrix homeservers use the Federation APIs (also known as server-server to communicate with each other. Homeservers use these APIs to push messages in
APIs) to communicate with each other. Homeservers use these APIs to push real-time, retrieve historic messages, and query profile or presence
messages to each other in real-time, to retrieve historic messages from information about users on other servers. The APIs are implemented over HTTPS,
each other, and to query profile and presence information about users on with authentication provided by public key signatures both at the TLS
each other's servers. transport layer and in HTTP Authorization headers.
The APIs are implemented using HTTPS requests between each of the
servers. These HTTPS requests are strongly authenticated using public
key signatures at the TLS transport layer and using public key
signatures in HTTP Authorization headers at the HTTP layer.
There are three main kinds of communication that occur between There are three main kinds of communication that occur between
homeservers: homeservers:
@ -45,6 +40,8 @@ EDUs and PDUs are further wrapped in an envelope called a Transaction,
which is transferred from the origin to the destination homeserver using which is transferred from the origin to the destination homeserver using
an HTTPS PUT request. an HTTPS PUT request.
---
## API standards ## API standards
The mandatory baseline for server-server communication in Matrix is The mandatory baseline for server-server communication in Matrix is

View file

@ -0,0 +1,29 @@
{{/* Minimal list of API endpoints for the current page. */}}
{{ $raw := .Scratch.Get "api_endpoints" }}
{{/* Normalize to a slice */}}
{{ $endpoints := slice }}
{{ if reflect.IsSlice $raw }}
{{ $endpoints = $raw }}
{{ else if reflect.IsMap $raw }}
{{ range $raw }}
{{ $endpoints = append $endpoints . }}
{{ end }}
{{ end }}
{{ if gt (len $endpoints) 0 }}
<div class="endpoints-toc mb-4">
<details>
<summary>List of Endpoints</summary>
<ul class="endpoint-list">
{{ range $endpoints }}
<li>
<a href="#{{ .anchor }}">
<span class="http-api-method">{{ .method }}</span>
<span class="endpoint-path">{{ .endpoint }}</span>
{{ if .deprecated }}<span class="endpoint-deprecated">(deprecated)</span>{{ end }}
</a>
</li>
{{ end }}
</ul>
</details>
</div>
{{ end }}

View file

@ -15,6 +15,7 @@
{{ $api_data := index .api_data }} {{ $api_data := index .api_data }}
{{ $base_url := .base_url }} {{ $base_url := .base_url }}
{{ $anchor_base := .anchor_base }} {{ $anchor_base := .anchor_base }}
{{ $page := .page }}
{{ range $path_name, $path_data := $api_data.paths }} {{ range $path_name, $path_data := $api_data.paths }}
@ -26,28 +27,28 @@
{{ with $path_data.get }} {{ with $path_data.get }}
{{ $operation_params := merge $params (dict "method" "GET" "operation_data" . "anchor_base" $anchor_base) }} {{ $operation_params := merge $params (dict "method" "GET" "operation_data" . "anchor_base" $anchor_base "page" $page) }}
{{ partial "openapi/render-operation" $operation_params }} {{ partial "openapi/render-operation" $operation_params }}
{{ end }} {{ end }}
{{ with $path_data.post }} {{ with $path_data.post }}
{{ $operation_params := merge $params (dict "method" "POST" "operation_data" . "anchor_base" $anchor_base) }} {{ $operation_params := merge $params (dict "method" "POST" "operation_data" . "anchor_base" $anchor_base "page" $page) }}
{{ partial "openapi/render-operation" $operation_params }} {{ partial "openapi/render-operation" $operation_params }}
{{ end }} {{ end }}
{{ with $path_data.put }} {{ with $path_data.put }}
{{ $operation_params := merge $params (dict "method" "PUT" "operation_data" . "anchor_base" $anchor_base) }} {{ $operation_params := merge $params (dict "method" "PUT" "operation_data" . "anchor_base" $anchor_base "page" $page) }}
{{ partial "openapi/render-operation" $operation_params }} {{ partial "openapi/render-operation" $operation_params }}
{{ end }} {{ end }}
{{ with $path_data.delete }} {{ with $path_data.delete }}
{{ $operation_params := merge $params (dict "method" "DELETE" "operation_data" . "anchor_base" $anchor_base) }} {{ $operation_params := merge $params (dict "method" "DELETE" "operation_data" . "anchor_base" $anchor_base "page" $page) }}
{{ partial "openapi/render-operation" $operation_params }} {{ partial "openapi/render-operation" $operation_params }}
{{ end }} {{ end }}

View file

@ -22,6 +22,7 @@
{{ $method := .method }} {{ $method := .method }}
{{ $endpoint := .endpoint }} {{ $endpoint := .endpoint }}
{{ $operation_data := .operation_data }} {{ $operation_data := .operation_data }}
{{ $page := .page }}
{{ $anchor := "" }} {{ $anchor := "" }}
{{ if .anchor_base }} {{ if .anchor_base }}
@ -29,6 +30,16 @@
{{ end }} {{ end }}
{{ $anchor = printf "%s%s%s" $anchor (lower $method) (anchorize $endpoint) }} {{ $anchor = printf "%s%s%s" $anchor (lower $method) (anchorize $endpoint) }}
{{/* Collect endpoints for the on-page endpoints TOC */}}
{{ if $page }}
{{/* Store each endpoint's metadata in a scratch variable */}}
{{ $entry := dict "anchor" $anchor "method" $method "endpoint" $endpoint "summary" $operation_data.summary "deprecated" $operation_data.deprecated }}
{{ if not (reflect.IsSlice ($page.Scratch.Get "api_endpoints")) }}
{{ $page.Scratch.Set "api_endpoints" (slice) }}
{{ end }}
{{ $page.Scratch.Add "api_endpoints" (slice $entry) }}
{{ end }}
<section class="rendered-data"> <section class="rendered-data">
<details {{ if not site.Params.ui.rendered_data_collapsed }}open{{ end }}> <details {{ if not site.Params.ui.rendered_data_collapsed }}open{{ end }}>

View file

@ -0,0 +1,11 @@
{{- /* Shared render for spec pages: title, optional description, endpoints list, body, and last-mod info. */ -}}
<div class="td-content">
<h1>{{ .Title }}</h1>
{{ with .Params.description }}<p class="page-description">{{ . | markdownify }}</p>{{ end }}
{{ partial "endpoints-toc.html" . }}
{{ .Content }}
{{ partial "page-meta-lastmod.html" . }}
</div>

View file

@ -30,4 +30,4 @@
{{ $api_data = partial "json-schema/resolve-refs" (dict "schema" $api_data "path" $path) }} {{ $api_data = partial "json-schema/resolve-refs" (dict "schema" $api_data "path" $path) }}
{{ $api_data = partial "json-schema/resolve-allof" $api_data }} {{ $api_data = partial "json-schema/resolve-allof" $api_data }}
{{ partial "openapi/render-api" (dict "api_data" $api_data "base_url" $base_url "anchor_base" $anchor_base) }} {{ partial "openapi/render-api" (dict "api_data" $api_data "base_url" $base_url "anchor_base" $anchor_base "page" .Page) }}

View file

@ -1,4 +1,3 @@
<div class="td-content"> {{ define "main" }}
<h1>{{ .Title }}</h1> {{ partial "spec-content.html" . }}
{{ .Content }} {{ end }}
</div>

View file

@ -7,7 +7,8 @@
{{ define "main" }} {{ define "main" }}
<div class="td-content"> <div class="td-content">
<h1>{{ .Title }}</h1> <h1>{{ .Title }}</h1>
{{ with .Params.description }}<div class="lead">{{ . | markdownify }}</div>{{ end }} {{ with .Params.description }}<p class="page-description">{{ . | markdownify }}</p>{{ end }}
{{ partial "endpoints-toc.html" . }}
{{ .Content }} {{ .Content }}
</div> </div>
{{ end }} {{ end }}

3
layouts/docs/single.html Normal file
View file

@ -0,0 +1,3 @@
{{ define "main" }}
{{ partial "spec-content.html" . }}
{{ end }}