You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

91 lines
4.0 KiB
JavaScript

3 years ago
"use strict";
const matchValue = require("match-value");
const supportsColor = require("supports-color").stderr;
let unmappedTypes = new Set([
"im.vector.setting.breadcrumbs",
"im.vector.setting.integration_provisioning",
"im.vector.riot.breadcrumb_rooms", // Room selection history?
"im.vector.web.settings",
"m.room.bot.options", // Missing from spec: https://github.com/matrix-org/matrix-doc/issues/1409
"opsdroid.database",
"m.room.third_party_invite", // FIXME
"m.room.tombstone", // FIXME
"m.room.bridging", // FIXME
"m.room.plumbing", // FIXME
"org.matrix.room.preview_urls", // FIXME
"im.vector.modular.widgets", // FIXME?
":type", // FIXME: Temporary hack to work around invalid test event, until we have unknown-event-type warning infrastructure in place
]);
module.exports = function mapEvent(event, context) {
// FIXME: Allow customization of this through a factor that accepts additional/overriding event mappers for different types; prefix those additional entries so that they take precedence over the default ones
let mapper = matchValue.literal(event.type, {
"m.room.message": require("../map-message-event"),
"m.sticker": require("../map-message-event"), // This is really just an m.image-like message, so we handle it in one place
"m.room.member": require("../map-member-event"),
"m.room.encrypted": require("../map-encrypted-message-event"),
"m.room.name": require("../map-room-name-event"),
"m.room.topic": require("../map-topic-event"),
"m.room.canonical_alias": require("../map-canonical-alias-event"),
"m.presence": require("../map-presence-event"),
"m.receipt": require("../map-receipt-event"),
"m.typing": require("../map-typing-event"),
"m.fully_read": require("../map-fully-read-event"),
"m.tag": require("../map-tag-event"),
"m.push_rules": require("../map-push-rules-event"),
"m.room.encryption": require("../map-encryption-event"),
"m.secret_storage.default_key": require("../map-secret-storage-default-key-event"),
"m.cross_signing.master": require("../map-cross-signing-master-event"),
"m.cross_signing.user_signing": require("../map-cross-signing-user-signing-event"),
"m.cross_signing.self_signing": require("../map-cross-signing-self-signing-event"),
"m.megolm_backup.v1": require("../map-megolm-backup-v1-event"),
"m.room_key_request": require("../map-key-request-event"),
"m.direct": require("../map-direct-event"),
"m.reaction": require("../map-reaction-event"),
"m.room.create": require("../map-room-create-event"), // FIXME: Tombstones
"m.room.power_levels": require("../map-power-levels-event"),
"m.room.history_visibility": require("../map-history-visibility-event"),
"m.room.join_rules": require("../map-join-rules-event"),
"m.room.guest_access": require("../map-guest-access-event"),
"m.room.avatar": require("../map-room-avatar-event"),
"m.room.related_groups": require("../map-related-groups-event"),
"m.room.redaction": require("../map-redaction-event"),
"m.room.server_acl": require("../map-server-acl-event"),
_: (event, context) => {
function call(mapper) {
return mapper(event, context);
}
// Workarounds for API design hacks (eg. keyed event types for account data)
if (event.type.startsWith("m.secret_storage.key.")) {
return call(require("../map-secret-storage-key-event"));
} else {
return event;
}
}
});
let mappedEvent = mapper(event, context);
if (mappedEvent === event && !unmappedTypes.has(event.type)) {
throw new Error(`Event was not mapped: ${require("util").inspect(event, { depth: null, colors: supportsColor })}`);
}
let tests = [
// (event.type === "m.room.message" && event.content.msgtype === "m.image"),
// (event.type === "m.reaction"),
(event.type === "m.room.notice"),
];
if (tests.some((result) => result === true)) {
// if (event.type.startsWith("m.secret_storage.key.")) {
// if (event.type === "m.cross_signing.master") {
console.log("mapped event:", require("util").inspect(mappedEvent, { colors: supportsColor, depth: null }));
throw new Error(`Break`);
}
return mappedEvent;
};