mirror of
https://github.com/element-hq/element-web
synced 2024-11-26 11:15:53 +03:00
Fix and test matrix.to alias permalinks
Fixes https://github.com/vector-im/riot-web/issues/7614 Regression of https://github.com/matrix-org/matrix-react-sdk/pull/2250
This commit is contained in:
parent
0bd1d6b778
commit
3bc5e2beb3
2 changed files with 133 additions and 4 deletions
|
@ -24,8 +24,13 @@ export const baseUrl = `https://${host}`;
|
||||||
const MAX_SERVER_CANDIDATES = 3;
|
const MAX_SERVER_CANDIDATES = 3;
|
||||||
|
|
||||||
export function makeEventPermalink(roomId, eventId) {
|
export function makeEventPermalink(roomId, eventId) {
|
||||||
|
const permalinkBase = `${baseUrl}/#/${roomId}/${eventId}`;
|
||||||
|
|
||||||
|
// If the roomId isn't actually a room ID, don't try to list the servers.
|
||||||
|
// Aliases are already routable, and don't need extra information.
|
||||||
|
if (roomId[0] !== '!') return permalinkBase;
|
||||||
const serverCandidates = pickServerCandidates(roomId);
|
const serverCandidates = pickServerCandidates(roomId);
|
||||||
return `${baseUrl}/#/${roomId}/${eventId}?${encodeServerCandidates(serverCandidates)}`;
|
return `${permalinkBase}${encodeServerCandidates(serverCandidates)}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function makeUserPermalink(userId) {
|
export function makeUserPermalink(userId) {
|
||||||
|
@ -33,8 +38,14 @@ export function makeUserPermalink(userId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
export function makeRoomPermalink(roomId) {
|
export function makeRoomPermalink(roomId) {
|
||||||
|
const permalinkBase = `${baseUrl}/#/${roomId}`;
|
||||||
|
|
||||||
|
// If the roomId isn't actually a room ID, don't try to list the servers.
|
||||||
|
// Aliases are already routable, and don't need extra information.
|
||||||
|
if (roomId[0] !== '!') return permalinkBase;
|
||||||
|
|
||||||
const serverCandidates = pickServerCandidates(roomId);
|
const serverCandidates = pickServerCandidates(roomId);
|
||||||
return `${baseUrl}/#/${roomId}?${encodeServerCandidates(serverCandidates)}`;
|
return `${permalinkBase}${encodeServerCandidates(serverCandidates)}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function makeGroupPermalink(groupId) {
|
export function makeGroupPermalink(groupId) {
|
||||||
|
@ -43,7 +54,7 @@ export function makeGroupPermalink(groupId) {
|
||||||
|
|
||||||
export function encodeServerCandidates(candidates) {
|
export function encodeServerCandidates(candidates) {
|
||||||
if (!candidates) return '';
|
if (!candidates) return '';
|
||||||
return `via=${candidates.map(c => encodeURIComponent(c)).join("&via=")}`;
|
return `?via=${candidates.map(c => encodeURIComponent(c)).join("&via=")}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function pickServerCandidates(roomId) {
|
export function pickServerCandidates(roomId) {
|
||||||
|
|
|
@ -13,7 +13,13 @@ limitations under the License.
|
||||||
|
|
||||||
import expect from 'expect';
|
import expect from 'expect';
|
||||||
import peg from '../src/MatrixClientPeg';
|
import peg from '../src/MatrixClientPeg';
|
||||||
import {pickServerCandidates} from "../src/matrix-to";
|
import {
|
||||||
|
makeEventPermalink,
|
||||||
|
makeGroupPermalink,
|
||||||
|
makeRoomPermalink,
|
||||||
|
makeUserPermalink,
|
||||||
|
pickServerCandidates
|
||||||
|
} from "../src/matrix-to";
|
||||||
import * as testUtils from "./test-utils";
|
import * as testUtils from "./test-utils";
|
||||||
|
|
||||||
|
|
||||||
|
@ -228,4 +234,116 @@ describe('matrix-to', function() {
|
||||||
expect(pickedServers.length).toBe(1);
|
expect(pickedServers.length).toBe(1);
|
||||||
expect(pickedServers[0]).toBe("example.org:8448");
|
expect(pickedServers[0]).toBe("example.org:8448");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should generate an event permalink for room IDs with no candidate servers', function() {
|
||||||
|
peg.get().getRoom = () => null;
|
||||||
|
const result = makeEventPermalink("!somewhere:example.org", "$something:example.com");
|
||||||
|
expect(result).toBe("https://matrix.to/#/!somewhere:example.org/$something:example.com");
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should generate an event permalink for room IDs with some candidate servers', function() {
|
||||||
|
peg.get().getRoom = () => {
|
||||||
|
return {
|
||||||
|
getJoinedMembers: () => [
|
||||||
|
{
|
||||||
|
userId: "@alice:first",
|
||||||
|
powerLevel: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
userId: "@bob:second",
|
||||||
|
powerLevel: 0,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
};
|
||||||
|
const result = makeEventPermalink("!somewhere:example.org", "$something:example.com");
|
||||||
|
expect(result).toBe("https://matrix.to/#/!somewhere:example.org/$something:example.com?via=first&via=second");
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should generate a room permalink for room IDs with no candidate servers', function() {
|
||||||
|
peg.get().getRoom = () => null;
|
||||||
|
const result = makeRoomPermalink("!somewhere:example.org");
|
||||||
|
expect(result).toBe("https://matrix.to/#/!somewhere:example.org");
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should generate a room permalink for room IDs with some candidate servers', function() {
|
||||||
|
peg.get().getRoom = () => {
|
||||||
|
return {
|
||||||
|
getJoinedMembers: () => [
|
||||||
|
{
|
||||||
|
userId: "@alice:first",
|
||||||
|
powerLevel: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
userId: "@bob:second",
|
||||||
|
powerLevel: 0,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
};
|
||||||
|
const result = makeRoomPermalink("!somewhere:example.org");
|
||||||
|
expect(result).toBe("https://matrix.to/#/!somewhere:example.org?via=first&via=second");
|
||||||
|
});
|
||||||
|
|
||||||
|
// Technically disallowed but we'll test it anyways
|
||||||
|
it('should generate an event permalink for room aliases with no candidate servers', function() {
|
||||||
|
peg.get().getRoom = () => null;
|
||||||
|
const result = makeEventPermalink("#somewhere:example.org", "$something:example.com");
|
||||||
|
expect(result).toBe("https://matrix.to/#/#somewhere:example.org/$something:example.com");
|
||||||
|
});
|
||||||
|
|
||||||
|
// Technically disallowed but we'll test it anyways
|
||||||
|
it('should generate an event permalink for room aliases without candidate servers even when some are available', function() {
|
||||||
|
peg.get().getRoom = () => {
|
||||||
|
return {
|
||||||
|
getJoinedMembers: () => [
|
||||||
|
{
|
||||||
|
userId: "@alice:first",
|
||||||
|
powerLevel: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
userId: "@bob:second",
|
||||||
|
powerLevel: 0,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
};
|
||||||
|
const result = makeEventPermalink("#somewhere:example.org", "$something:example.com");
|
||||||
|
expect(result).toBe("https://matrix.to/#/#somewhere:example.org/$something:example.com");
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should generate a room permalink for room aliases with no candidate servers', function() {
|
||||||
|
peg.get().getRoom = () => null;
|
||||||
|
const result = makeRoomPermalink("#somewhere:example.org");
|
||||||
|
expect(result).toBe("https://matrix.to/#/#somewhere:example.org");
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should generate a room permalink for room aliases without candidate servers even when some are available', function() {
|
||||||
|
peg.get().getRoom = () => {
|
||||||
|
return {
|
||||||
|
getJoinedMembers: () => [
|
||||||
|
{
|
||||||
|
userId: "@alice:first",
|
||||||
|
powerLevel: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
userId: "@bob:second",
|
||||||
|
powerLevel: 0,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
};
|
||||||
|
const result = makeRoomPermalink("#somewhere:example.org");
|
||||||
|
expect(result).toBe("https://matrix.to/#/#somewhere:example.org");
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should generate a user permalink', function() {
|
||||||
|
const result = makeUserPermalink("@someone:example.org");
|
||||||
|
expect(result).toBe("https://matrix.to/#/@someone:example.org");
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should generate a group permalink', function() {
|
||||||
|
const result = makeGroupPermalink("+community:example.org");
|
||||||
|
expect(result).toBe("https://matrix.to/#/+community:example.org");
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue