@tagea/capacitor-matrix 0.0.2

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebPlugin } from '@capacitor/core';\nimport {\n createClient,\n ClientEvent,\n RoomEvent,\n RoomMemberEvent,\n Direction,\n MsgType,\n EventType,\n RelationType,\n UserEvent,\n} from 'matrix-js-sdk';\nimport { decodeRecoveryKey } from 'matrix-js-sdk/lib/crypto-api/recovery-key';\nimport { deriveRecoveryKeyFromPassphrase } from 'matrix-js-sdk/lib/crypto-api/key-passphrase';\nimport type { MatrixClient, Room, MatrixEvent as SdkMatrixEvent, User } from 'matrix-js-sdk';\n\nimport type {\n MatrixPlugin,\n LoginOptions,\n LoginWithTokenOptions,\n SessionInfo,\n SendMessageOptions,\n EditMessageOptions,\n SendReplyOptions,\n UploadContentOptions,\n UploadContentResult,\n ThumbnailUrlOptions,\n PusherOptions,\n DeviceInfo,\n MatrixEvent,\n RoomSummary,\n RoomMember,\n SyncState,\n EncryptionStatus,\n KeyBackupStatus,\n RecoveryKeyInfo,\n PresenceInfo,\n UserProfile,\n} from './definitions';\n\nconst SESSION_KEY = 'matrix_session';\n\nexport class MatrixWeb extends WebPlugin implements MatrixPlugin {\n private client?: MatrixClient;\n private secretStorageKey?: Uint8Array<ArrayBuffer>;\n private recoveryPassphrase?: string;\n\n private readonly _cryptoCallbacks = {\n getSecretStorageKey: async (\n opts: { keys: Record<string, unknown> },\n ): Promise<[string, Uint8Array<ArrayBuffer>] | null> => {\n const keyId = Object.keys(opts.keys)[0];\n if (!keyId) return null;\n\n // If we have the raw key cached, use it directly\n if (this.secretStorageKey) {\n return [keyId, this.secretStorageKey];\n }\n\n // If we have a passphrase, derive the key using the server's stored parameters\n if (this.recoveryPassphrase) {\n const keyInfo = opts.keys[keyId] as {\n passphrase?: { salt: string; iterations: number; bits?: number };\n };\n if (keyInfo?.passphrase) {\n const derived = await deriveRecoveryKeyFromPassphrase(\n this.recoveryPassphrase,\n keyInfo.passphrase.salt,\n keyInfo.passphrase.iterations,\n keyInfo.passphrase.bits ?? 256,\n );\n this.secretStorageKey = derived;\n return [keyId, derived];\n }\n }\n\n return null;\n },\n cacheSecretStorageKey: (\n _keyId: string,\n _keyInfo: unknown,\n key: Uint8Array<ArrayBuffer>,\n ): void => {\n this.secretStorageKey = key;\n },\n };\n\n // ── Auth ──────────────────────────────────────────────\n\n async login(options: LoginOptions): Promise<SessionInfo> {\n const tmpClient = createClient({ baseUrl: options.homeserverUrl });\n const res = await tmpClient.loginWithPassword(options.userId, options.password);\n\n this.client = createClient({\n baseUrl: options.homeserverUrl,\n accessToken: res.access_token,\n userId: res.user_id,\n deviceId: res.device_id,\n cryptoCallbacks: this._cryptoCallbacks,\n });\n\n const session: SessionInfo = {\n accessToken: res.access_token,\n userId: res.user_id,\n deviceId: res.device_id,\n homeserverUrl: options.homeserverUrl,\n };\n\n this.persistSession(session);\n return session;\n }\n\n async loginWithToken(options: LoginWithTokenOptions): Promise<SessionInfo> {\n this.client = createClient({\n baseUrl: options.homeserverUrl,\n accessToken: options.accessToken,\n userId: options.userId,\n deviceId: options.deviceId,\n cryptoCallbacks: this._cryptoCallbacks,\n });\n\n const session: SessionInfo = {\n accessToken: options.accessToken,\n userId: options.userId,\n deviceId: options.deviceId,\n homeserverUrl: options.homeserverUrl,\n };\n\n this.persistSession(session);\n return session;\n }\n\n async logout(): Promise<void> {\n if (this.client) {\n this.client.stopClient();\n try {\n await this.client.logout(true);\n } catch {\n // ignore logout errors (e.g. token already invalidated)\n }\n this.client = undefined;\n }\n localStorage.removeItem(SESSION_KEY);\n }\n\n async getSession(): Promise<SessionInfo | null> {\n const raw = localStorage.getItem(SESSION_KEY);\n if (!raw) return null;\n try {\n return JSON.parse(raw) as SessionInfo;\n } catch {\n return null;\n }\n }\n\n // ── Sync ──────────────────────────────────────────────\n\n async startSync(): Promise<void> {\n this.requireClient();\n\n this.client!.on(ClientEvent.Sync, (state, _prev, data) => {\n const mapped = this.mapSyncState(state);\n this.notifyListeners('syncStateChange', {\n state: mapped,\n error: data?.error?.message,\n });\n });\n\n this.client!.on(RoomEvent.Timeline, (event: SdkMatrixEvent, room: Room | undefined) => {\n this.notifyListeners('messageReceived', {\n event: this.serializeEvent(event, room?.roomId),\n });\n // When an encrypted event arrives, listen for decryption and re-notify\n if (event.isBeingDecrypted() || event.getType() === 'm.room.encrypted') {\n event.once('Event.decrypted' as any, () => {\n this.notifyListeners('messageReceived', {\n event: this.serializeEvent(event, room?.roomId),\n });\n });\n }\n // When a reaction or redaction arrives, re-emit the parent event with updated aggregated reactions\n if (event.getType() === EventType.Reaction || event.getType() === EventType.RoomRedaction) {\n const rel = event.getContent()?.['m.relates_to'];\n const targetId = rel?.event_id || event.getAssociatedId();\n if (targetId && room) {\n const targetEvent = room.findEventById(targetId);\n if (targetEvent) {\n // Small delay to let the SDK finish aggregation\n setTimeout(() => {\n this.notifyListeners('messageReceived', {\n event: this.serializeEvent(targetEvent, room.roomId),\n });\n }, 100);\n }\n }\n }\n });\n\n this.client!.on(RoomEvent.Receipt, (_event: SdkMatrixEvent, room: Room) => {\n this.notifyListeners('receiptReceived', {\n roomId: room.roomId,\n });\n // Re-emit own sent messages with updated read status\n const myUserId = this.client?.getUserId();\n if (myUserId) {\n const timeline = room.getLiveTimeline().getEvents();\n // Walk backwards through recent events; stop after checking a reasonable batch\n const limit = Math.min(timeline.length, 50);\n for (let i = timeline.length - 1; i >= timeline.length - limit; i--) {\n const evt = timeline[i];\n if (evt.getSender() !== myUserId) continue;\n const serialized = this.serializeEvent(evt, room.roomId);\n if (serialized.status === 'read') {\n this.notifyListeners('messageReceived', { event: serialized });\n }\n }\n }\n });\n\n this.client!.on(RoomEvent.Name, (room: Room) => {\n this.notifyListeners('roomUpdated', {\n roomId: room.roomId,\n summary: this.serializeRoom(room),\n });\n });\n\n this.client!.on(RoomMemberEvent.Typing, (_event: SdkMatrixEvent, member: any) => {\n const roomId = member?.roomId;\n if (roomId) {\n const room = this.client!.getRoom(roomId);\n if (room) {\n const typingEvent = room.currentState.getStateEvents('m.typing', '');\n const userIds: string[] = typingEvent?.getContent()?.user_ids ?? [];\n this.notifyListeners('typingChanged', { roomId, userIds });\n }\n }\n });\n\n this.client!.on(UserEvent.Presence, (_event: SdkMatrixEvent | undefined, user: User) => {\n this.notifyListeners('presenceChanged', {\n userId: user.userId,\n presence: {\n presence: (user.presence as PresenceInfo['presence']) ?? 'offline',\n statusMsg: user.presenceStatusMsg ?? undefined,\n lastActiveAgo: user.lastActiveAgo ?? undefined,\n },\n });\n });\n\n await this.client!.startClient({ initialSyncLimit: 20 });\n }\n\n async stopSync(): Promise<void> {\n this.requireClient();\n this.client!.stopClient();\n }\n\n async getSyncState(): Promise<{ state: SyncState }> {\n this.requireClient();\n const raw = this.client!.getSyncState();\n return { state: this.mapSyncState(raw) };\n }\n\n // ── Rooms ─────────────────────────────────────────────\n\n async createRoom(options: {\n name?: string;\n topic?: string;\n isEncrypted?: boolean;\n isDirect?: boolean;\n invite?: string[];\n preset?: 'private_chat' | 'trusted_private_chat' | 'public_chat';\n historyVisibility?: 'invited' | 'joined' | 'shared' | 'world_readable';\n }): Promise<{ roomId: string }> {\n this.requireClient();\n\n const createOpts: Record<string, unknown> = {\n visibility: 'private' as const,\n };\n if (options.name) createOpts.name = options.name;\n if (options.topic) createOpts.topic = options.topic;\n if (options.invite?.length) createOpts.invite = options.invite;\n if (options.preset) createOpts.preset = options.preset;\n if (options.isDirect) createOpts.is_direct = true;\n\n const initialState: Record<string, unknown>[] = [];\n if (options.isEncrypted) {\n initialState.push({\n type: 'm.room.encryption',\n state_key: '',\n content: { algorithm: 'm.megolm.v1.aes-sha2' },\n });\n }\n if (options.historyVisibility) {\n initialState.push({\n type: 'm.room.history_visibility',\n state_key: '',\n content: { history_visibility: options.historyVisibility },\n });\n }\n if (initialState.length > 0) {\n createOpts.initial_state = initialState;\n }\n\n const res = await this.client!.createRoom(createOpts);\n return { roomId: res.room_id };\n }\n\n async getRooms(): Promise<{ rooms: RoomSummary[] }> {\n this.requireClient();\n const rooms = this.client!.getRooms().map((r) => this.serializeRoom(r));\n return { rooms };\n }\n\n async getRoomMembers(options: { roomId: string }): Promise<{ members: RoomMember[] }> {\n this.requireClient();\n const room = this.client!.getRoom(options.roomId);\n if (!room) throw new Error(`Room ${options.roomId} not found`);\n\n await room.loadMembersIfNeeded();\n const members: RoomMember[] = room.getMembers().map((m) => ({\n userId: m.userId,\n displayName: m.name ?? undefined,\n membership: m.membership as RoomMember['membership'],\n avatarUrl: m.getMxcAvatarUrl() ?? undefined,\n }));\n\n return { members };\n }\n\n async joinRoom(options: { roomIdOrAlias: string }): Promise<{ roomId: string }> {\n this.requireClient();\n const room = await this.client!.joinRoom(options.roomIdOrAlias);\n return { roomId: room.roomId };\n }\n\n async leaveRoom(options: { roomId: string }): Promise<void> {\n this.requireClient();\n await this.client!.leave(options.roomId);\n }\n\n async forgetRoom(options: { roomId: string }): Promise<void> {\n this.requireClient();\n await this.client!.forget(options.roomId);\n }\n\n // ── Messaging ─────────────────────────────────────────\n\n async sendMessage(options: SendMessageOptions): Promise<{ eventId: string }> {\n this.requireClient();\n\n const msgtype = options.msgtype ?? 'm.text';\n const mediaTypes = ['m.image', 'm.audio', 'm.video', 'm.file'];\n\n if (mediaTypes.includes(msgtype) && options.fileUri) {\n // Media message: upload file then send\n const response = await fetch(options.fileUri);\n const blob = await response.blob();\n const uploadRes = await this.client!.uploadContent(blob, {\n name: options.fileName,\n type: options.mimeType,\n });\n const mxcUrl = uploadRes.content_uri;\n const content: Record<string, unknown> = {\n msgtype,\n body: options.body || options.fileName || 'file',\n url: mxcUrl,\n info: {\n mimetype: options.mimeType,\n size: options.fileSize ?? blob.size,\n },\n };\n const res = await this.client!.sendMessage(options.roomId, content as any);\n return { eventId: res.event_id };\n }\n\n // Text message\n const msgtypeMap = {\n 'm.text': MsgType.Text,\n 'm.notice': MsgType.Notice,\n 'm.emote': MsgType.Emote,\n } as const;\n const mappedType = msgtypeMap[msgtype as keyof typeof msgtypeMap] ?? MsgType.Text;\n const res = await this.client!.sendMessage(options.roomId, {\n msgtype: mappedType,\n body: options.body,\n });\n return { eventId: res.event_id };\n }\n\n async editMessage(options: EditMessageOptions): Promise<{ eventId: string }> {\n this.requireClient();\n const content: Record<string, unknown> = {\n msgtype: MsgType.Text,\n body: `* ${options.newBody}`,\n 'm.new_content': {\n msgtype: MsgType.Text,\n body: options.newBody,\n },\n 'm.relates_to': {\n rel_type: 'm.replace',\n event_id: options.eventId,\n },\n };\n const res = await this.client!.sendMessage(options.roomId, content as any);\n return { eventId: res.event_id };\n }\n\n async sendReply(options: SendReplyOptions): Promise<{ eventId: string }> {\n this.requireClient();\n\n const msgtype = options.msgtype ?? 'm.text';\n const mediaTypes = ['m.image', 'm.audio', 'm.video', 'm.file'];\n\n let content: Record<string, unknown>;\n\n if (mediaTypes.includes(msgtype) && options.fileUri) {\n // Media reply: upload file then send with reply relation\n const response = await fetch(options.fileUri);\n const blob = await response.blob();\n const uploadRes = await this.client!.uploadContent(blob, {\n name: options.fileName,\n type: options.mimeType,\n });\n content = {\n msgtype,\n body: options.body || options.fileName || 'file',\n url: uploadRes.content_uri,\n info: {\n mimetype: options.mimeType,\n size: options.fileSize ?? blob.size,\n },\n 'm.relates_to': {\n 'm.in_reply_to': {\n event_id: options.replyToEventId,\n },\n },\n };\n } else {\n // Text reply\n content = {\n msgtype: MsgType.Text,\n body: options.body,\n 'm.relates_to': {\n 'm.in_reply_to': {\n event_id: options.replyToEventId,\n },\n },\n };\n }\n\n const res = await this.client!.sendMessage(options.roomId, content as any);\n return { eventId: res.event_id };\n }\n\n async getRoomMessages(\n options: { roomId: string; limit?: number; from?: string },\n ): Promise<{ events: MatrixEvent[]; nextBatch?: string }> {\n this.requireClient();\n\n const limit = options.limit ?? 20;\n const room = this.client!.getRoom(options.roomId);\n\n // If no explicit pagination token, return events from the synced timeline\n if (!options.from && room) {\n // Paginate backwards so we have enough events (initial sync may be small)\n try {\n await this.client!.scrollback(room, limit);\n } catch {\n // scrollback may fail if there's no more history\n }\n\n const timeline = room.getLiveTimeline();\n const timelineEvents = timeline.getEvents();\n // Filter out reactions and redactions before slicing — they're aggregated into parent events\n const displayableEvents = timelineEvents.filter((e) => {\n const t = e.getType();\n return t !== EventType.Reaction && t !== EventType.RoomRedaction;\n });\n const events: MatrixEvent[] = displayableEvents\n .slice(-limit)\n .map((e) => this.serializeEvent(e, options.roomId))\n .sort((a, b) => a.originServerTs - b.originServerTs);\n const backToken = timeline.getPaginationToken(Direction.Backward) ?? undefined;\n return { events, nextBatch: backToken };\n }\n\n // Paginate further back using the token\n const fromToken = options.from ?? null;\n const res = await this.client!.createMessagesRequest(\n options.roomId,\n fromToken,\n limit,\n Direction.Backward,\n );\n\n const events: MatrixEvent[] = (res.chunk ?? []).map((e) => ({\n eventId: e.event_id,\n roomId: options.roomId,\n senderId: e.sender,\n type: e.type,\n content: (e.content ?? {}) as Record<string, unknown>,\n originServerTs: e.origin_server_ts,\n }));\n\n return { events, nextBatch: res.end ?? undefined };\n }\n\n async markRoomAsRead(options: { roomId: string; eventId: string }): Promise<void> {\n this.requireClient();\n const room = this.client!.getRoom(options.roomId);\n if (room) {\n const event = room.findEventById(options.eventId);\n if (event) {\n await this.client!.sendReadReceipt(event);\n return;\n }\n }\n // Fallback to HTTP request if event not found locally\n await this.client!.setRoomReadMarkersHttpRequest(\n options.roomId,\n options.eventId,\n options.eventId,\n );\n }\n\n async refreshEventStatuses(options: { roomId: string; eventIds: string[] }): Promise<{ events: import('./definitions').MatrixEvent[] }> {\n this.requireClient();\n const room = this.client!.getRoom(options.roomId);\n if (!room) return { events: [] };\n const events: import('./definitions').MatrixEvent[] = [];\n for (const eid of options.eventIds) {\n const event = room.findEventById(eid);\n if (event) {\n events.push(this.serializeEvent(event, options.roomId));\n }\n }\n return { events };\n }\n\n // ── Redactions & Reactions ───────────────────────────────\n\n async redactEvent(options: { roomId: string; eventId: string; reason?: string }): Promise<void> {\n this.requireClient();\n await this.client!.redactEvent(options.roomId, options.eventId, undefined, {\n reason: options.reason,\n } as any);\n }\n\n async sendReaction(options: { roomId: string; eventId: string; key: string }): Promise<{ eventId: string }> {\n this.requireClient();\n const myUserId = this.client!.getUserId();\n\n // Check if the user already reacted with this key — if so, toggle off (redact)\n const room = this.client!.getRoom(options.roomId);\n if (room && myUserId) {\n try {\n const relations = room.relations.getChildEventsForEvent(\n options.eventId,\n RelationType.Annotation,\n EventType.Reaction,\n );\n if (relations) {\n const existing = relations.getRelations().find(\n (e) => e.getSender() === myUserId && e.getContent()?.['m.relates_to']?.key === options.key,\n );\n if (existing) {\n const existingId = existing.getId();\n if (existingId) {\n await this.client!.redactEvent(options.roomId, existingId);\n return { eventId: existingId };\n }\n }\n }\n } catch {\n // fall through to send\n }\n }\n\n const res = await this.client!.sendEvent(options.roomId, EventType.Reaction, {\n 'm.relates_to': {\n rel_type: RelationType.Annotation,\n event_id: options.eventId,\n key: options.key,\n },\n });\n return { eventId: res.event_id };\n }\n\n // ── Room Management ────────────────────────────────────\n\n async setRoomName(options: { roomId: string; name: string }): Promise<void> {\n this.requireClient();\n await this.client!.setRoomName(options.roomId, options.name);\n }\n\n async setRoomTopic(options: { roomId: string; topic: string }): Promise<void> {\n this.requireClient();\n await this.client!.setRoomTopic(options.roomId, options.topic);\n }\n\n async setRoomAvatar(options: { roomId: string; mxcUrl: string }): Promise<void> {\n this.requireClient();\n await this.client!.sendStateEvent(options.roomId, 'm.room.avatar' as any, { url: options.mxcUrl });\n }\n\n async inviteUser(options: { roomId: string; userId: string }): Promise<void> {\n this.requireClient();\n await this.client!.invite(options.roomId, options.userId);\n }\n\n async kickUser(options: { roomId: string; userId: string; reason?: string }): Promise<void> {\n this.requireClient();\n await this.client!.kick(options.roomId, options.userId, options.reason);\n }\n\n async banUser(options: { roomId: string; userId: string; reason?: string }): Promise<void> {\n this.requireClient();\n await this.client!.ban(options.roomId, options.userId, options.reason);\n }\n\n async unbanUser(options: { roomId: string; userId: string }): Promise<void> {\n this.requireClient();\n await this.client!.unban(options.roomId, options.userId);\n }\n\n // ── Typing ─────────────────────────────────────────────\n\n async sendTyping(options: { roomId: string; isTyping: boolean; timeout?: number }): Promise<void> {\n this.requireClient();\n await this.client!.sendTyping(options.roomId, options.isTyping, options.timeout ?? 30000);\n }\n\n // ── Media ──────────────────────────────────────────────\n\n async getMediaUrl(options: { mxcUrl: string }): Promise<{ httpUrl: string }> {\n this.requireClient();\n // Use the authenticated media endpoint (Matrix v1.11+)\n const mxcPath = options.mxcUrl.replace('mxc://', '');\n const baseUrl = this.client!.getHomeserverUrl().replace(/\\/$/, '');\n const accessToken = this.client!.getAccessToken();\n const httpUrl = `${baseUrl}/_matrix/client/v1/media/download/${mxcPath}?access_token=${accessToken}`;\n return { httpUrl };\n }\n\n async getThumbnailUrl(options: ThumbnailUrlOptions): Promise<{ httpUrl: string }> {\n this.requireClient();\n const mxcPath = options.mxcUrl.replace('mxc://', '');\n const baseUrl = this.client!.getHomeserverUrl().replace(/\\/$/, '');\n const accessToken = this.client!.getAccessToken();\n const method = options.method ?? 'scale';\n const httpUrl = `${baseUrl}/_matrix/client/v1/media/thumbnail/${mxcPath}?width=${options.width}&height=${options.height}&method=${method}&access_token=${accessToken}`;\n return { httpUrl };\n }\n\n async uploadContent(options: UploadContentOptions): Promise<UploadContentResult> {\n this.requireClient();\n const response = await fetch(options.fileUri);\n const blob = await response.blob();\n const res = await this.client!.uploadContent(blob, {\n name: options.fileName,\n type: options.mimeType,\n });\n return { contentUri: res.content_uri };\n }\n\n // ── Presence ───────────────────────────────────────────\n\n async setPresence(options: { presence: 'online' | 'offline' | 'unavailable'; statusMsg?: string }): Promise<void> {\n this.requireClient();\n await this.client!.setPresence({\n presence: options.presence,\n status_msg: options.statusMsg,\n });\n }\n\n async getPresence(options: { userId: string }): Promise<PresenceInfo> {\n this.requireClient();\n const user = this.client!.getUser(options.userId);\n return {\n presence: (user?.presence as PresenceInfo['presence']) ?? 'offline',\n statusMsg: user?.presenceStatusMsg ?? undefined,\n lastActiveAgo: user?.lastActiveAgo ?? undefined,\n };\n }\n\n // ── Device Management ──────────────────────────────────\n\n async getDevices(): Promise<{ devices: DeviceInfo[] }> {\n this.requireClient();\n const res = await this.client!.getDevices();\n const devices: DeviceInfo[] = (res.devices ?? []).map((d: any) => ({\n deviceId: d.device_id,\n displayName: d.display_name ?? undefined,\n lastSeenTs: d.last_seen_ts ?? undefined,\n lastSeenIp: d.last_seen_ip ?? undefined,\n }));\n return { devices };\n }\n\n async deleteDevice(options: { deviceId: string; auth?: Record<string, unknown> }): Promise<void> {\n this.requireClient();\n await this.client!.deleteDevice(options.deviceId, options.auth as any);\n }\n\n // ── Push ──────────────────────────────────────────────\n\n async setPusher(options: PusherOptions): Promise<void> {\n this.requireClient();\n await this.client!.setPusher({\n pushkey: options.pushkey,\n kind: options.kind ?? undefined,\n app_id: options.appId,\n app_display_name: options.appDisplayName,\n device_display_name: options.deviceDisplayName,\n lang: options.lang,\n data: options.data,\n } as any);\n }\n\n // ── Encryption ──────────────────────────────────────────\n\n async initializeCrypto(): Promise<void> {\n this.requireClient();\n const userId = this.client!.getUserId();\n const deviceId = this.client!.getDeviceId();\n await this.client!.initRustCrypto({\n cryptoDatabasePrefix: `matrix-js-sdk/${userId}/${deviceId}`,\n });\n }\n\n async getEncryptionStatus(): Promise<EncryptionStatus> {\n this.requireClient();\n const crypto = this.client!.getCrypto();\n if (!crypto) {\n return {\n isCrossSigningReady: false,\n crossSigningStatus: { hasMaster: false, hasSelfSigning: false, hasUserSigning: false, isReady: false },\n isKeyBackupEnabled: false,\n isSecretStorageReady: false,\n };\n }\n\n const csReady = await crypto.isCrossSigningReady();\n const csStatus = await crypto.getCrossSigningStatus();\n const backupVersion = await crypto.getActiveSessionBackupVersion();\n\n // Use getSecretStorageStatus().defaultKeyId to check if secret storage was\n // set up at all, rather than isSecretStorageReady() which also checks that\n // cross-signing keys are stored (too strict for Phase 1).\n const ssStatus = await crypto.getSecretStorageStatus();\n const ssHasKey = ssStatus.defaultKeyId !== null;\n\n return {\n isCrossSigningReady: csReady,\n crossSigningStatus: {\n hasMaster: csStatus.publicKeysOnDevice,\n hasSelfSigning: csStatus.privateKeysCachedLocally.selfSigningKey,\n hasUserSigning: csStatus.privateKeysCachedLocally.userSigningKey,\n isReady: csReady,\n },\n isKeyBackupEnabled: backupVersion !== null,\n keyBackupVersion: backupVersion ?? undefined,\n isSecretStorageReady: ssHasKey,\n };\n }\n\n async bootstrapCrossSigning(): Promise<void> {\n const crypto = await this.ensureCrypto();\n await crypto.bootstrapCrossSigning({\n setupNewCrossSigning: true,\n authUploadDeviceSigningKeys: async (makeRequest) => {\n // UIA flow: attempt with dummy auth, fall back to session-based retry\n try {\n await makeRequest({ type: 'm.login.dummy' });\n } catch (e: any) {\n const session = e?.data?.session;\n if (session) {\n await makeRequest({ type: 'm.login.dummy', session });\n } else {\n throw e;\n }\n }\n },\n });\n }\n\n async setupKeyBackup(): Promise<KeyBackupStatus> {\n const crypto = await this.ensureCrypto();\n await crypto.resetKeyBackup();\n const version = await crypto.getActiveSessionBackupVersion();\n return { exists: true, version: version ?? undefined, enabled: true };\n }\n\n async getKeyBackupStatus(): Promise<KeyBackupStatus> {\n this.requireClient();\n const crypto = this.requireCrypto();\n const version = await crypto.getActiveSessionBackupVersion();\n return {\n exists: version !== null,\n version: version ?? undefined,\n enabled: version !== null,\n };\n }\n\n async restoreKeyBackup(_options?: { recoveryKey?: string }): Promise<{ importedKeys: number }> {\n this.requireClient();\n const crypto = this.requireCrypto();\n\n const result = await crypto.restoreKeyBackup();\n return { importedKeys: result?.imported ?? 0 };\n }\n\n async setupRecovery(options?: { passphrase?: string }): Promise<RecoveryKeyInfo> {\n const crypto = await this.ensureCrypto();\n\n const keyInfo = await crypto.createRecoveryKeyFromPassphrase(options?.passphrase);\n this.secretStorageKey = keyInfo.privateKey;\n\n await crypto.bootstrapSecretStorage({\n createSecretStorageKey: async () => keyInfo,\n setupNewSecretStorage: true,\n setupNewKeyBackup: true,\n });\n\n return { recoveryKey: keyInfo.encodedPrivateKey ?? '' };\n }\n\n async isRecoveryEnabled(): Promise<{ enabled: boolean }> {\n const crypto = await this.ensureCrypto();\n const ready = await crypto.isSecretStorageReady();\n return { enabled: ready };\n }\n\n async recoverAndSetup(options: { recoveryKey?: string; passphrase?: string }): Promise<void> {\n const crypto = await this.ensureCrypto();\n\n // Derive/decode the secret storage key\n if (options.recoveryKey) {\n this.secretStorageKey = decodeRecoveryKey(options.recoveryKey);\n } else if (options.passphrase) {\n // Store passphrase — the getSecretStorageKey callback will derive\n // the key using the server's stored PBKDF2 params (salt, iterations)\n this.recoveryPassphrase = options.passphrase;\n this.secretStorageKey = undefined; // Clear any stale raw key\n } else {\n throw new Error('Either recoveryKey or passphrase must be provided');\n }\n\n // Load the backup decryption key from secret storage into the Rust crypto store.\n // This triggers the getSecretStorageKey callback.\n try {\n await crypto.loadSessionBackupPrivateKeyFromSecretStorage();\n } catch (e) {\n // Clear stale key material so the next attempt starts fresh\n this.secretStorageKey = undefined;\n this.recoveryPassphrase = undefined;\n throw e;\n }\n\n // Now that the key is stored locally, activate backup in the running client\n await crypto.checkKeyBackupAndEnable();\n }\n\n async resetRecoveryKey(options?: { passphrase?: string }): Promise<RecoveryKeyInfo> {\n return this.setupRecovery(options);\n }\n\n async exportRoomKeys(options: { passphrase: string }): Promise<{ data: string }> {\n this.requireClient();\n const crypto = this.requireCrypto();\n const keys = await crypto.exportRoomKeysAsJson();\n // The exported JSON is not encrypted by default; for passphrase encryption\n // the caller should handle it, or we return the raw JSON\n void options.passphrase; // passphrase encryption is handled natively; on web we return raw\n return { data: keys };\n }\n\n async importRoomKeys(options: { data: string; passphrase: string }): Promise<{ importedKeys: number }> {\n this.requireClient();\n const crypto = this.requireCrypto();\n void options.passphrase; // passphrase decryption handled natively; on web we import raw\n await crypto.importRoomKeysAsJson(options.data);\n return { importedKeys: -1 }; // count not available from importRoomKeysAsJson\n }\n\n // ── Helpers ───────────────────────────────────────────\n\n private requireClient(): void {\n if (!this.client) {\n throw new Error('Not logged in. Call login() or loginWithToken() first.');\n }\n }\n\n private requireCrypto() {\n const crypto = this.client!.getCrypto();\n if (!crypto) {\n throw new Error('Crypto not initialized. Call initializeCrypto() first.');\n }\n return crypto;\n }\n\n private async ensureCrypto() {\n this.requireClient();\n if (!this.client!.getCrypto()) {\n await this.initializeCrypto();\n }\n return this.requireCrypto();\n }\n\n private persistSession(session: SessionInfo): void {\n localStorage.setItem(SESSION_KEY, JSON.stringify(session));\n }\n\n private serializeEvent(event: SdkMatrixEvent, fallbackRoomId?: string): MatrixEvent {\n const roomId = event.getRoomId() ?? fallbackRoomId ?? '';\n\n // Redacted events should be marked clearly\n if (event.isRedacted()) {\n return {\n eventId: event.getId() ?? '',\n roomId,\n senderId: event.getSender() ?? '',\n type: 'm.room.redaction',\n content: { body: 'Message deleted' },\n originServerTs: event.getTs(),\n };\n }\n\n const content = { ...(event.getContent() ?? {}) } as Record<string, unknown>;\n\n // Include aggregated reactions from the room's relations container\n const eventId = event.getId();\n if (eventId && roomId) {\n const room = this.client?.getRoom(roomId);\n if (room) {\n try {\n const relations = room.relations.getChildEventsForEvent(\n eventId,\n RelationType.Annotation,\n EventType.Reaction,\n );\n if (relations) {\n const sorted = relations.getSortedAnnotationsByKey();\n if (sorted && sorted.length > 0) {\n content.reactions = sorted.map(([key, events]) => ({\n key,\n count: events.size,\n senders: Array.from(events).map((e) => e.getSender()),\n }));\n }\n }\n } catch {\n // relations may not be available\n }\n }\n }\n\n // Determine delivery/read status\n let status: MatrixEvent['status'];\n const readBy: string[] = [];\n const myUserId = this.client?.getUserId();\n const sender = event.getSender();\n const room = eventId && roomId ? this.client?.getRoom(roomId) : undefined;\n\n if (sender === myUserId && eventId) {\n // Own message — check delivery status\n const evtStatus = event.status; // null = sent & echoed, 'sending', 'sent', etc.\n if (evtStatus === 'sending' || evtStatus === 'encrypting' || evtStatus === 'queued') {\n status = 'sending';\n } else {\n // Event is at least sent; check if anyone has read it\n if (room) {\n try {\n const members = room.getJoinedMembers();\n for (const member of members) {\n if (member.userId === myUserId) continue;\n if (room.hasUserReadEvent(member.userId, eventId)) {\n readBy.push(member.userId);\n }\n }\n } catch {\n // ignore errors\n }\n }\n status = readBy.length > 0 ? 'read' : 'sent';\n }\n } else if (eventId && room) {\n // Other's message — collect who has read it\n try {\n const members = room.getJoinedMembers();\n for (const member of members) {\n if (member.userId === sender) continue;\n if (room.hasUserReadEvent(member.userId, eventId)) {\n readBy.push(member.userId);\n }\n }\n } catch {\n // ignore\n }\n }\n\n // Include unsigned data (e.g. m.relations for edits, transaction_id for local echo)\n const unsignedData = event.getUnsigned?.();\n const unsigned = unsignedData && Object.keys(unsignedData).length > 0\n ? (unsignedData as Record<string, unknown>)\n : undefined;\n\n return {\n eventId: eventId ?? '',\n roomId,\n senderId: sender ?? '',\n type: event.getType(),\n content,\n originServerTs: event.getTs(),\n status,\n readBy: readBy.length > 0 ? readBy : undefined,\n unsigned,\n };\n }\n\n private serializeRoom(room: Room): RoomSummary {\n // Detect DM: check m.direct account data or guess from room state\n let isDirect = false;\n try {\n const directEvent = this.client?.getAccountData('m.direct' as any);\n if (directEvent) {\n const directContent = directEvent.getContent() as Record<string, string[]>;\n for (const roomIds of Object.values(directContent)) {\n if (roomIds.includes(room.roomId)) {\n isDirect = true;\n break;\n }\n }\n }\n } catch {\n // ignore\n }\n\n // Get avatar URL\n let avatarUrl: string | undefined;\n const avatarEvent = room.currentState.getStateEvents('m.room.avatar', '');\n if (avatarEvent) {\n const mxcUrl = avatarEvent.getContent()?.url as string | undefined;\n if (mxcUrl) {\n avatarUrl = mxcUrl;\n }\n }\n\n return {\n roomId: room.roomId,\n name: room.name,\n topic: room.currentState.getStateEvents('m.room.topic', '')?.getContent()?.topic ?? undefined,\n memberCount: room.getJoinedMemberCount(),\n isEncrypted: room.hasEncryptionStateEvent(),\n unreadCount: room.getUnreadNotificationCount() ?? 0,\n lastEventTs: room.getLastActiveTimestamp() || undefined,\n membership: room.getMyMembership() as RoomSummary['membership'],\n avatarUrl,\n isDirect,\n };\n }\n\n async searchUsers(options: {\n searchTerm: string;\n limit?: number;\n }): Promise<{ results: UserProfile[]; limited: boolean }> {\n this.requireClient();\n const resp = await this.client!.searchUserDirectory({\n term: options.searchTerm,\n limit: options.limit ?? 10,\n });\n return {\n results: resp.results.map((u: { user_id: string; display_name?: string; avatar_url?: string }) => ({\n userId: u.user_id,\n displayName: u.display_name,\n avatarUrl: u.avatar_url,\n })),\n limited: resp.limited,\n };\n }\n\n private mapSyncState(state: string | null): SyncState {\n switch (state) {\n case 'PREPARED':\n case 'SYNCING':\n case 'CATCHUP':\n case 'RECONNECTING':\n return 'SYNCING';\n case 'ERROR':\n return 'ERROR';\n case 'STOPPED':\n return 'STOPPED';\n default:\n return 'INITIAL';\n }\n }\n}\n"]}