Skip to content

Commit

Permalink
Document the instance_id field of Protocol Instance
Browse files Browse the repository at this point in the history
It is used as the `third_party_instance_id` of `POST /_matrix/client/v3/publicRooms`.

It has always been present since before the thirdparty protocol endpoints were added to the spec.

Signed-off-by: Kévin Commaille <[email protected]>
  • Loading branch information
zecakeh committed Jan 13, 2025
1 parent 6f1e64c commit 36fcb6b
Show file tree
Hide file tree
Showing 8 changed files with 188 additions and 104 deletions.
110 changes: 12 additions & 98 deletions data/api/application-service/definitions/protocol.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,101 +11,15 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
title: Protocol
type: object
properties:
user_fields:
description: |-
Fields which may be used to identify a third-party user. These should be
ordered to suggest the way that entities may be grouped, where higher
groupings are ordered first. For example, the name of a network should be
searched before the nickname of a user.
type: array
items:
type: string
description: Field used to identify a third-party user.
example: ["network", "nickname"]
location_fields:
description: |-
Fields which may be used to identify a third-party location. These should be
ordered to suggest the way that entities may be grouped, where higher
groupings are ordered first. For example, the name of a network should be
searched before the name of a channel.
type: array
items:
type: string
description: Field used to identify a third-party location.
example: ["network", "channel"]
icon:
description: A content URI representing an icon for the third-party protocol.
type: string
example: "mxc://example.org/aBcDeFgH"
field_types:
description: |-
The type definitions for the fields defined in `user_fields` and
`location_fields`. Each entry in those arrays MUST have an entry here.
The `string` key for this object is the field name itself.
May be an empty object if no fields are defined.
type: object
additionalProperties:
title: Field Type
description: Definition of valid values for a field.
type: object
properties:
regexp:
description: |-
A regular expression for validation of a field's value. This may be relatively
coarse to verify the value as the application service providing this protocol
may apply additional validation or filtering.
type: string
placeholder:
description: A placeholder serving as a valid example of the field value.
type: string
required: ['regexp', 'placeholder']
example: {
"network": {
"regexp": "([a-z0-9]+\\.)*[a-z0-9]+",
"placeholder": "irc.example.org"
},
"nickname": {
"regexp": "[^\\s#]+",
"placeholder": "username"
},
"channel": {
"regexp": "#[^\\s]+",
"placeholder": "#foobar"
}
}
instances:
description: |-
A list of objects representing independent instances of configuration.
For example, multiple networks on IRC if multiple are provided by the
same application service.
type: array
items:
type: object
title: Protocol Instance
properties:
desc:
type: string
description: A human-readable description for the protocol, such as the name.
example: "Freenode"
icon:
type: string
description: |-
An optional content URI representing the protocol. Overrides the one provided
at the higher level Protocol object.
example: "mxc://example.org/JkLmNoPq"
fields:
type: object
description: Preset values for `fields` the client may use to search by.
example: {
"network": "freenode"
}
network_id:
type: string
description: A unique identifier across all instances.
example: "freenode"
required: ['desc', 'fields', 'network_id']
required: ['user_fields', 'location_fields', 'icon', 'field_types', 'instances']
allOf:
- $ref: protocol_base.yaml
- type: object
properties:
instances:
description: |-
A list of objects representing independent instances of configuration.
For example, multiple networks on IRC if multiple are provided by the
same application service.
type: array
items:
$ref: protocol_instance.yaml
80 changes: 80 additions & 0 deletions data/api/application-service/definitions/protocol_base.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# Copyright 2018 New Vector Ltd
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
title: Protocol
type: object
properties:
user_fields:
description: |-
Fields which may be used to identify a third-party user. These should be
ordered to suggest the way that entities may be grouped, where higher
groupings are ordered first. For example, the name of a network should be
searched before the nickname of a user.
type: array
items:
type: string
description: Field used to identify a third-party user.
example: ["network", "nickname"]
location_fields:
description: |-
Fields which may be used to identify a third-party location. These should be
ordered to suggest the way that entities may be grouped, where higher
groupings are ordered first. For example, the name of a network should be
searched before the name of a channel.
type: array
items:
type: string
description: Field used to identify a third-party location.
example: ["network", "channel"]
icon:
description: A content URI representing an icon for the third-party protocol.
type: string
example: "mxc://example.org/aBcDeFgH"
field_types:
description: |-
The type definitions for the fields defined in `user_fields` and
`location_fields`. Each entry in those arrays MUST have an entry here.
The `string` key for this object is the field name itself.
May be an empty object if no fields are defined.
type: object
additionalProperties:
title: Field Type
description: Definition of valid values for a field.
type: object
properties:
regexp:
description: |-
A regular expression for validation of a field's value. This may be relatively
coarse to verify the value as the application service providing this protocol
may apply additional validation or filtering.
type: string
placeholder:
description: A placeholder serving as a valid example of the field value.
type: string
required: ['regexp', 'placeholder']
example: {
"network": {
"regexp": "([a-z0-9]+\\.)*[a-z0-9]+",
"placeholder": "irc.example.org"
},
"nickname": {
"regexp": "[^\\s#]+",
"placeholder": "username"
},
"channel": {
"regexp": "#[^\\s]+",
"placeholder": "#foobar"
}
}
required: ['user_fields', 'location_fields', 'icon', 'field_types', 'instances']
37 changes: 37 additions & 0 deletions data/api/application-service/definitions/protocol_instance.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Copyright 2018 New Vector Ltd
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
type: object
title: Protocol Instance
properties:
desc:
type: string
description: A human-readable description for the protocol, such as the name.
example: "Freenode"
icon:
type: string
description: |-
An optional content URI representing the protocol. Overrides the one provided
at the higher level Protocol object.
example: "mxc://example.org/JkLmNoPq"
fields:
type: object
description: Preset values for `fields` the client may use to search by.
example: {
"network": "freenode"
}
network_id:
type: string
description: A unique identifier across all instances.
example: "freenode"
required: ['desc', 'fields', 'network_id']
44 changes: 44 additions & 0 deletions data/api/client-server/definitions/protocol.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Copyright 2018 New Vector Ltd
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
allOf:
- $ref: ../../application-service/definitions/protocol_base.yaml
- type: object
properties:
instances:
description: |-
A list of objects representing independent instances of configuration.
For example, multiple networks on IRC if multiple are provided by the
same application service.
The instances are modified by the homeserver from the response of
[`GET /_matrix/app/v1/thirdparty/protocol/{protocol}`](/application-service-api/#get_matrixappv1thirdpartyprotocolprotocol)
to include an `instance_id` to serve as a unique identifier for each
instance on the homeserver.
type: array
items:
allOf:
- $ref: ../../application-service/definitions/protocol_instance.yaml
- type: object
properties:
instance_id:
type: string
description: |-
A unique identifier for this instance on the homeserver. This field is added
to the response of [`GET /_matrix/app/v1/thirdparty/protocol/{protocol}`](/application-service-api/#get_matrixappv1thirdpartyprotocolprotocol)
by the homeserver.
This is the identifier to use as the `third_party_instance_id` in a request to
[`POST /_matrix/client/v3/publicRooms`](/client-server-api/#post_matrixclientv3publicrooms).
example: "irc-freenode"
required: ['desc', 'fields', 'network_id', 'instance_id']
5 changes: 4 additions & 1 deletion data/api/client-server/list_public_rooms.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,9 @@ paths:
description: |-
The specific third-party network/protocol to request from the
homeserver. Can only be used if `include_all_networks` is false.
This is the `instance_id` of a `Protocol Instance` returned by
[`GET /_matrix/client/v3/thirdparty/protocols`](/client-server-api/#get_matrixclientv3thirdpartyprotocols).
example: irc
example: {
"limit": 10,
Expand All @@ -244,7 +247,7 @@ paths:
]
},
"include_all_networks": false,
"third_party_instance_id": "irc"
"third_party_instance_id": "irc-freenode"
}
description: Options for which rooms to return.
required: true
Expand Down
4 changes: 2 additions & 2 deletions data/api/client-server/third_party_lookup.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ paths:
content:
application/json:
schema:
$ref: ../application-service/definitions/protocol_metadata.yaml
$ref: definitions/protocol_metadata.yaml
tags:
- Third-party Lookup
"/thirdparty/protocol/{protocol}":
Expand All @@ -59,7 +59,7 @@ paths:
content:
application/json:
schema:
$ref: ../application-service/definitions/protocol.yaml
$ref: definitions/protocol.yaml
"404":
description: The protocol is unknown.
content:
Expand Down
12 changes: 9 additions & 3 deletions data/api/server-server/public_rooms.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,10 @@ paths:
description: |-
The specific third-party network/protocol to request from the homeserver.
Can only be used if `include_all_networks` is false.
example: irc
This is the `instance_id` of a `Protocol Instance` returned by
[`GET /_matrix/client/v3/thirdparty/protocols`](/client-server-api/#get_matrixclientv3thirdpartyprotocols).
example: irc-freenode
schema:
type: string
responses:
Expand Down Expand Up @@ -124,7 +127,10 @@ paths:
description: |-
The specific third-party network/protocol to request from the
homeserver. Can only be used if `include_all_networks` is false.
example: irc
This is the `instance_id` of a `Protocol Instance` returned by
[`GET /_matrix/client/v3/thirdparty/protocols`](/client-server-api/#get_matrixclientv3thirdpartyprotocols).
example: irc-freenode
example: {
"limit": 10,
"filter": {
Expand All @@ -135,7 +141,7 @@ paths:
]
},
"include_all_networks": false,
"third_party_instance_id": "irc"
"third_party_instance_id": "irc-freenode"
}
description: Options for which rooms to return, or empty object to use defaults.
required: true
Expand Down

0 comments on commit 36fcb6b

Please sign in to comment.