@rapidmx/web-client 0.21.0 → 0.22.0
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.
- package/README.md +48 -14
- package/apps/admin/_layout.tsx +2 -2
- package/apps/admin/audit-log/index.tsx +4 -4
- package/apps/admin/branding/index.tsx +3 -3
- package/apps/admin/data-requests/index.tsx +8 -8
- package/apps/admin/distribution-lists/[uid].tsx +3 -3
- package/apps/admin/distribution-lists/index.tsx +4 -4
- package/apps/admin/distribution-lists/new/index.tsx +5 -5
- package/apps/admin/domains/[uid].tsx +6 -6
- package/apps/admin/domains/index.tsx +4 -4
- package/apps/admin/domains/new/index.tsx +5 -5
- package/apps/admin/encryption-policy/index.tsx +1 -1
- package/apps/admin/escrow-scopes/[uid].tsx +7 -7
- package/apps/admin/escrow-scopes/index.tsx +4 -4
- package/apps/admin/escrow-scopes/new/index.tsx +5 -5
- package/apps/admin/index.tsx +6 -6
- package/apps/admin/ingest-queue/index.tsx +4 -4
- package/apps/admin/mailbox-policy/index.tsx +1 -1
- package/apps/admin/mailboxes/[uid].tsx +5 -5
- package/apps/admin/quarantine/index.tsx +5 -5
- package/apps/admin/retention-policy/index.tsx +3 -3
- package/apps/admin/signing-certificates/index.tsx +5 -5
- package/apps/admin/transport-rules/[uid].tsx +5 -5
- package/apps/admin/transport-rules/_transportRuleConfig.tsx +3 -3
- package/apps/admin/transport-rules/index.tsx +4 -4
- package/apps/admin/transport-rules/new/index.tsx +5 -5
- package/apps/escrow/_layout.tsx +1 -1
- package/apps/escrow/audit-log/index.tsx +4 -4
- package/apps/escrow/index.tsx +4 -4
- package/apps/escrow/matters/[uid].tsx +10 -10
- package/apps/escrow/matters/new/index.tsx +6 -6
- package/apps/shared/appearance/AppearanceForm.tsx +3 -3
- package/apps/shared/appearance/AppearanceHead.tsx +1 -1
- package/apps/shared/appearance/AppearanceProvider.tsx +3 -3
- package/apps/shared/appearance/appearanceCache.ts +1 -1
- package/apps/shared/appearance/appearanceContext.ts +1 -1
- package/apps/shared/appearance/theme.ts +1 -1
- package/apps/shared/auth/adminAccess.ts +1 -1
- package/apps/shared/calendar/bookingPlugin.ts +1 -1
- package/apps/shared/calendar/calendarLiveUpdates.ts +1 -1
- package/apps/shared/calendar/calendarReminders.ts +1 -1
- package/apps/shared/calendar/useCalendarReminders.ts +1 -1
- package/apps/shared/components/admin/diagnostics/DiagnosticsManager.tsx +1 -1
- package/apps/shared/components/admin/diagnostics/InstalledPlugins.tsx +2 -2
- package/apps/shared/components/admin/diagnostics/LogsPanel.tsx +2 -2
- package/apps/shared/components/admin/diagnostics/PackagesTable.tsx +1 -1
- package/apps/shared/components/admin/diagnostics/RuntimePanel.tsx +1 -1
- package/apps/shared/components/admin/diagnostics/SystemPanel.tsx +2 -2
- package/apps/shared/components/admin/diagnostics/VersionsPanel.tsx +1 -1
- package/apps/shared/components/admin/diagnostics/diagnosticsApi.ts +1 -1
- package/apps/shared/components/admin/diagnostics/format.ts +1 -1
- package/apps/shared/components/admin/diagnostics/logClient.ts +1 -1
- package/apps/shared/components/admin/distributionLists/MemberListCard.tsx +4 -4
- package/apps/shared/components/admin/elevation.ts +1 -1
- package/apps/shared/components/admin/escrowScopes/EscrowScopeKeyAndHoldersFields.tsx +3 -3
- package/apps/shared/components/admin/layout/AdminShell.tsx +8 -8
- package/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.tsx +6 -6
- package/apps/shared/components/admin/mailboxes/EscrowScopeCard.tsx +10 -8
- package/apps/shared/components/admin/mailboxes/LeftoverMailboxesSection.tsx +4 -4
- package/apps/shared/components/admin/mailboxes/MailboxTable.tsx +1 -1
- package/apps/shared/components/admin/mailboxes/ResourceSettingsCard.tsx +19 -14
- package/apps/shared/components/admin/mailboxes/ShareAccessCard.tsx +5 -5
- package/apps/shared/components/admin/settings/BrandingForm.tsx +5 -5
- package/apps/shared/components/admin/settings/DomainDnsSetup.tsx +5 -5
- package/apps/shared/components/admin/settings/EncryptionPolicyForm.tsx +4 -4
- package/apps/shared/components/admin/settings/LoadedSettingsForm.tsx +2 -2
- package/apps/shared/components/admin/settings/MailboxCreateForm.tsx +32 -27
- package/apps/shared/components/admin/settings/MailboxPolicyForm.tsx +4 -4
- package/apps/shared/components/admin/settings/PluginsManager.tsx +5 -5
- package/apps/shared/components/admin/settings/RetentionPolicyForm.tsx +5 -5
- package/apps/shared/components/admin/setup/EscrowSetupStep.tsx +7 -7
- package/apps/shared/components/admin/setup/SetupWizard.tsx +27 -23
- package/apps/shared/components/admin/signOut.ts +1 -1
- package/apps/shared/components/admin/usePagedList.tsx +2 -2
- package/apps/shared/components/calendar/AppointmentQuickForm.tsx +3 -3
- package/apps/shared/components/calendar/CalendarListSidebar.tsx +3 -3
- package/apps/shared/components/calendar/DescriptionEditor.tsx +1 -1
- package/apps/shared/components/calendar/EventDescriptionView.tsx +1 -1
- package/apps/shared/components/calendar/EventDetails.tsx +16 -14
- package/apps/shared/components/calendar/EventEditor.tsx +54 -39
- package/apps/shared/components/calendar/EventExpandedForm.tsx +3 -3
- package/apps/shared/components/calendar/EventFormParts.tsx +2 -2
- package/apps/shared/components/calendar/EventModal.tsx +5 -5
- package/apps/shared/components/calendar/EventQuickForm.tsx +3 -3
- package/apps/shared/components/calendar/EventShell.tsx +1 -1
- package/apps/shared/components/calendar/FindATime.tsx +6 -4
- package/apps/shared/components/calendar/GuestInput.tsx +2 -2
- package/apps/shared/components/calendar/MonthView.tsx +2 -2
- package/apps/shared/components/calendar/QuickCreateFaces.tsx +1 -1
- package/apps/shared/components/calendar/QuickFaceFrame.tsx +1 -1
- package/apps/shared/components/calendar/RecurrenceEditor.tsx +2 -2
- package/apps/shared/components/calendar/RequestChangeForm.tsx +8 -6
- package/apps/shared/components/calendar/ResourcePicker.tsx +7 -5
- package/apps/shared/components/calendar/SplitDayView.tsx +1 -1
- package/apps/shared/components/calendar/TaskQuickForm.tsx +23 -18
- package/apps/shared/components/calendar/TimeGridView.tsx +2 -2
- package/apps/shared/components/calendar/allDay.ts +2 -2
- package/apps/shared/components/calendar/eventDialogFields.ts +3 -3
- package/apps/shared/components/calendar/eventForm.ts +3 -3
- package/apps/shared/components/calendar/eventFormat.ts +3 -3
- package/apps/shared/components/calendar/findTimeGrid.ts +2 -2
- package/apps/shared/components/calendar/layout/CalendarShell.tsx +11 -9
- package/apps/shared/components/contacts/ContactDetailPane.tsx +4 -4
- package/apps/shared/components/contacts/ContactForm.tsx +27 -17
- package/apps/shared/components/contacts/ContactsSidebar.tsx +7 -5
- package/apps/shared/components/contacts/KeyChangeReview.tsx +5 -5
- package/apps/shared/components/contacts/contactKeys.ts +3 -3
- package/apps/shared/components/contacts/layout/ContactsShell.tsx +9 -7
- package/apps/shared/components/escrow/layout/EscrowShell.tsx +6 -6
- package/apps/shared/components/forms/StringListField.tsx +1 -1
- package/apps/shared/components/layout/AppShell.tsx +12 -10
- package/apps/shared/components/layout/BrandingChrome.tsx +1 -1
- package/apps/shared/components/layout/KeyEnrollmentGate.tsx +9 -9
- package/apps/shared/components/layout/MailboxProvisioning.tsx +8 -6
- package/apps/shared/components/layout/RecoveryCodeUnlock.tsx +9 -9
- package/apps/shared/components/layout/ThemeSwitch.tsx +1 -1
- package/apps/shared/components/layout/UnlockPromptProvider.tsx +6 -6
- package/apps/shared/components/layout/UserMenu.tsx +6 -4
- package/apps/shared/components/mail/ConversationList.tsx +7 -5
- package/apps/shared/components/mail/ConversationThreadPane.tsx +26 -15
- package/apps/shared/components/mail/InviteCard.tsx +11 -9
- package/apps/shared/components/mail/LazyReadingPane.tsx +2 -2
- package/apps/shared/components/mail/MailAddress.tsx +1 -1
- package/apps/shared/components/mail/MailListToolbar.tsx +2 -2
- package/apps/shared/components/mail/MailSelectionBar.tsx +2 -2
- package/apps/shared/components/mail/MenuButton.tsx +1 -1
- package/apps/shared/components/mail/MessageDetailPane.tsx +32 -30
- package/apps/shared/components/mail/MoveToFolderDialog.tsx +8 -6
- package/apps/shared/components/mail/OutboxRowStatus.tsx +1 -1
- package/apps/shared/components/mail/PermanentDeleteDialog.tsx +2 -2
- package/apps/shared/components/mail/compose/ComposeContext.tsx +14 -3
- package/apps/shared/components/mail/compose/ComposeWindow.tsx +34 -30
- package/apps/shared/components/mail/compose/ComposeWindowPlaceholder.tsx +4 -4
- package/apps/shared/components/mail/compose/EmojiPicker.tsx +2 -2
- package/apps/shared/components/mail/compose/GifPicker.tsx +3 -3
- package/apps/shared/components/mail/compose/RecipientInput.tsx +1 -1
- package/apps/shared/components/mail/compose/ScheduleSendPicker.tsx +1 -1
- package/apps/shared/components/mail/compose/encryptionRequirement.ts +2 -2
- package/apps/shared/components/mail/compose/quotedBody.ts +5 -5
- package/apps/shared/components/mail/compose/recipients.ts +1 -1
- package/apps/shared/components/mail/invite/InviteRowChip.tsx +2 -2
- package/apps/shared/components/mail/invite/InviteRsvpPopover.tsx +9 -7
- package/apps/shared/components/mail/invite/InviteTimeline.tsx +1 -1
- package/apps/shared/components/mail/invite/ProposeTimeForm.tsx +2 -2
- package/apps/shared/components/mail/invite/inviteFormat.ts +2 -2
- package/apps/shared/components/mail/invite/inviteStore.ts +14 -6
- package/apps/shared/components/mail/labelMenu.tsx +9 -7
- package/apps/shared/components/mail/layout/MailShell.tsx +4 -4
- package/apps/shared/components/mail/listPreferences.ts +2 -2
- package/apps/shared/components/mail/pinnedSigners.ts +45 -19
- package/apps/shared/components/mail/reading/EncryptedBody.tsx +2 -2
- package/apps/shared/components/mail/reading/MessageBody.tsx +6 -6
- package/apps/shared/components/mail/reading/MessageCard.tsx +3 -3
- package/apps/shared/components/mail/reading/MessageSourceDialog.tsx +3 -3
- package/apps/shared/components/mail/reading/PendingMessageCard.tsx +1 -1
- package/apps/shared/components/mail/reading/bodyContent.ts +3 -3
- package/apps/shared/components/mail/reading/bodyHtml.ts +1 -1
- package/apps/shared/components/mail/reading/messageExport.ts +1 -1
- package/apps/shared/components/mail/reading/printMessage.ts +2 -2
- package/apps/shared/components/mail/reading/useMessageActions.ts +28 -21
- package/apps/shared/components/mail/unreadStyle.tsx +1 -1
- package/apps/shared/components/mail/verificationSeals.ts +16 -12
- package/apps/shared/components/mail/writableMailboxes.ts +14 -7
- package/apps/shared/components/rules/RuleBuilder.tsx +1 -1
- package/apps/shared/components/settings/SigningCertificateCard.tsx +4 -4
- package/apps/shared/components/settings/layout/SettingsShell.tsx +8 -6
- package/apps/shared/components/sharing/PrincipalListField.tsx +1 -1
- package/apps/shared/components/sharing/PrincipalPicker.tsx +1 -1
- package/apps/shared/components/sharing/PrincipalResolver.tsx +4 -4
- package/apps/shared/components/tasks/TasksSidebar.tsx +7 -5
- package/apps/shared/components/tasks/layout/TasksShell.tsx +9 -7
- package/apps/shared/keyboard/ShortcutsDialog.tsx +1 -1
- package/apps/shared/mail/findWellKnownFolderUid.ts +6 -4
- package/apps/shared/mail/folderCounts.ts +8 -4
- package/apps/shared/mail/folderOfType.ts +5 -3
- package/apps/shared/mail/folderTree.ts +1 -1
- package/apps/shared/mail/listSnapshots.ts +2 -2
- package/apps/shared/mail/messageReadState.ts +6 -5
- package/apps/shared/mail/newMailNotifications.ts +2 -2
- package/apps/shared/mail/outbox/composeBridge.ts +2 -2
- package/apps/shared/mail/outbox/outboxState.ts +1 -1
- package/apps/shared/mail/outbox/outgoingReplies.ts +2 -2
- package/apps/shared/mail/outbox/sendDecision.ts +2 -2
- package/apps/shared/mail/outbox/sendJob.ts +40 -35
- package/apps/shared/mail/outbox/sendOutcomes.ts +20 -15
- package/apps/shared/mail/outbox/useOutboxStatus.ts +5 -3
- package/apps/shared/mail/permanentDelete.ts +8 -7
- package/apps/shared/mail/primaryMailbox.ts +1 -1
- package/apps/shared/mail/reportNotices.ts +1 -1
- package/apps/shared/mail/senderBlocking.ts +36 -20
- package/apps/shared/mail/useMailConnection.ts +12 -10
- package/apps/shared/mail/useMailLiveUpdates.ts +3 -3
- package/apps/shared/mail/useMailboxUpdateAccess.ts +35 -11
- package/apps/shared/mail/useMarkMessageRead.ts +14 -7
- package/apps/shared/mail/useNewMailNotifications.ts +1 -1
- package/apps/shared/mail/usePermanentDelete.tsx +5 -3
- package/apps/shared/navigation/pageTitle.ts +1 -1
- package/apps/shared/notifications/NotificationCenter.tsx +1 -1
- package/apps/shared/notifications/NotificationHistoryDialog.tsx +2 -2
- package/apps/shared/notifications/apiErrors.ts +2 -2
- package/apps/shared/notifications/pushStatus.ts +1 -1
- package/apps/shared/notifications/systemErrors.ts +1 -1
- package/apps/shared/search/LocalIndexLifecycle.tsx +18 -12
- package/apps/shared/search/crossMailboxSearch.ts +3 -3
- package/apps/shared/search/localIndexBuilder.ts +24 -12
- package/apps/shared/search/localIndexKey.ts +1 -1
- package/apps/shared/search/localIndexRpcClient.ts +150 -30
- package/apps/shared/search/localIndexTransport.ts +84 -0
- package/apps/shared/search/localIndexWorker.ts +1 -1
- package/apps/shared/search/searchTier2.ts +3 -3
- package/apps/shared/signing/enrollmentTracker.ts +3 -3
- package/apps/shared/signing/enrollmentView.ts +1 -1
- package/apps/shared/signing/signingInfo.ts +1 -1
- package/apps/shared/signing/useSigningEnrollmentWatcher.ts +6 -4
- package/apps/shared/styles/app.css +14 -23
- package/apps/www/_layout.tsx +2 -2
- package/apps/www/calendar/index.tsx +20 -18
- package/apps/www/contacts/[uid].tsx +8 -6
- package/apps/www/contacts/index.tsx +19 -17
- package/apps/www/index.tsx +57 -48
- package/apps/www/messages/[uid].tsx +11 -9
- package/apps/www/settings/auto-reply/index.tsx +6 -4
- package/apps/www/settings/blocked-senders/index.tsx +9 -7
- package/apps/www/settings/encryption/index.tsx +38 -32
- package/apps/www/settings/filters/[uid].tsx +19 -14
- package/apps/www/settings/filters/_mailFilterRuleConfig.tsx +2 -2
- package/apps/www/settings/filters/index.tsx +4 -4
- package/apps/www/settings/filters/new/index.tsx +10 -8
- package/apps/www/settings/labels/index.tsx +12 -10
- package/apps/www/settings/privacy/index.tsx +18 -14
- package/apps/www/settings/profile/index.tsx +16 -11
- package/apps/www/settings/read-receipts/index.tsx +17 -12
- package/apps/www/settings/sharing/index.tsx +6 -6
- package/apps/www/settings/signatures/[uid].tsx +5 -5
- package/apps/www/settings/signatures/index.tsx +4 -4
- package/apps/www/settings/signatures/new/index.tsx +4 -4
- package/apps/www/settings/signatures/signatureDefaults.ts +1 -1
- package/apps/www/tasks/index.tsx +28 -23
- package/dist/apps/admin/_layout.d.ts +1 -1
- package/dist/apps/admin/_layout.js +1 -1
- package/dist/apps/admin/audit-log/index.d.ts +1 -1
- package/dist/apps/admin/audit-log/index.js +4 -4
- package/dist/apps/admin/branding/index.js +3 -3
- package/dist/apps/admin/data-requests/index.js +8 -8
- package/dist/apps/admin/distribution-lists/[uid].js +3 -3
- package/dist/apps/admin/distribution-lists/index.js +4 -4
- package/dist/apps/admin/distribution-lists/new/index.js +5 -5
- package/dist/apps/admin/domains/[uid].js +6 -6
- package/dist/apps/admin/domains/index.js +4 -4
- package/dist/apps/admin/domains/new/index.js +5 -5
- package/dist/apps/admin/encryption-policy/index.js +1 -1
- package/dist/apps/admin/escrow-scopes/[uid].d.ts +1 -1
- package/dist/apps/admin/escrow-scopes/[uid].js +7 -7
- package/dist/apps/admin/escrow-scopes/index.js +4 -4
- package/dist/apps/admin/escrow-scopes/new/index.js +5 -5
- package/dist/apps/admin/index.js +6 -6
- package/dist/apps/admin/ingest-queue/index.js +4 -4
- package/dist/apps/admin/mailbox-policy/index.js +1 -1
- package/dist/apps/admin/mailboxes/[uid].js +5 -5
- package/dist/apps/admin/quarantine/index.js +5 -5
- package/dist/apps/admin/retention-policy/index.js +3 -3
- package/dist/apps/admin/signing-certificates/index.js +5 -5
- package/dist/apps/admin/transport-rules/[uid].js +5 -5
- package/dist/apps/admin/transport-rules/_transportRuleConfig.d.ts +1 -1
- package/dist/apps/admin/transport-rules/_transportRuleConfig.js +2 -2
- package/dist/apps/admin/transport-rules/index.js +4 -4
- package/dist/apps/admin/transport-rules/new/index.js +5 -5
- package/dist/apps/escrow/_layout.d.ts +1 -1
- package/dist/apps/escrow/audit-log/index.d.ts +1 -1
- package/dist/apps/escrow/audit-log/index.js +4 -4
- package/dist/apps/escrow/index.js +4 -4
- package/dist/apps/escrow/matters/[uid].js +10 -10
- package/dist/apps/escrow/matters/new/index.js +6 -6
- package/dist/apps/shared/appearance/AppearanceForm.js +3 -3
- package/dist/apps/shared/appearance/AppearanceHead.js +1 -1
- package/dist/apps/shared/appearance/AppearanceProvider.d.ts +1 -1
- package/dist/apps/shared/appearance/AppearanceProvider.js +3 -3
- package/dist/apps/shared/appearance/appearanceCache.d.ts +1 -1
- package/dist/apps/shared/appearance/appearanceCache.js +1 -1
- package/dist/apps/shared/appearance/appearanceContext.d.ts +1 -1
- package/dist/apps/shared/appearance/theme.d.ts +1 -1
- package/dist/apps/shared/auth/adminAccess.js +1 -1
- package/dist/apps/shared/calendar/bookingPlugin.js +1 -1
- package/dist/apps/shared/calendar/calendarLiveUpdates.d.ts +1 -1
- package/dist/apps/shared/calendar/calendarReminders.d.ts +1 -1
- package/dist/apps/shared/calendar/useCalendarReminders.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/DiagnosticsManager.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/InstalledPlugins.d.ts +1 -1
- package/dist/apps/shared/components/admin/diagnostics/InstalledPlugins.js +2 -2
- package/dist/apps/shared/components/admin/diagnostics/LogsPanel.js +2 -2
- package/dist/apps/shared/components/admin/diagnostics/PackagesTable.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/RuntimePanel.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/SystemPanel.js +2 -2
- package/dist/apps/shared/components/admin/diagnostics/VersionsPanel.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/diagnosticsApi.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/format.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/logClient.js +1 -1
- package/dist/apps/shared/components/admin/distributionLists/MemberListCard.d.ts +1 -1
- package/dist/apps/shared/components/admin/distributionLists/MemberListCard.js +4 -4
- package/dist/apps/shared/components/admin/elevation.js +1 -1
- package/dist/apps/shared/components/admin/escrowScopes/EscrowScopeKeyAndHoldersFields.js +3 -3
- package/dist/apps/shared/components/admin/layout/AdminShell.d.ts +1 -1
- package/dist/apps/shared/components/admin/layout/AdminShell.js +7 -7
- package/dist/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.d.ts +1 -1
- package/dist/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.js +6 -6
- package/dist/apps/shared/components/admin/mailboxes/EscrowScopeCard.d.ts +1 -1
- package/dist/apps/shared/components/admin/mailboxes/EscrowScopeCard.js +10 -8
- package/dist/apps/shared/components/admin/mailboxes/LeftoverMailboxesSection.js +4 -4
- package/dist/apps/shared/components/admin/mailboxes/MailboxTable.d.ts +1 -1
- package/dist/apps/shared/components/admin/mailboxes/ResourceSettingsCard.d.ts +1 -1
- package/dist/apps/shared/components/admin/mailboxes/ResourceSettingsCard.js +7 -5
- package/dist/apps/shared/components/admin/mailboxes/ShareAccessCard.js +5 -5
- package/dist/apps/shared/components/admin/settings/BrandingForm.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/BrandingForm.js +5 -5
- package/dist/apps/shared/components/admin/settings/DomainDnsSetup.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/DomainDnsSetup.js +5 -5
- package/dist/apps/shared/components/admin/settings/EncryptionPolicyForm.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/EncryptionPolicyForm.js +4 -4
- package/dist/apps/shared/components/admin/settings/LoadedSettingsForm.js +2 -2
- package/dist/apps/shared/components/admin/settings/MailboxCreateForm.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/MailboxCreateForm.js +14 -12
- package/dist/apps/shared/components/admin/settings/MailboxPolicyForm.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/MailboxPolicyForm.js +4 -4
- package/dist/apps/shared/components/admin/settings/PluginsManager.js +5 -5
- package/dist/apps/shared/components/admin/settings/RetentionPolicyForm.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/RetentionPolicyForm.js +5 -5
- package/dist/apps/shared/components/admin/setup/EscrowSetupStep.js +7 -7
- package/dist/apps/shared/components/admin/setup/SetupWizard.js +26 -22
- package/dist/apps/shared/components/admin/signOut.js +1 -1
- package/dist/apps/shared/components/admin/usePagedList.js +2 -2
- package/dist/apps/shared/components/calendar/AppointmentQuickForm.js +3 -3
- package/dist/apps/shared/components/calendar/CalendarListSidebar.d.ts +1 -1
- package/dist/apps/shared/components/calendar/CalendarListSidebar.js +2 -2
- package/dist/apps/shared/components/calendar/DescriptionEditor.js +1 -1
- package/dist/apps/shared/components/calendar/EventDescriptionView.js +1 -1
- package/dist/apps/shared/components/calendar/EventDetails.d.ts +2 -2
- package/dist/apps/shared/components/calendar/EventDetails.js +16 -14
- package/dist/apps/shared/components/calendar/EventEditor.d.ts +2 -2
- package/dist/apps/shared/components/calendar/EventEditor.js +22 -20
- package/dist/apps/shared/components/calendar/EventExpandedForm.js +2 -2
- package/dist/apps/shared/components/calendar/EventFormParts.d.ts +1 -1
- package/dist/apps/shared/components/calendar/EventFormParts.js +1 -1
- package/dist/apps/shared/components/calendar/EventModal.d.ts +2 -2
- package/dist/apps/shared/components/calendar/EventModal.js +3 -3
- package/dist/apps/shared/components/calendar/EventQuickForm.js +3 -3
- package/dist/apps/shared/components/calendar/EventShell.js +1 -1
- package/dist/apps/shared/components/calendar/FindATime.js +6 -4
- package/dist/apps/shared/components/calendar/GuestInput.d.ts +2 -2
- package/dist/apps/shared/components/calendar/MonthView.d.ts +1 -1
- package/dist/apps/shared/components/calendar/MonthView.js +1 -1
- package/dist/apps/shared/components/calendar/QuickCreateFaces.js +1 -1
- package/dist/apps/shared/components/calendar/QuickFaceFrame.js +1 -1
- package/dist/apps/shared/components/calendar/RecurrenceEditor.d.ts +1 -1
- package/dist/apps/shared/components/calendar/RecurrenceEditor.js +1 -1
- package/dist/apps/shared/components/calendar/RequestChangeForm.js +8 -6
- package/dist/apps/shared/components/calendar/ResourcePicker.d.ts +1 -1
- package/dist/apps/shared/components/calendar/ResourcePicker.js +7 -5
- package/dist/apps/shared/components/calendar/SplitDayView.d.ts +1 -1
- package/dist/apps/shared/components/calendar/TaskQuickForm.d.ts +1 -1
- package/dist/apps/shared/components/calendar/TaskQuickForm.js +9 -7
- package/dist/apps/shared/components/calendar/TimeGridView.d.ts +1 -1
- package/dist/apps/shared/components/calendar/TimeGridView.js +1 -1
- package/dist/apps/shared/components/calendar/allDay.d.ts +2 -2
- package/dist/apps/shared/components/calendar/allDay.js +1 -1
- package/dist/apps/shared/components/calendar/eventDialogFields.d.ts +2 -2
- package/dist/apps/shared/components/calendar/eventDialogFields.js +2 -2
- package/dist/apps/shared/components/calendar/eventForm.d.ts +3 -3
- package/dist/apps/shared/components/calendar/eventFormat.d.ts +1 -1
- package/dist/apps/shared/components/calendar/eventFormat.js +2 -2
- package/dist/apps/shared/components/calendar/findTimeGrid.d.ts +1 -1
- package/dist/apps/shared/components/calendar/findTimeGrid.js +1 -1
- package/dist/apps/shared/components/calendar/layout/CalendarShell.d.ts +1 -1
- package/dist/apps/shared/components/calendar/layout/CalendarShell.js +11 -9
- package/dist/apps/shared/components/contacts/ContactDetailPane.d.ts +1 -1
- package/dist/apps/shared/components/contacts/ContactDetailPane.js +2 -2
- package/dist/apps/shared/components/contacts/ContactForm.d.ts +2 -2
- package/dist/apps/shared/components/contacts/ContactForm.js +12 -8
- package/dist/apps/shared/components/contacts/ContactsSidebar.d.ts +1 -1
- package/dist/apps/shared/components/contacts/ContactsSidebar.js +7 -5
- package/dist/apps/shared/components/contacts/KeyChangeReview.d.ts +1 -1
- package/dist/apps/shared/components/contacts/KeyChangeReview.js +5 -5
- package/dist/apps/shared/components/contacts/contactKeys.d.ts +2 -2
- package/dist/apps/shared/components/contacts/contactKeys.js +2 -2
- package/dist/apps/shared/components/contacts/layout/ContactsShell.d.ts +1 -1
- package/dist/apps/shared/components/contacts/layout/ContactsShell.js +9 -7
- package/dist/apps/shared/components/escrow/layout/EscrowShell.js +6 -6
- package/dist/apps/shared/components/forms/StringListField.js +1 -1
- package/dist/apps/shared/components/layout/AppShell.d.ts +2 -2
- package/dist/apps/shared/components/layout/AppShell.js +11 -9
- package/dist/apps/shared/components/layout/BrandingChrome.d.ts +1 -1
- package/dist/apps/shared/components/layout/KeyEnrollmentGate.d.ts +1 -1
- package/dist/apps/shared/components/layout/KeyEnrollmentGate.js +9 -9
- package/dist/apps/shared/components/layout/MailboxProvisioning.js +8 -6
- package/dist/apps/shared/components/layout/RecoveryCodeUnlock.d.ts +1 -1
- package/dist/apps/shared/components/layout/RecoveryCodeUnlock.js +9 -9
- package/dist/apps/shared/components/layout/UnlockPromptProvider.d.ts +2 -2
- package/dist/apps/shared/components/layout/UnlockPromptProvider.js +5 -5
- package/dist/apps/shared/components/layout/UserMenu.js +6 -4
- package/dist/apps/shared/components/mail/ConversationList.d.ts +2 -2
- package/dist/apps/shared/components/mail/ConversationList.js +6 -4
- package/dist/apps/shared/components/mail/ConversationThreadPane.d.ts +3 -3
- package/dist/apps/shared/components/mail/ConversationThreadPane.js +13 -11
- package/dist/apps/shared/components/mail/InviteCard.js +10 -8
- package/dist/apps/shared/components/mail/LazyReadingPane.js +2 -2
- package/dist/apps/shared/components/mail/MailAddress.d.ts +1 -1
- package/dist/apps/shared/components/mail/MailAddress.js +1 -1
- package/dist/apps/shared/components/mail/MailListToolbar.d.ts +2 -2
- package/dist/apps/shared/components/mail/MailSelectionBar.d.ts +2 -2
- package/dist/apps/shared/components/mail/MenuButton.js +1 -1
- package/dist/apps/shared/components/mail/MessageDetailPane.d.ts +3 -3
- package/dist/apps/shared/components/mail/MessageDetailPane.js +30 -28
- package/dist/apps/shared/components/mail/MoveToFolderDialog.d.ts +1 -1
- package/dist/apps/shared/components/mail/MoveToFolderDialog.js +8 -6
- package/dist/apps/shared/components/mail/OutboxRowStatus.d.ts +1 -1
- package/dist/apps/shared/components/mail/PermanentDeleteDialog.js +2 -2
- package/dist/apps/shared/components/mail/compose/ComposeContext.d.ts +10 -1
- package/dist/apps/shared/components/mail/compose/ComposeContext.js +4 -2
- package/dist/apps/shared/components/mail/compose/ComposeWindow.js +34 -30
- package/dist/apps/shared/components/mail/compose/ComposeWindowPlaceholder.js +4 -4
- package/dist/apps/shared/components/mail/compose/EmojiPicker.js +2 -2
- package/dist/apps/shared/components/mail/compose/GifPicker.js +3 -3
- package/dist/apps/shared/components/mail/compose/RecipientInput.d.ts +1 -1
- package/dist/apps/shared/components/mail/compose/RecipientInput.js +1 -1
- package/dist/apps/shared/components/mail/compose/ScheduleSendPicker.js +1 -1
- package/dist/apps/shared/components/mail/compose/encryptionRequirement.d.ts +2 -2
- package/dist/apps/shared/components/mail/compose/encryptionRequirement.js +1 -1
- package/dist/apps/shared/components/mail/compose/quotedBody.d.ts +3 -3
- package/dist/apps/shared/components/mail/compose/quotedBody.js +3 -3
- package/dist/apps/shared/components/mail/compose/recipients.d.ts +1 -1
- package/dist/apps/shared/components/mail/invite/InviteRowChip.d.ts +1 -1
- package/dist/apps/shared/components/mail/invite/InviteRsvpPopover.d.ts +1 -1
- package/dist/apps/shared/components/mail/invite/InviteRsvpPopover.js +9 -7
- package/dist/apps/shared/components/mail/invite/InviteTimeline.d.ts +1 -1
- package/dist/apps/shared/components/mail/invite/ProposeTimeForm.d.ts +1 -1
- package/dist/apps/shared/components/mail/invite/ProposeTimeForm.js +1 -1
- package/dist/apps/shared/components/mail/invite/inviteFormat.d.ts +2 -2
- package/dist/apps/shared/components/mail/invite/inviteStore.d.ts +9 -3
- package/dist/apps/shared/components/mail/invite/inviteStore.js +13 -6
- package/dist/apps/shared/components/mail/labelMenu.d.ts +1 -1
- package/dist/apps/shared/components/mail/labelMenu.js +9 -7
- package/dist/apps/shared/components/mail/layout/MailShell.d.ts +1 -1
- package/dist/apps/shared/components/mail/layout/MailShell.js +3 -3
- package/dist/apps/shared/components/mail/listPreferences.d.ts +2 -2
- package/dist/apps/shared/components/mail/listPreferences.js +1 -1
- package/dist/apps/shared/components/mail/pinnedSigners.d.ts +12 -5
- package/dist/apps/shared/components/mail/pinnedSigners.js +37 -18
- package/dist/apps/shared/components/mail/reading/EncryptedBody.js +2 -2
- package/dist/apps/shared/components/mail/reading/MessageBody.d.ts +2 -2
- package/dist/apps/shared/components/mail/reading/MessageBody.js +4 -4
- package/dist/apps/shared/components/mail/reading/MessageCard.d.ts +1 -1
- package/dist/apps/shared/components/mail/reading/MessageCard.js +2 -2
- package/dist/apps/shared/components/mail/reading/MessageSourceDialog.js +3 -3
- package/dist/apps/shared/components/mail/reading/PendingMessageCard.js +1 -1
- package/dist/apps/shared/components/mail/reading/bodyContent.d.ts +2 -2
- package/dist/apps/shared/components/mail/reading/bodyContent.js +2 -2
- package/dist/apps/shared/components/mail/reading/bodyHtml.js +1 -1
- package/dist/apps/shared/components/mail/reading/messageExport.js +1 -1
- package/dist/apps/shared/components/mail/reading/printMessage.d.ts +2 -2
- package/dist/apps/shared/components/mail/reading/useMessageActions.d.ts +1 -1
- package/dist/apps/shared/components/mail/reading/useMessageActions.js +18 -16
- package/dist/apps/shared/components/mail/unreadStyle.d.ts +1 -1
- package/dist/apps/shared/components/mail/verificationSeals.d.ts +27 -6
- package/dist/apps/shared/components/mail/verificationSeals.js +15 -11
- package/dist/apps/shared/components/mail/writableMailboxes.d.ts +8 -3
- package/dist/apps/shared/components/mail/writableMailboxes.js +12 -6
- package/dist/apps/shared/components/rules/RuleBuilder.js +1 -1
- package/dist/apps/shared/components/settings/SigningCertificateCard.d.ts +1 -1
- package/dist/apps/shared/components/settings/SigningCertificateCard.js +3 -3
- package/dist/apps/shared/components/settings/layout/SettingsShell.d.ts +1 -1
- package/dist/apps/shared/components/settings/layout/SettingsShell.js +8 -6
- package/dist/apps/shared/components/sharing/PrincipalListField.d.ts +1 -1
- package/dist/apps/shared/components/sharing/PrincipalPicker.d.ts +1 -1
- package/dist/apps/shared/components/sharing/PrincipalPicker.js +1 -1
- package/dist/apps/shared/components/sharing/PrincipalResolver.d.ts +1 -1
- package/dist/apps/shared/components/sharing/PrincipalResolver.js +3 -3
- package/dist/apps/shared/components/tasks/TasksSidebar.d.ts +1 -1
- package/dist/apps/shared/components/tasks/TasksSidebar.js +7 -5
- package/dist/apps/shared/components/tasks/layout/TasksShell.d.ts +1 -1
- package/dist/apps/shared/components/tasks/layout/TasksShell.js +9 -7
- package/dist/apps/shared/keyboard/ShortcutsDialog.js +1 -1
- package/dist/apps/shared/mail/findWellKnownFolderUid.d.ts +5 -3
- package/dist/apps/shared/mail/findWellKnownFolderUid.js +5 -4
- package/dist/apps/shared/mail/folderCounts.d.ts +1 -1
- package/dist/apps/shared/mail/folderCounts.js +6 -4
- package/dist/apps/shared/mail/folderOfType.d.ts +3 -2
- package/dist/apps/shared/mail/folderOfType.js +4 -4
- package/dist/apps/shared/mail/folderTree.d.ts +1 -1
- package/dist/apps/shared/mail/listSnapshots.d.ts +2 -2
- package/dist/apps/shared/mail/messageReadState.d.ts +4 -3
- package/dist/apps/shared/mail/messageReadState.js +5 -5
- package/dist/apps/shared/mail/newMailNotifications.d.ts +1 -1
- package/dist/apps/shared/mail/newMailNotifications.js +1 -1
- package/dist/apps/shared/mail/outbox/composeBridge.d.ts +2 -2
- package/dist/apps/shared/mail/outbox/outboxState.d.ts +1 -1
- package/dist/apps/shared/mail/outbox/outgoingReplies.d.ts +2 -2
- package/dist/apps/shared/mail/outbox/sendDecision.d.ts +2 -2
- package/dist/apps/shared/mail/outbox/sendDecision.js +1 -1
- package/dist/apps/shared/mail/outbox/sendJob.d.ts +10 -6
- package/dist/apps/shared/mail/outbox/sendJob.js +39 -35
- package/dist/apps/shared/mail/outbox/sendOutcomes.d.ts +6 -3
- package/dist/apps/shared/mail/outbox/sendOutcomes.js +19 -15
- package/dist/apps/shared/mail/outbox/useOutboxStatus.js +5 -3
- package/dist/apps/shared/mail/permanentDelete.d.ts +4 -3
- package/dist/apps/shared/mail/permanentDelete.js +8 -8
- package/dist/apps/shared/mail/primaryMailbox.d.ts +1 -1
- package/dist/apps/shared/mail/primaryMailbox.js +1 -1
- package/dist/apps/shared/mail/reportNotices.d.ts +1 -1
- package/dist/apps/shared/mail/senderBlocking.d.ts +5 -4
- package/dist/apps/shared/mail/senderBlocking.js +19 -16
- package/dist/apps/shared/mail/useMailConnection.d.ts +1 -1
- package/dist/apps/shared/mail/useMailConnection.js +12 -10
- package/dist/apps/shared/mail/useMailLiveUpdates.d.ts +2 -2
- package/dist/apps/shared/mail/useMailLiveUpdates.js +2 -2
- package/dist/apps/shared/mail/useMailboxUpdateAccess.d.ts +3 -2
- package/dist/apps/shared/mail/useMailboxUpdateAccess.js +31 -10
- package/dist/apps/shared/mail/useMarkMessageRead.d.ts +1 -1
- package/dist/apps/shared/mail/useMarkMessageRead.js +5 -3
- package/dist/apps/shared/mail/useNewMailNotifications.d.ts +1 -1
- package/dist/apps/shared/mail/usePermanentDelete.d.ts +1 -1
- package/dist/apps/shared/mail/usePermanentDelete.js +4 -2
- package/dist/apps/shared/navigation/pageTitle.d.ts +1 -1
- package/dist/apps/shared/notifications/NotificationCenter.js +1 -1
- package/dist/apps/shared/notifications/NotificationHistoryDialog.js +2 -2
- package/dist/apps/shared/notifications/apiErrors.js +2 -2
- package/dist/apps/shared/notifications/pushStatus.js +1 -1
- package/dist/apps/shared/notifications/systemErrors.js +1 -1
- package/dist/apps/shared/search/LocalIndexLifecycle.d.ts +2 -2
- package/dist/apps/shared/search/LocalIndexLifecycle.js +15 -10
- package/dist/apps/shared/search/crossMailboxSearch.d.ts +1 -1
- package/dist/apps/shared/search/crossMailboxSearch.js +2 -2
- package/dist/apps/shared/search/localIndexBuilder.d.ts +4 -3
- package/dist/apps/shared/search/localIndexBuilder.js +15 -12
- package/dist/apps/shared/search/localIndexKey.js +1 -1
- package/dist/apps/shared/search/localIndexRpcClient.d.ts +43 -31
- package/dist/apps/shared/search/localIndexRpcClient.js +113 -20
- package/dist/apps/shared/search/localIndexTransport.d.ts +77 -0
- package/dist/apps/shared/search/localIndexTransport.js +1 -0
- package/dist/apps/shared/search/localIndexWorker.d.ts +1 -1
- package/dist/apps/shared/search/searchTier2.d.ts +3 -3
- package/dist/apps/shared/signing/enrollmentTracker.d.ts +1 -1
- package/dist/apps/shared/signing/enrollmentTracker.js +3 -3
- package/dist/apps/shared/signing/enrollmentView.d.ts +1 -1
- package/dist/apps/shared/signing/signingInfo.d.ts +1 -1
- package/dist/apps/shared/signing/signingInfo.js +1 -1
- package/dist/apps/shared/signing/useSigningEnrollmentWatcher.d.ts +1 -1
- package/dist/apps/shared/signing/useSigningEnrollmentWatcher.js +5 -3
- package/dist/apps/shared/styles/app.css +14 -23
- package/dist/apps/www/_layout.d.ts +1 -1
- package/dist/apps/www/_layout.js +1 -1
- package/dist/apps/www/calendar/index.d.ts +1 -1
- package/dist/apps/www/calendar/index.js +20 -18
- package/dist/apps/www/contacts/[uid].d.ts +1 -1
- package/dist/apps/www/contacts/[uid].js +8 -6
- package/dist/apps/www/contacts/index.d.ts +1 -1
- package/dist/apps/www/contacts/index.js +19 -17
- package/dist/apps/www/index.d.ts +1 -1
- package/dist/apps/www/index.js +54 -50
- package/dist/apps/www/messages/[uid].d.ts +1 -1
- package/dist/apps/www/messages/[uid].js +11 -9
- package/dist/apps/www/settings/appearance/index.d.ts +1 -1
- package/dist/apps/www/settings/auto-reply/index.d.ts +1 -1
- package/dist/apps/www/settings/auto-reply/index.js +6 -4
- package/dist/apps/www/settings/blocked-senders/index.d.ts +1 -1
- package/dist/apps/www/settings/blocked-senders/index.js +6 -4
- package/dist/apps/www/settings/encryption/index.d.ts +1 -1
- package/dist/apps/www/settings/encryption/index.js +31 -29
- package/dist/apps/www/settings/filters/[uid].d.ts +1 -1
- package/dist/apps/www/settings/filters/[uid].js +11 -9
- package/dist/apps/www/settings/filters/_mailFilterRuleConfig.d.ts +2 -2
- package/dist/apps/www/settings/filters/index.d.ts +1 -1
- package/dist/apps/www/settings/filters/index.js +4 -4
- package/dist/apps/www/settings/filters/new/index.d.ts +1 -1
- package/dist/apps/www/settings/filters/new/index.js +10 -8
- package/dist/apps/www/settings/labels/index.d.ts +1 -1
- package/dist/apps/www/settings/labels/index.js +12 -10
- package/dist/apps/www/settings/privacy/index.d.ts +1 -1
- package/dist/apps/www/settings/privacy/index.js +18 -14
- package/dist/apps/www/settings/profile/index.d.ts +1 -1
- package/dist/apps/www/settings/profile/index.js +7 -5
- package/dist/apps/www/settings/read-receipts/index.d.ts +1 -1
- package/dist/apps/www/settings/read-receipts/index.js +5 -3
- package/dist/apps/www/settings/sharing/index.d.ts +1 -1
- package/dist/apps/www/settings/sharing/index.js +6 -6
- package/dist/apps/www/settings/signatures/[uid].d.ts +1 -1
- package/dist/apps/www/settings/signatures/[uid].js +5 -5
- package/dist/apps/www/settings/signatures/index.d.ts +1 -1
- package/dist/apps/www/settings/signatures/index.js +4 -4
- package/dist/apps/www/settings/signatures/new/index.d.ts +1 -1
- package/dist/apps/www/settings/signatures/new/index.js +4 -4
- package/dist/apps/www/settings/signatures/signatureDefaults.d.ts +1 -1
- package/dist/apps/www/settings/signatures/signatureDefaults.js +1 -1
- package/dist/apps/www/tasks/index.d.ts +1 -1
- package/dist/apps/www/tasks/index.js +17 -15
- package/dist/lib/admin/auditLogApi.d.ts +32 -0
- package/dist/lib/admin/auditLogApi.js +27 -0
- package/dist/lib/admin/distributionListsApi.d.ts +47 -0
- package/dist/lib/admin/distributionListsApi.js +34 -0
- package/dist/lib/admin/domainsApi.d.ts +75 -0
- package/dist/lib/admin/domainsApi.js +44 -0
- package/dist/lib/admin/escrowAccessRequestsApi.d.ts +79 -0
- package/dist/lib/admin/escrowAccessRequestsApi.js +46 -0
- package/dist/lib/admin/escrowAuditLogApi.d.ts +66 -0
- package/dist/lib/admin/escrowAuditLogApi.js +31 -0
- package/dist/lib/admin/escrowScopesApi.d.ts +78 -0
- package/dist/lib/admin/escrowScopesApi.js +50 -0
- package/dist/lib/admin/leftoverMailboxApi.d.ts +73 -0
- package/dist/lib/admin/leftoverMailboxApi.js +67 -0
- package/dist/lib/admin/mailboxPolicyApi.d.ts +27 -0
- package/dist/lib/admin/mailboxPolicyApi.js +21 -0
- package/dist/lib/admin/matterExportApi.d.ts +40 -0
- package/dist/lib/admin/matterExportApi.js +39 -0
- package/dist/lib/admin/matterSearchApi.d.ts +20 -0
- package/dist/lib/admin/matterSearchApi.js +27 -0
- package/dist/lib/admin/mattersApi.d.ts +56 -0
- package/dist/lib/admin/mattersApi.js +40 -0
- package/dist/lib/admin/pluginsApi.d.ts +265 -0
- package/dist/lib/admin/pluginsApi.js +102 -0
- package/dist/lib/admin/retentionPolicyApi.d.ts +32 -0
- package/dist/lib/admin/retentionPolicyApi.js +29 -0
- package/dist/lib/admin/setupApi.d.ts +23 -0
- package/dist/lib/admin/setupApi.js +26 -0
- package/dist/lib/admin/transportRulesApi.d.ts +66 -0
- package/dist/lib/admin/transportRulesApi.js +43 -0
- package/dist/lib/appearance/preferencesApi.d.ts +128 -0
- package/dist/lib/appearance/preferencesApi.js +257 -0
- package/dist/lib/auth/profileApi.d.ts +33 -0
- package/dist/lib/auth/profileApi.js +52 -0
- package/dist/lib/auth/session.d.ts +70 -0
- package/dist/lib/auth/session.js +210 -0
- package/dist/lib/branding/brandingApi.d.ts +47 -0
- package/dist/lib/branding/brandingApi.js +61 -0
- package/dist/lib/branding/useBranding.d.ts +23 -0
- package/dist/lib/branding/useBranding.js +65 -0
- package/dist/lib/calendar/calendarApi.d.ts +230 -0
- package/dist/lib/calendar/calendarApi.js +106 -0
- package/dist/lib/calendar/calendarColors.d.ts +18 -0
- package/dist/lib/calendar/calendarColors.js +39 -0
- package/dist/lib/calendar/calendarDragIds.d.ts +42 -0
- package/dist/lib/calendar/calendarDragIds.js +92 -0
- package/dist/lib/calendar/calendarMutations.d.ts +68 -0
- package/dist/lib/calendar/calendarMutations.js +190 -0
- package/dist/lib/calendar/eventDescription.d.ts +43 -0
- package/dist/lib/calendar/eventDescription.js +195 -0
- package/dist/lib/calendar/freeBusyApi.d.ts +100 -0
- package/dist/lib/calendar/freeBusyApi.js +119 -0
- package/dist/lib/calendar/inviteApi.d.ts +121 -0
- package/dist/lib/calendar/inviteApi.js +54 -0
- package/dist/lib/calendar/recurrence.d.ts +60 -0
- package/dist/lib/calendar/recurrence.js +225 -0
- package/dist/lib/components/avatar/ContactAvatar.d.ts +8 -0
- package/dist/lib/components/avatar/ContactAvatar.js +26 -0
- package/dist/lib/components/buttons/Button.d.ts +9 -0
- package/dist/lib/components/buttons/Button.js +14 -0
- package/dist/lib/components/buttons/CopyButton.d.ts +18 -0
- package/dist/lib/components/buttons/CopyButton.js +14 -0
- package/dist/lib/components/feedback/Alert.d.ts +4 -0
- package/dist/lib/components/feedback/Alert.js +4 -0
- package/dist/lib/components/feedback/Skeleton.d.ts +21 -0
- package/dist/lib/components/feedback/Skeleton.js +14 -0
- package/dist/lib/components/forms/FormField.d.ts +8 -0
- package/dist/lib/components/forms/FormField.js +5 -0
- package/dist/lib/components/navigation/BottomTabBar.d.ts +27 -0
- package/dist/lib/components/navigation/BottomTabBar.js +32 -0
- package/dist/lib/components/overlays/Drawer.d.ts +20 -0
- package/dist/lib/components/overlays/Drawer.js +27 -0
- package/dist/lib/components/overlays/Modal.d.ts +17 -0
- package/dist/lib/components/overlays/Modal.js +25 -0
- package/dist/lib/components/overlays/PopoverPortal.d.ts +23 -0
- package/dist/lib/components/overlays/PopoverPortal.js +53 -0
- package/dist/lib/components/overlays/overlayStack.d.ts +31 -0
- package/dist/lib/components/overlays/overlayStack.js +143 -0
- package/dist/lib/components/pickers/MiniDatePicker.d.ts +13 -0
- package/dist/lib/components/pickers/MiniDatePicker.js +42 -0
- package/dist/lib/contacts/contactsApi.d.ts +174 -0
- package/dist/lib/contacts/contactsApi.js +139 -0
- package/dist/lib/contacts/vcard.d.ts +23 -0
- package/dist/lib/contacts/vcard.js +179 -0
- package/dist/lib/crypto/composeSecurity.d.ts +67 -0
- package/dist/lib/crypto/composeSecurity.js +93 -0
- package/dist/lib/crypto/encoding.d.ts +9 -0
- package/dist/lib/crypto/encoding.js +32 -0
- package/dist/lib/crypto/escrowKeys.d.ts +25 -0
- package/dist/lib/crypto/escrowKeys.js +59 -0
- package/dist/lib/crypto/idleTimeout.d.ts +16 -0
- package/dist/lib/crypto/idleTimeout.js +47 -0
- package/dist/lib/crypto/keySession.d.ts +159 -0
- package/dist/lib/crypto/keySession.js +367 -0
- package/dist/lib/crypto/keys.d.ts +50 -0
- package/dist/lib/crypto/keys.js +89 -0
- package/dist/lib/crypto/keyvaultApi.d.ts +394 -0
- package/dist/lib/crypto/keyvaultApi.js +350 -0
- package/dist/lib/crypto/masterKey.d.ts +59 -0
- package/dist/lib/crypto/masterKey.js +104 -0
- package/dist/lib/crypto/masterKeyWraps.d.ts +108 -0
- package/dist/lib/crypto/masterKeyWraps.js +228 -0
- package/dist/lib/crypto/messageSecurity.d.ts +248 -0
- package/dist/lib/crypto/messageSecurity.js +367 -0
- package/dist/lib/crypto/mime.d.ts +143 -0
- package/dist/lib/crypto/mime.js +504 -0
- package/dist/lib/crypto/passkeyUnlock.d.ts +20 -0
- package/dist/lib/crypto/passkeyUnlock.js +79 -0
- package/dist/lib/crypto/passwordUnlock.d.ts +39 -0
- package/dist/lib/crypto/passwordUnlock.js +73 -0
- package/dist/lib/crypto/recoveryCode.d.ts +28 -0
- package/dist/lib/crypto/recoveryCode.js +86 -0
- package/dist/lib/crypto/signingProviderApi.d.ts +95 -0
- package/dist/lib/crypto/signingProviderApi.js +60 -0
- package/dist/lib/crypto/smime.d.ts +128 -0
- package/dist/lib/crypto/smime.js +402 -0
- package/dist/lib/crypto/smimeMessage.d.ts +132 -0
- package/dist/lib/crypto/smimeMessage.js +341 -0
- package/dist/lib/crypto/useIdleKeyTimeout.d.ts +10 -0
- package/dist/lib/crypto/useIdleKeyTimeout.js +163 -0
- package/dist/lib/crypto/verificationSeal.d.ts +56 -0
- package/dist/lib/crypto/verificationSeal.js +220 -0
- package/dist/lib/mail/compose/composeQuoting.d.ts +88 -0
- package/dist/lib/mail/compose/composeQuoting.js +204 -0
- package/dist/lib/mail/compose/emojiData.d.ts +9 -0
- package/dist/lib/mail/compose/emojiData.js +18 -0
- package/dist/lib/mail/compose/giphyApi.d.ts +17 -0
- package/dist/lib/mail/compose/giphyApi.js +20 -0
- package/dist/lib/mail/conversationsApi.d.ts +80 -0
- package/dist/lib/mail/conversationsApi.js +44 -0
- package/dist/lib/mail/dataExportApi.d.ts +50 -0
- package/dist/lib/mail/dataExportApi.js +40 -0
- package/dist/lib/mail/directoryApi.d.ts +49 -0
- package/dist/lib/mail/directoryApi.js +101 -0
- package/dist/lib/mail/erasureRequestApi.d.ts +45 -0
- package/dist/lib/mail/erasureRequestApi.js +43 -0
- package/dist/lib/mail/flaggedMessages.d.ts +22 -0
- package/dist/lib/mail/flaggedMessages.js +73 -0
- package/dist/lib/mail/focusedInboxOverridesApi.d.ts +37 -0
- package/dist/lib/mail/focusedInboxOverridesApi.js +34 -0
- package/dist/lib/mail/labelsApi.d.ts +47 -0
- package/dist/lib/mail/labelsApi.js +38 -0
- package/dist/lib/mail/mailAddress.d.ts +27 -0
- package/dist/lib/mail/mailAddress.js +54 -0
- package/dist/lib/mail/mailApi.d.ts +850 -0
- package/dist/lib/mail/mailApi.js +602 -0
- package/dist/lib/mail/mailDetailHooks.d.ts +10 -0
- package/dist/lib/mail/mailDetailHooks.js +53 -0
- package/dist/lib/mail/mailFilterRulesApi.d.ts +76 -0
- package/dist/lib/mail/mailFilterRulesApi.js +45 -0
- package/dist/lib/mail/mailSignaturesApi.d.ts +49 -0
- package/dist/lib/mail/mailSignaturesApi.js +42 -0
- package/dist/lib/mail/mailboxAccessApi.d.ts +74 -0
- package/dist/lib/mail/mailboxAccessApi.js +56 -0
- package/dist/lib/mail/mailboxImportApi.d.ts +53 -0
- package/dist/lib/mail/mailboxImportApi.js +51 -0
- package/dist/lib/mail/messageBodySanitizer.d.ts +16 -0
- package/dist/lib/mail/messageBodySanitizer.js +118 -0
- package/dist/lib/mail/pushClient.d.ts +106 -0
- package/dist/lib/mail/pushClient.js +317 -0
- package/dist/lib/mail/sendEvents.d.ts +33 -0
- package/dist/lib/mail/sendEvents.js +44 -0
- package/dist/lib/mail/sendFailure.d.ts +16 -0
- package/dist/lib/mail/sendFailure.js +86 -0
- package/dist/lib/mail/senderListsApi.d.ts +69 -0
- package/dist/lib/mail/senderListsApi.js +126 -0
- package/dist/lib/search/queryGrammar.d.ts +51 -0
- package/dist/lib/search/queryGrammar.js +111 -0
- package/dist/lib/search/searchApi.d.ts +100 -0
- package/dist/lib/search/searchApi.js +107 -0
- package/dist/lib/search/searchScoring.d.ts +34 -0
- package/dist/lib/search/searchScoring.js +44 -0
- package/dist/lib/search/searchTier3.d.ts +64 -0
- package/dist/lib/search/searchTier3.js +335 -0
- package/dist/lib/tasks/tasksApi.d.ts +85 -0
- package/dist/lib/tasks/tasksApi.js +55 -0
- package/dist/lib/util/api.d.ts +160 -0
- package/dist/lib/util/api.js +251 -0
- package/dist/lib/util/apiClientContext.d.ts +7 -0
- package/dist/lib/util/apiClientContext.js +32 -0
- package/dist/lib/util/apiQuery.d.ts +32 -0
- package/dist/lib/util/apiQuery.js +42 -0
- package/dist/lib/util/clipboard.d.ts +7 -0
- package/dist/lib/util/clipboard.js +56 -0
- package/dist/lib/util/dateInput.d.ts +6 -0
- package/dist/lib/util/dateInput.js +14 -0
- package/dist/lib/util/timeZone.d.ts +12 -0
- package/dist/lib/util/timeZone.js +32 -0
- package/dist/lib/util/useCopyToClipboard.d.ts +12 -0
- package/dist/lib/util/useCopyToClipboard.js +34 -0
- package/dist/lib/util/useIsMobile.d.ts +10 -0
- package/dist/lib/util/useIsMobile.js +29 -0
- package/dist/lib/videoconf/videoMeetingsApi.d.ts +116 -0
- package/dist/lib/videoconf/videoMeetingsApi.js +49 -0
- package/lib/admin/auditLogApi.ts +48 -0
- package/lib/admin/distributionListsApi.ts +77 -0
- package/lib/admin/domainsApi.ts +113 -0
- package/lib/admin/escrowAccessRequestsApi.ts +110 -0
- package/lib/admin/escrowAuditLogApi.ts +101 -0
- package/lib/admin/escrowScopesApi.ts +112 -0
- package/lib/admin/leftoverMailboxApi.ts +120 -0
- package/lib/admin/mailboxPolicyApi.ts +38 -0
- package/lib/admin/matterExportApi.ts +62 -0
- package/lib/admin/matterSearchApi.ts +35 -0
- package/lib/admin/mattersApi.ts +86 -0
- package/lib/admin/pluginsApi.ts +339 -0
- package/lib/admin/retentionPolicyApi.ts +46 -0
- package/lib/admin/setupApi.ts +40 -0
- package/lib/admin/transportRulesApi.ts +106 -0
- package/lib/appearance/preferencesApi.ts +335 -0
- package/lib/auth/profileApi.ts +77 -0
- package/lib/auth/session.ts +238 -0
- package/lib/branding/brandingApi.ts +97 -0
- package/lib/branding/useBranding.ts +81 -0
- package/lib/calendar/calendarApi.ts +309 -0
- package/lib/calendar/calendarColors.ts +45 -0
- package/lib/calendar/calendarDragIds.ts +112 -0
- package/lib/calendar/calendarMutations.ts +236 -0
- package/lib/calendar/eventDescription.ts +211 -0
- package/lib/calendar/freeBusyApi.ts +197 -0
- package/lib/calendar/inviteApi.ts +154 -0
- package/lib/calendar/recurrence.ts +285 -0
- package/lib/components/avatar/ContactAvatar.tsx +47 -0
- package/lib/components/buttons/Button.tsx +40 -0
- package/lib/components/buttons/CopyButton.tsx +45 -0
- package/lib/components/feedback/Alert.tsx +13 -0
- package/lib/components/feedback/Skeleton.tsx +38 -0
- package/lib/components/forms/FormField.tsx +23 -0
- package/lib/components/navigation/BottomTabBar.tsx +66 -0
- package/lib/components/overlays/Drawer.tsx +72 -0
- package/lib/components/overlays/Modal.tsx +64 -0
- package/lib/components/overlays/PopoverPortal.tsx +74 -0
- package/lib/components/overlays/overlayStack.ts +165 -0
- package/lib/components/pickers/MiniDatePicker.tsx +90 -0
- package/lib/contacts/contactsApi.ts +289 -0
- package/lib/contacts/vcard.ts +197 -0
- package/lib/crypto/composeSecurity.ts +140 -0
- package/lib/crypto/encoding.ts +36 -0
- package/lib/crypto/escrowKeys.ts +74 -0
- package/lib/crypto/idleTimeout.ts +49 -0
- package/lib/crypto/keySession.ts +483 -0
- package/lib/crypto/keys.ts +105 -0
- package/lib/crypto/keyvaultApi.ts +674 -0
- package/lib/crypto/masterKey.ts +134 -0
- package/lib/crypto/masterKeyWraps.ts +269 -0
- package/lib/crypto/messageSecurity.ts +600 -0
- package/lib/crypto/mime.ts +568 -0
- package/lib/crypto/passkeyUnlock.ts +103 -0
- package/lib/crypto/passwordUnlock.ts +98 -0
- package/lib/crypto/recoveryCode.ts +93 -0
- package/lib/crypto/signingProviderApi.ts +135 -0
- package/lib/crypto/smime.ts +459 -0
- package/lib/crypto/smimeMessage.ts +491 -0
- package/lib/crypto/useIdleKeyTimeout.ts +176 -0
- package/lib/crypto/verificationSeal.ts +288 -0
- package/lib/mail/compose/composeQuoting.ts +243 -0
- package/lib/mail/compose/emojiData.ts +34 -0
- package/lib/mail/compose/giphyApi.ts +31 -0
- package/lib/mail/conversationsApi.ts +123 -0
- package/lib/mail/dataExportApi.ts +73 -0
- package/lib/mail/directoryApi.ts +161 -0
- package/lib/mail/erasureRequestApi.ts +71 -0
- package/lib/mail/flaggedMessages.ts +80 -0
- package/lib/mail/focusedInboxOverridesApi.ts +64 -0
- package/lib/mail/labelsApi.ts +71 -0
- package/lib/mail/mailAddress.ts +76 -0
- package/lib/mail/mailApi.ts +1286 -0
- package/lib/mail/mailDetailHooks.ts +57 -0
- package/lib/mail/mailFilterRulesApi.ts +116 -0
- package/lib/mail/mailSignaturesApi.ts +84 -0
- package/lib/mail/mailboxAccessApi.ts +106 -0
- package/lib/mail/mailboxImportApi.ts +87 -0
- package/lib/mail/messageBodySanitizer.ts +129 -0
- package/lib/mail/pushClient.ts +375 -0
- package/lib/mail/sendEvents.ts +72 -0
- package/lib/mail/sendFailure.ts +98 -0
- package/lib/mail/senderListsApi.ts +161 -0
- package/lib/search/queryGrammar.ts +179 -0
- package/lib/search/searchApi.ts +199 -0
- package/lib/search/searchScoring.ts +46 -0
- package/lib/search/searchTier3.ts +406 -0
- package/lib/tasks/tasksApi.ts +128 -0
- package/lib/util/api.ts +318 -0
- package/lib/util/apiClientContext.ts +35 -0
- package/lib/util/apiQuery.ts +61 -0
- package/lib/util/clipboard.ts +55 -0
- package/lib/util/dateInput.ts +15 -0
- package/lib/util/timeZone.ts +33 -0
- package/lib/util/useCopyToClipboard.ts +48 -0
- package/lib/util/useIsMobile.ts +34 -0
- package/lib/videoconf/videoMeetingsApi.ts +144 -0
- package/package.json +10 -4
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
3
|
// SPDX-License-Identifier: MPL-2.0
|
|
4
4
|
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
-
import { ApiRequestError } from "
|
|
6
|
-
import { describeSendFailure } from "
|
|
5
|
+
import { ApiRequestError } from "../../../lib/util/api.js";
|
|
6
|
+
import { describeSendFailure } from "../../../lib/mail/sendFailure.js";
|
|
7
7
|
import { NotificationAction, notify } from "./store.js";
|
|
8
8
|
|
|
9
9
|
/** Whether `err` is a request that was cancelled (`AbortError`) - by name, since a `DOMException` is not always an `Error` (jsdom's is not). */
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// SPDX-License-Identifier: MPL-2.0
|
|
4
4
|
///////////////////////////////////////////////////////////////////////////////
|
|
5
5
|
import { useEffect } from "react";
|
|
6
|
-
import { getPushClient, PushStatus } from "
|
|
6
|
+
import { getPushClient, PushStatus } from "../../../lib/mail/pushClient.js";
|
|
7
7
|
import { dismiss, notify } from "./store.js";
|
|
8
8
|
|
|
9
9
|
/** How long the live connection has to be down before anyone is told: a reconnect within a few seconds is not worth a word. */
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// SPDX-License-Identifier: MPL-2.0
|
|
4
4
|
///////////////////////////////////////////////////////////////////////////////
|
|
5
5
|
import { useEffect } from "react";
|
|
6
|
-
import { ApiRequestError } from "
|
|
6
|
+
import { ApiRequestError } from "../../../lib/util/api.js";
|
|
7
7
|
import { isAbortError } from "./apiErrors.js";
|
|
8
8
|
import { notify } from "./store.js";
|
|
9
9
|
|
|
@@ -21,9 +21,11 @@
|
|
|
21
21
|
* handles that case itself via `destroyAllLocalIndexes()`.
|
|
22
22
|
*/
|
|
23
23
|
import { useEffect, useRef } from "react";
|
|
24
|
-
import { getUnlockedKeys } from "
|
|
25
|
-
import type { PublicKey } from "
|
|
26
|
-
import type { Folder } from "
|
|
24
|
+
import { getUnlockedKeys } from "../../../lib/crypto/keySession.js";
|
|
25
|
+
import type { PublicKey } from "../../../lib/crypto/keyvaultApi.js";
|
|
26
|
+
import type { Folder } from "../../../lib/mail/mailApi.js";
|
|
27
|
+
import type { ApiClient } from "../../../lib/util/api.js";
|
|
28
|
+
import { useApiClient } from "../../../lib/util/apiClientContext.js";
|
|
27
29
|
|
|
28
30
|
/**
|
|
29
31
|
* The index builder (with the message security code it decrypts through - PKI.js and the ASN.1/X.509 libraries, over half a
|
|
@@ -52,15 +54,19 @@ export interface LocalIndexLifecycleProps {
|
|
|
52
54
|
|
|
53
55
|
/** Renders nothing - pure side-effect component, mounted by `MailShell.tsx`. */
|
|
54
56
|
export default function LocalIndexLifecycle({ mailboxUid, folders, accessibleMailboxUids }: LocalIndexLifecycleProps) {
|
|
57
|
+
// The explicit ApiClient (from useApiClient()) this component is rendered under - undefined for every existing caller (the SSR web/admin
|
|
58
|
+
// apps, Electron), which keeps building the index against the default global cookie-based session exactly as before. A native,
|
|
59
|
+
// multi-account host that renders this under an ApiClientContext.Provider gets its own account's client threaded through instead.
|
|
60
|
+
const client = useApiClient();
|
|
55
61
|
// mailboxUid -> whether it was unlocked at the last check. An entry exists for every mailbox whose
|
|
56
62
|
// build this component started; only ever changed by a real observed transition, never reset by an
|
|
57
63
|
// effect re-run.
|
|
58
64
|
const trackedRef = useRef(new Map<string, boolean>());
|
|
59
|
-
// The latest props, for the long-lived polling interval below.
|
|
60
|
-
const latestRef = useRef({ mailboxUid, folders });
|
|
61
|
-
latestRef.current = { mailboxUid, folders };
|
|
65
|
+
// The latest props (and client), for the long-lived polling interval below.
|
|
66
|
+
const latestRef = useRef({ mailboxUid, folders, client });
|
|
67
|
+
latestRef.current = { mailboxUid, folders, client };
|
|
62
68
|
|
|
63
|
-
function startBuildIfUnlocked(targetMailboxUid: string, targetFolders: Folder[]) {
|
|
69
|
+
function startBuildIfUnlocked(targetMailboxUid: string, targetFolders: Folder[], targetClient: ApiClient | undefined) {
|
|
64
70
|
const unlocked = getUnlockedKeys(targetMailboxUid);
|
|
65
71
|
if (!unlocked || targetFolders.length === 0 || trackedRef.current.get(targetMailboxUid)) {
|
|
66
72
|
return;
|
|
@@ -69,15 +75,15 @@ export default function LocalIndexLifecycle({ mailboxUid, folders, accessibleMai
|
|
|
69
75
|
// Never an unhandled rejection - a broken local index is best-effort infrastructure, not a build
|
|
70
76
|
// the rest of the app depends on.
|
|
71
77
|
loadBuilder()
|
|
72
|
-
.then(({ buildLocalIndex }) => buildLocalIndex(targetMailboxUid, unlocked, targetFolders))
|
|
78
|
+
.then(({ buildLocalIndex }) => buildLocalIndex(targetMailboxUid, unlocked, targetFolders, undefined, targetClient))
|
|
73
79
|
.catch(() => undefined);
|
|
74
80
|
}
|
|
75
81
|
|
|
76
82
|
useEffect(() => {
|
|
77
83
|
if (mailboxUid) {
|
|
78
|
-
startBuildIfUnlocked(mailboxUid, folders);
|
|
84
|
+
startBuildIfUnlocked(mailboxUid, folders, client);
|
|
79
85
|
}
|
|
80
|
-
}, [mailboxUid, folders]);
|
|
86
|
+
}, [mailboxUid, folders, client]);
|
|
81
87
|
|
|
82
88
|
useEffect(() => {
|
|
83
89
|
const interval = setInterval(() => {
|
|
@@ -94,9 +100,9 @@ export default function LocalIndexLifecycle({ mailboxUid, folders, accessibleMai
|
|
|
94
100
|
}
|
|
95
101
|
}
|
|
96
102
|
// The active mailbox was (re-)unlocked since the last check, e.g. via an on-demand unlock prompt.
|
|
97
|
-
const { mailboxUid: activeUid, folders: activeFolders } = latestRef.current;
|
|
103
|
+
const { mailboxUid: activeUid, folders: activeFolders, client: activeClient } = latestRef.current;
|
|
98
104
|
if (activeUid) {
|
|
99
|
-
startBuildIfUnlocked(activeUid, activeFolders);
|
|
105
|
+
startBuildIfUnlocked(activeUid, activeFolders, activeClient);
|
|
100
106
|
}
|
|
101
107
|
}, POLL_INTERVAL_MS);
|
|
102
108
|
return () => clearInterval(interval);
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
*
|
|
11
11
|
* A search of one mailbox is the same code with a list of one: nothing here changes what that returns.
|
|
12
12
|
*/
|
|
13
|
-
import { ApiRequestError } from "
|
|
14
|
-
import type { SearchResult } from "
|
|
15
|
-
import { normalizeServerScores } from "
|
|
13
|
+
import { ApiRequestError } from "../../../lib/util/api.js";
|
|
14
|
+
import type { SearchResult } from "../../../lib/search/searchApi.js";
|
|
15
|
+
import { normalizeServerScores } from "../../../lib/search/searchScoring.js";
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* How far a cross-mailbox search fans out. Exported (and mutable) so a test can shrink them instead of building 26 mailboxes or waiting a
|
|
@@ -35,9 +35,10 @@
|
|
|
35
35
|
* seals nothing. Signed-only (unencrypted) messages aren't sealed here: this pass never fetches their raw MIME (see
|
|
36
36
|
* above), and fetching it only to seal would cost a download per message; they are sealed when opened.
|
|
37
37
|
*/
|
|
38
|
-
import { getMessageRawContent, listFolders, listMessages, type Folder, type Message } from "
|
|
39
|
-
import { type MessageSecurityResult, evaluateMessageSecurity, evaluateMessageSecurityWithSeal } from "
|
|
40
|
-
import type { UnlockedKeys } from "
|
|
38
|
+
import { getMessageRawContent, listFolders, listMessages, type Folder, type Message } from "../../../lib/mail/mailApi.js";
|
|
39
|
+
import { type MessageSecurityResult, evaluateMessageSecurity, evaluateMessageSecurityWithSeal } from "../../../lib/crypto/messageSecurity.js";
|
|
40
|
+
import type { UnlockedKeys } from "../../../lib/crypto/keySession.js";
|
|
41
|
+
import type { ApiClient } from "../../../lib/util/api.js";
|
|
41
42
|
import { getPinnedSignerFingerprints } from "../components/mail/pinnedSigners.js";
|
|
42
43
|
import { currentVerificationSeal, readVaultGeneration, sendVerificationSeal, verificationSealPending } from "../components/mail/verificationSeals.js";
|
|
43
44
|
import type { LocalIndexEntity } from "./localIndexSchema.js";
|
|
@@ -111,7 +112,7 @@ interface PassSealer {
|
|
|
111
112
|
drain(): Promise<void>;
|
|
112
113
|
}
|
|
113
114
|
|
|
114
|
-
function createPassSealer(mailboxUid: string, unlocked: UnlockedKeys, signal: AbortSignal): PassSealer {
|
|
115
|
+
function createPassSealer(mailboxUid: string, unlocked: UnlockedKeys, signal: AbortSignal, client: ApiClient | undefined): PassSealer {
|
|
115
116
|
let generation: Promise<number | undefined> | undefined;
|
|
116
117
|
const pins = new Map<string, Promise<string[] | undefined>>();
|
|
117
118
|
const queue: (() => Promise<unknown>)[] = [];
|
|
@@ -120,13 +121,13 @@ function createPassSealer(mailboxUid: string, unlocked: UnlockedKeys, signal: Ab
|
|
|
120
121
|
let idle: (() => void) | undefined;
|
|
121
122
|
const stopped = () => signal.aborted || !!unlocked.destroyed;
|
|
122
123
|
|
|
123
|
-
const vaultGeneration = () => (generation ??= readVaultGeneration(mailboxUid));
|
|
124
|
+
const vaultGeneration = () => (generation ??= readVaultGeneration(mailboxUid, client));
|
|
124
125
|
|
|
125
126
|
const pinsFor = (address: string) => {
|
|
126
127
|
const key = address.toLowerCase();
|
|
127
128
|
let entry = pins.get(key);
|
|
128
129
|
if (!entry) {
|
|
129
|
-
entry = getPinnedSignerFingerprints(mailboxUid, address).then(
|
|
130
|
+
entry = getPinnedSignerFingerprints(mailboxUid, address, client).then(
|
|
130
131
|
(fingerprints) => (fingerprints.length > 0 ? fingerprints : undefined),
|
|
131
132
|
() => undefined,
|
|
132
133
|
);
|
|
@@ -169,7 +170,7 @@ function createPassSealer(mailboxUid: string, unlocked: UnlockedKeys, signal: Ab
|
|
|
169
170
|
const sealToWrite = result.sealToWrite;
|
|
170
171
|
if (sealToWrite && queued < MAX_SEAL_WRITES_PER_PASS) {
|
|
171
172
|
queued++;
|
|
172
|
-
queue.push(() => sendVerificationSeal(message.uid, sealToWrite));
|
|
173
|
+
queue.push(() => sendVerificationSeal(message.uid, sealToWrite, client));
|
|
173
174
|
pump();
|
|
174
175
|
}
|
|
175
176
|
return result;
|
|
@@ -229,6 +230,9 @@ async function mapWithConcurrency<T, R>(items: T[], limit: number, fn: (item: T)
|
|
|
229
230
|
async function buildEntity(message: Message, sealer: PassSealer): Promise<LocalIndexEntity | undefined | typeof FETCH_FAILED> {
|
|
230
231
|
let rawMime: Awaited<ReturnType<typeof getMessageRawContent>>;
|
|
231
232
|
try {
|
|
233
|
+
// getMessageRawContent() bypasses apiFetch() entirely (it streams message/rfc822, not JSON - see its own doc comment) and does not
|
|
234
|
+
// yet accept an explicit ApiClient at all; threading a per-account client through it is out of scope here (mailApi.ts is not one of
|
|
235
|
+
// this task's files). It still falls back to the default global session even under an ApiClientContext.Provider.
|
|
232
236
|
rawMime = await getMessageRawContent(message.uid);
|
|
233
237
|
} catch {
|
|
234
238
|
// Distinct from "undecryptable": a message that couldn't even be fetched may well be searchable,
|
|
@@ -296,6 +300,7 @@ export async function buildLocalIndex(
|
|
|
296
300
|
unlocked: UnlockedKeys,
|
|
297
301
|
folders: Folder[],
|
|
298
302
|
windowConfig: LocalIndexWindowConfig = { timeFloorMonths: WEB_TIME_FLOOR_MONTHS, byteBudgetBytes: getLocalIndexByteBudget() },
|
|
303
|
+
client?: ApiClient,
|
|
299
304
|
): Promise<void> {
|
|
300
305
|
// At most one pass per mailbox: a newer one cancels the older and waits for it to wind down first.
|
|
301
306
|
const previous = activeBuilds.get(mailboxUid);
|
|
@@ -305,7 +310,7 @@ export async function buildLocalIndex(
|
|
|
305
310
|
previous.controller.abort();
|
|
306
311
|
await previous.settled;
|
|
307
312
|
}
|
|
308
|
-
await runBuildPass(mailboxUid, unlocked, folders, windowConfig, controller.signal);
|
|
313
|
+
await runBuildPass(mailboxUid, unlocked, folders, windowConfig, controller.signal, client);
|
|
309
314
|
})();
|
|
310
315
|
const entry: ActiveBuild = { controller, settled: run.catch(() => undefined) };
|
|
311
316
|
activeBuilds.set(mailboxUid, entry);
|
|
@@ -350,7 +355,14 @@ type WalkOutcome =
|
|
|
350
355
|
/** A listing failed - nothing can be concluded about the rest of the folder. */
|
|
351
356
|
| "failed";
|
|
352
357
|
|
|
353
|
-
async function runBuildPass(
|
|
358
|
+
async function runBuildPass(
|
|
359
|
+
mailboxUid: string,
|
|
360
|
+
unlocked: UnlockedKeys,
|
|
361
|
+
folders: Folder[],
|
|
362
|
+
windowConfig: LocalIndexWindowConfig,
|
|
363
|
+
signal: AbortSignal,
|
|
364
|
+
client: ApiClient | undefined,
|
|
365
|
+
): Promise<void> {
|
|
354
366
|
const generation = nextLocalIndexGeneration();
|
|
355
367
|
const indexKey = await deriveLocalIndexKey(unlocked.masterKey, mailboxUid);
|
|
356
368
|
signal.throwIfAborted();
|
|
@@ -368,7 +380,7 @@ async function runBuildPass(mailboxUid: string, unlocked: UnlockedKeys, folders:
|
|
|
368
380
|
// count, no listing/fetch failure and no budget cut-off - the only case where coverage can be used to
|
|
369
381
|
// narrow Tier 3.
|
|
370
382
|
let complete = true;
|
|
371
|
-
const sealer = createPassSealer(mailboxUid, unlocked, signal);
|
|
383
|
+
const sealer = createPassSealer(mailboxUid, unlocked, signal, client);
|
|
372
384
|
try {
|
|
373
385
|
if (folders.some((f) => !MESSAGE_FOLDER_TYPES.has(f.type) && !NON_MESSAGE_FOLDER_TYPES.has(f.type))) {
|
|
374
386
|
complete = false;
|
|
@@ -383,7 +395,7 @@ async function runBuildPass(mailboxUid: string, unlocked: UnlockedKeys, folders:
|
|
|
383
395
|
signal.throwIfAborted();
|
|
384
396
|
let messages: Message[];
|
|
385
397
|
try {
|
|
386
|
-
messages = await listMessages(folder.uid, { page, limit: PAGE_SIZE });
|
|
398
|
+
messages = await listMessages(folder.uid, { page, limit: PAGE_SIZE }, client);
|
|
387
399
|
} catch {
|
|
388
400
|
return "failed";
|
|
389
401
|
}
|
|
@@ -427,7 +439,7 @@ async function runBuildPass(mailboxUid: string, unlocked: UnlockedKeys, folders:
|
|
|
427
439
|
/** Each folder's current total, or `undefined` if the listing failed. */
|
|
428
440
|
async function folderTotals(): Promise<Map<string, number> | undefined> {
|
|
429
441
|
try {
|
|
430
|
-
return new Map((await listFolders(mailboxUid)).map((f) => [f.uid, f.totalCount]));
|
|
442
|
+
return new Map((await listFolders(mailboxUid, client)).map((f) => [f.uid, f.totalCount]));
|
|
431
443
|
} catch {
|
|
432
444
|
return undefined;
|
|
433
445
|
}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* already uniformly random) and avoids needing to persist, transmit, or ever lose a random salt just to
|
|
15
15
|
* re-derive the same key on the next unlock.
|
|
16
16
|
*/
|
|
17
|
-
import { hkdfDerive } from "
|
|
17
|
+
import { hkdfDerive } from "../../../lib/crypto/masterKey.js";
|
|
18
18
|
|
|
19
19
|
/** Fixed, non-secret HKDF salt - see this module's own doc comment for why a fixed salt is fine here. */
|
|
20
20
|
const FIXED_SALT = new TextEncoder().encode("rapidmx-local-search-index-v1");
|
|
@@ -25,8 +25,20 @@
|
|
|
25
25
|
* every pending request and drops the module-level `worker` reference so the next `call()` spawns a
|
|
26
26
|
* replacement. `searchTier2.ts` additionally races its own calls against a timeout, since a Worker that's
|
|
27
27
|
* merely stuck (not crashed) posts no `error` event at all.
|
|
28
|
+
*
|
|
29
|
+
* **Swappable transport**: everything above is specific to this one implementation - the Worker/OPFS-backed
|
|
30
|
+
* default. Every function this module exports below (`initLocalIndex`, `searchLocal`, `destroyLocalIndex`, ...)
|
|
31
|
+
* is a thin delegator to whichever `LocalIndexTransport` (`localIndexTransport.ts`) is "current," which defaults
|
|
32
|
+
* to `workerLocalIndexTransport` - this file's own implementation, wrapped - and can be swapped once, at startup,
|
|
33
|
+
* via `setLocalIndexTransport()`. A host app with a different storage backend (no Worker, no OPFS, no WASM at
|
|
34
|
+
* all - `tauri-client`'s native SQLCipher/`rusqlite` index) installs its own transport there; every call site
|
|
35
|
+
* that already goes through this file's exports (`searchTier2.ts`, `LocalIndexLifecycle.tsx`,
|
|
36
|
+
* `localIndexBuilder.ts`, and the rest) then runs against that backend instead, unmodified. The three
|
|
37
|
+
* module-level constants below (`SIGN_OUT_CHANNEL`, `PENDING_DELETIONS_KEY`, `DESTROY_ALL_TIMEOUT_MS`) remain
|
|
38
|
+
* plain exports, not part of the swappable interface - they name this one transport's own cross-tab/localStorage
|
|
39
|
+
* mechanics, which a different transport has no reason to share.
|
|
28
40
|
*/
|
|
29
|
-
import type { ParsedSearchQuery } from "
|
|
41
|
+
import type { ParsedSearchQuery } from "../../../lib/search/queryGrammar.js";
|
|
30
42
|
import type {
|
|
31
43
|
Coverage,
|
|
32
44
|
DestroyParams,
|
|
@@ -48,6 +60,7 @@ import type {
|
|
|
48
60
|
} from "./localIndexWorker.js";
|
|
49
61
|
import type { LocalIndexEntity } from "./localIndexSchema.js";
|
|
50
62
|
import { removeLocalIndexDirectories, removeLocalIndexDirectory } from "./localIndexStorage.js";
|
|
63
|
+
import type { LocalIndexTransport, PruneLocalEntitiesOptions, SetLocalIndexBuildingCompletion } from "./localIndexTransport.js";
|
|
51
64
|
|
|
52
65
|
let worker: Worker | undefined;
|
|
53
66
|
let nextRequestId = 1;
|
|
@@ -61,7 +74,7 @@ const initializedMailboxes = new Set<string>();
|
|
|
61
74
|
let generationCounter = 0;
|
|
62
75
|
|
|
63
76
|
/** A fresh generation - see this module's doc comment. */
|
|
64
|
-
|
|
77
|
+
function nextLocalIndexGenerationImpl(): number {
|
|
65
78
|
generationCounter += 1;
|
|
66
79
|
return generationCounter;
|
|
67
80
|
}
|
|
@@ -141,7 +154,7 @@ function listenForSignOut(): void {
|
|
|
141
154
|
async function closeEverythingInThisTab(): Promise<void> {
|
|
142
155
|
signedOut = true;
|
|
143
156
|
initializedMailboxes.clear();
|
|
144
|
-
await call("destroyAll", { generation:
|
|
157
|
+
await call("destroyAll", { generation: nextLocalIndexGenerationImpl() } satisfies GenerationParams).catch(() => undefined);
|
|
145
158
|
}
|
|
146
159
|
|
|
147
160
|
function call<T>(method: LocalIndexRequest["method"], params?: unknown): Promise<T> {
|
|
@@ -194,7 +207,7 @@ let pendingRetry: Promise<void> | undefined;
|
|
|
194
207
|
|
|
195
208
|
/** Retries every deletion an earlier page load couldn't finish. Runs once per page load (memoized), before
|
|
196
209
|
* this tab's first `init` - so it never races an index this tab itself opens. Never rejects. */
|
|
197
|
-
|
|
210
|
+
function retryPendingLocalIndexDeletionsImpl(): Promise<void> {
|
|
198
211
|
pendingRetry ??= (async () => {
|
|
199
212
|
const uids = readPendingDeletions();
|
|
200
213
|
if (uids.length === 0) {
|
|
@@ -214,8 +227,8 @@ export function retryPendingLocalIndexDeletions(): Promise<void> {
|
|
|
214
227
|
return pendingRetry;
|
|
215
228
|
}
|
|
216
229
|
|
|
217
|
-
|
|
218
|
-
await
|
|
230
|
+
async function initLocalIndexImpl(params: InitParams): Promise<void> {
|
|
231
|
+
await retryPendingLocalIndexDeletionsImpl();
|
|
219
232
|
if (signedOut) {
|
|
220
233
|
throw new Error("Signed out - the local search index is unavailable in this tab.");
|
|
221
234
|
}
|
|
@@ -223,13 +236,13 @@ export async function initLocalIndex(params: InitParams): Promise<void> {
|
|
|
223
236
|
initializedMailboxes.add(params.mailboxUid);
|
|
224
237
|
}
|
|
225
238
|
|
|
226
|
-
|
|
239
|
+
function indexLocalEntitiesImpl(mailboxUid: string, entities: LocalIndexEntity[], generation?: number): Promise<IndexEntitiesResult> {
|
|
227
240
|
return call("indexEntities", { mailboxUid, entities, generation } satisfies IndexEntitiesParams);
|
|
228
241
|
}
|
|
229
242
|
|
|
230
243
|
/** Drops one message from this session's local index (a delete). A no-op for a mailbox not indexed in
|
|
231
244
|
* this tab - a later build pass prunes it instead. Never rejects: best-effort housekeeping. */
|
|
232
|
-
|
|
245
|
+
async function removeLocalEntityImpl(mailboxUid: string, entityUid: string): Promise<void> {
|
|
233
246
|
if (!initializedMailboxes.has(mailboxUid)) {
|
|
234
247
|
return;
|
|
235
248
|
}
|
|
@@ -237,44 +250,35 @@ export async function removeLocalEntity(mailboxUid: string, entityUid: string):
|
|
|
237
250
|
}
|
|
238
251
|
|
|
239
252
|
/** Re-points one indexed message at its new folder (archive, cancel-scheduled-send) so `folder:`-scoped
|
|
240
|
-
* local searches stay correct. Same no-op/never-rejects rules as `
|
|
241
|
-
|
|
253
|
+
* local searches stay correct. Same no-op/never-rejects rules as `removeLocalEntityImpl()`. */
|
|
254
|
+
async function moveLocalEntityImpl(mailboxUid: string, entityUid: string, folderUid: string): Promise<void> {
|
|
242
255
|
if (!initializedMailboxes.has(mailboxUid)) {
|
|
243
256
|
return;
|
|
244
257
|
}
|
|
245
258
|
await call("moveEntity", { mailboxUid, entityUid, folderUid } satisfies MoveEntityParams).catch(() => undefined);
|
|
246
259
|
}
|
|
247
260
|
|
|
248
|
-
|
|
261
|
+
function getIndexedVersionsImpl(mailboxUid: string, entityUids: string[]): Promise<Record<string, string>> {
|
|
249
262
|
return call("indexedVersions", { mailboxUid, entityUids } satisfies IndexedVersionsParams);
|
|
250
263
|
}
|
|
251
264
|
|
|
252
|
-
|
|
253
|
-
mailboxUid: string,
|
|
254
|
-
keepEntityUids: string[],
|
|
255
|
-
since: string | undefined,
|
|
256
|
-
options: { folderUids?: string[]; generation?: number } = {},
|
|
257
|
-
): Promise<number> {
|
|
265
|
+
function pruneLocalEntitiesImpl(mailboxUid: string, keepEntityUids: string[], since: string | undefined, options: PruneLocalEntitiesOptions): Promise<number> {
|
|
258
266
|
return call("pruneEntities", { mailboxUid, keepEntityUids, since, ...options } satisfies PruneEntitiesParams);
|
|
259
267
|
}
|
|
260
268
|
|
|
261
|
-
|
|
269
|
+
function searchLocalImpl(mailboxUid: string, parsed: ParsedSearchQuery, limit: number, offset: number): Promise<LocalSearchPage> {
|
|
262
270
|
return call("search", { mailboxUid, parsed, limit, offset } satisfies SearchParams);
|
|
263
271
|
}
|
|
264
272
|
|
|
265
|
-
|
|
273
|
+
function getLocalCoverageImpl(mailboxUid: string): Promise<Coverage> {
|
|
266
274
|
return call("coverage", mailboxUid);
|
|
267
275
|
}
|
|
268
276
|
|
|
269
|
-
|
|
277
|
+
function setLocalIndexWindowImpl(mailboxUid: string, timeFloorMonths: number, byteBudgetBytes: number, generation?: number): Promise<WindowState> {
|
|
270
278
|
return call("setWindow", { mailboxUid, timeFloorMonths, byteBudgetBytes, generation } satisfies SetWindowParams);
|
|
271
279
|
}
|
|
272
280
|
|
|
273
|
-
|
|
274
|
-
mailboxUid: string,
|
|
275
|
-
building: boolean,
|
|
276
|
-
completion: { complete: boolean; coveredFrom?: string; coveredUntil?: string; generation?: number } = { complete: false },
|
|
277
|
-
): Promise<void> {
|
|
281
|
+
function setLocalIndexBuildingImpl(mailboxUid: string, building: boolean, completion: SetLocalIndexBuildingCompletion): Promise<void> {
|
|
278
282
|
return call("setBuilding", { mailboxUid, building, ...completion } satisfies SetBuildingParams);
|
|
279
283
|
}
|
|
280
284
|
|
|
@@ -283,10 +287,10 @@ export function setLocalIndexBuilding(
|
|
|
283
287
|
* lifecycle hooks where a failure mustn't block key destruction) but resolves `false` - and logs why -
|
|
284
288
|
* when the index could not be removed, e.g. because another tab still has it open; the deletion is then
|
|
285
289
|
* retried on the next page load. */
|
|
286
|
-
|
|
290
|
+
async function destroyLocalIndexImpl(mailboxUid: string): Promise<boolean> {
|
|
287
291
|
updatePendingDeletions((current) => current.add(mailboxUid));
|
|
288
292
|
try {
|
|
289
|
-
await call("destroy", { mailboxUid, generation:
|
|
293
|
+
await call("destroy", { mailboxUid, generation: nextLocalIndexGenerationImpl() } satisfies DestroyParams);
|
|
290
294
|
updatePendingDeletions((current) => current.delete(mailboxUid));
|
|
291
295
|
return true;
|
|
292
296
|
} catch (err) {
|
|
@@ -309,7 +313,7 @@ export const DESTROY_ALL_TIMEOUT_MS = 3_000;
|
|
|
309
313
|
* would be waste), then removes the directories. Anything left behind is retried on the next load. Resolves
|
|
310
314
|
* `true` when everything was removed within `timeoutMs`; never rejects.
|
|
311
315
|
*/
|
|
312
|
-
|
|
316
|
+
async function destroyAllLocalIndexesImpl(timeoutMs: number): Promise<boolean> {
|
|
313
317
|
signedOut = true;
|
|
314
318
|
writePendingDeletions([ALL_INDEXES]);
|
|
315
319
|
try {
|
|
@@ -320,7 +324,7 @@ export async function destroyAllLocalIndexes(timeoutMs = DESTROY_ALL_TIMEOUT_MS)
|
|
|
320
324
|
const work = (async () => {
|
|
321
325
|
let ok = true;
|
|
322
326
|
if (worker) {
|
|
323
|
-
const { failed } = await call<{ failed: string[] }>("destroyAll", { generation:
|
|
327
|
+
const { failed } = await call<{ failed: string[] }>("destroyAll", { generation: nextLocalIndexGenerationImpl() } satisfies GenerationParams).catch(() => ({
|
|
324
328
|
failed: ["(worker)"],
|
|
325
329
|
}));
|
|
326
330
|
ok = failed.length === 0;
|
|
@@ -344,6 +348,122 @@ export async function destroyAllLocalIndexes(timeoutMs = DESTROY_ALL_TIMEOUT_MS)
|
|
|
344
348
|
|
|
345
349
|
/** Removes local indexes for mailboxes outside `accessibleMailboxUids` - e.g. left behind by a different
|
|
346
350
|
* user who signed in on this device without signing out. Never rejects. */
|
|
347
|
-
|
|
351
|
+
async function pruneInaccessibleLocalIndexesImpl(accessibleMailboxUids: Iterable<string>): Promise<void> {
|
|
348
352
|
await removeLocalIndexDirectories(new Set(accessibleMailboxUids)).catch(() => undefined);
|
|
349
353
|
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* This file's own Worker/OPFS-backed implementation, wrapping the functions above - see this module's own doc
|
|
357
|
+
* comment ("Swappable transport"). The default `LocalIndexTransport` (`localIndexTransport.ts`); every export
|
|
358
|
+
* below delegates to whichever transport `setLocalIndexTransport()` has made current, which starts out as this
|
|
359
|
+
* one.
|
|
360
|
+
*/
|
|
361
|
+
export const workerLocalIndexTransport: LocalIndexTransport = {
|
|
362
|
+
nextGeneration: nextLocalIndexGenerationImpl,
|
|
363
|
+
init: initLocalIndexImpl,
|
|
364
|
+
indexEntities: indexLocalEntitiesImpl,
|
|
365
|
+
removeEntity: removeLocalEntityImpl,
|
|
366
|
+
moveEntity: moveLocalEntityImpl,
|
|
367
|
+
indexedVersions: getIndexedVersionsImpl,
|
|
368
|
+
pruneEntities: pruneLocalEntitiesImpl,
|
|
369
|
+
search: searchLocalImpl,
|
|
370
|
+
coverage: getLocalCoverageImpl,
|
|
371
|
+
setWindow: setLocalIndexWindowImpl,
|
|
372
|
+
setBuilding: setLocalIndexBuildingImpl,
|
|
373
|
+
destroy: destroyLocalIndexImpl,
|
|
374
|
+
destroyAll: destroyAllLocalIndexesImpl,
|
|
375
|
+
pruneInaccessible: pruneInaccessibleLocalIndexesImpl,
|
|
376
|
+
retryPendingDeletions: retryPendingLocalIndexDeletionsImpl,
|
|
377
|
+
};
|
|
378
|
+
|
|
379
|
+
let currentTransport: LocalIndexTransport = workerLocalIndexTransport;
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Swaps the `LocalIndexTransport` every export below delegates to - see this module's own doc comment
|
|
383
|
+
* ("Swappable transport"). Defaults to `workerLocalIndexTransport`; a host app with a different storage backend
|
|
384
|
+
* (e.g. `tauri-client`'s native SQLCipher/`rusqlite` index) calls this once, at startup, before any of this
|
|
385
|
+
* module's other exports are used, so every call site already wired through them runs against that backend
|
|
386
|
+
* instead - unmodified.
|
|
387
|
+
*/
|
|
388
|
+
export function setLocalIndexTransport(transport: LocalIndexTransport): void {
|
|
389
|
+
currentTransport = transport;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/** A fresh generation - see this module's doc comment. */
|
|
393
|
+
export function nextLocalIndexGeneration(): number {
|
|
394
|
+
return currentTransport.nextGeneration();
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
export function initLocalIndex(params: InitParams): Promise<void> {
|
|
398
|
+
return currentTransport.init(params);
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
export function indexLocalEntities(mailboxUid: string, entities: LocalIndexEntity[], generation?: number): Promise<IndexEntitiesResult> {
|
|
402
|
+
return currentTransport.indexEntities(mailboxUid, entities, generation);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/** Drops one message from this session's local index (a delete). A no-op for a mailbox not indexed in
|
|
406
|
+
* this tab - a later build pass prunes it instead. Never rejects: best-effort housekeeping. */
|
|
407
|
+
export function removeLocalEntity(mailboxUid: string, entityUid: string): Promise<void> {
|
|
408
|
+
return currentTransport.removeEntity(mailboxUid, entityUid);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/** Re-points one indexed message at its new folder (archive, cancel-scheduled-send) so `folder:`-scoped
|
|
412
|
+
* local searches stay correct. Same no-op/never-rejects rules as `removeLocalEntity()`. */
|
|
413
|
+
export function moveLocalEntity(mailboxUid: string, entityUid: string, folderUid: string): Promise<void> {
|
|
414
|
+
return currentTransport.moveEntity(mailboxUid, entityUid, folderUid);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
export function getIndexedVersions(mailboxUid: string, entityUids: string[]): Promise<Record<string, string>> {
|
|
418
|
+
return currentTransport.indexedVersions(mailboxUid, entityUids);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
export function pruneLocalEntities(
|
|
422
|
+
mailboxUid: string,
|
|
423
|
+
keepEntityUids: string[],
|
|
424
|
+
since: string | undefined,
|
|
425
|
+
options: PruneLocalEntitiesOptions = {},
|
|
426
|
+
): Promise<number> {
|
|
427
|
+
return currentTransport.pruneEntities(mailboxUid, keepEntityUids, since, options);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
export function searchLocal(mailboxUid: string, parsed: ParsedSearchQuery, limit: number, offset = 0): Promise<LocalSearchPage> {
|
|
431
|
+
return currentTransport.search(mailboxUid, parsed, limit, offset);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
export function getLocalCoverage(mailboxUid: string): Promise<Coverage> {
|
|
435
|
+
return currentTransport.coverage(mailboxUid);
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
export function setLocalIndexWindow(mailboxUid: string, timeFloorMonths: number, byteBudgetBytes: number, generation?: number): Promise<WindowState> {
|
|
439
|
+
return currentTransport.setWindow(mailboxUid, timeFloorMonths, byteBudgetBytes, generation);
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
export function setLocalIndexBuilding(mailboxUid: string, building: boolean, completion: SetLocalIndexBuildingCompletion = { complete: false }): Promise<void> {
|
|
443
|
+
return currentTransport.setBuilding(mailboxUid, building, completion);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/** Destroys one mailbox's local index - spec §11 "MUST be destroyed on the same events that destroy private
|
|
447
|
+
* keys." Never rejects (it's called from lifecycle hooks where a failure mustn't block key destruction) but
|
|
448
|
+
* resolves `false` when the index could not be removed - see the current transport's own doc comment for what
|
|
449
|
+
* that means for it (the Worker transport also logs why, and retries on the next page load). */
|
|
450
|
+
export function destroyLocalIndex(mailboxUid: string): Promise<boolean> {
|
|
451
|
+
return currentTransport.destroy(mailboxUid);
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
/** Destroys **every** local index this transport knows of - not just the mailboxes this session opened - e.g.
|
|
455
|
+
* on sign-out. Never rejects. Resolves `true` only if everything was removed within `timeoutMs`. */
|
|
456
|
+
export function destroyAllLocalIndexes(timeoutMs = DESTROY_ALL_TIMEOUT_MS): Promise<boolean> {
|
|
457
|
+
return currentTransport.destroyAll(timeoutMs);
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
/** Removes local indexes for mailboxes outside `accessibleMailboxUids` - e.g. left behind by a different
|
|
461
|
+
* user who signed in on this device without signing out. Never rejects. */
|
|
462
|
+
export function pruneInaccessibleLocalIndexes(accessibleMailboxUids: Iterable<string>): Promise<void> {
|
|
463
|
+
return currentTransport.pruneInaccessible(accessibleMailboxUids);
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/** Retries every deletion an earlier session couldn't finish. Never rejects. */
|
|
467
|
+
export function retryPendingLocalIndexDeletions(): Promise<void> {
|
|
468
|
+
return currentTransport.retryPendingDeletions();
|
|
469
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
+
/**
|
|
6
|
+
* The Tier 2 local index's transport contract - every operation `localIndexRpcClient.ts`'s public functions perform
|
|
7
|
+
* against whatever actually stores and queries the index. Type-only: this module declares the shape, it never runs
|
|
8
|
+
* anything itself.
|
|
9
|
+
*
|
|
10
|
+
* The browser/Electron path is backed by `workerLocalIndexTransport` (`localIndexRpcClient.ts`, exported from that
|
|
11
|
+
* same file) - a Promise/RPC wrapper around a Worker running `@journeyapps/wa-sqlite` over OPFS. That module's own
|
|
12
|
+
* doc comment covers the Worker/RPC mechanics this interface abstracts away (generations, cross-tab sign-out,
|
|
13
|
+
* retried deletions, Worker-crash recovery); none of that is part of this contract - it is that transport's own
|
|
14
|
+
* implementation detail, not something a second implementation needs to reproduce.
|
|
15
|
+
*
|
|
16
|
+
* A host app with no Worker/OPFS/WASM at all - `tauri-client`, backed instead by real SQLCipher-encrypted SQLite
|
|
17
|
+
* via a Rust `rusqlite` `invoke()` command - implements this same shape and installs it once at startup via
|
|
18
|
+
* `localIndexRpcClient.ts`'s `setLocalIndexTransport()`. Every call site already going through that file's exported
|
|
19
|
+
* functions (`searchTier2.ts`, `LocalIndexLifecycle.tsx`, `localIndexBuilder.ts`, and the rest) then runs against
|
|
20
|
+
* the native backend instead, unmodified - those exports are thin delegators to whichever transport is current.
|
|
21
|
+
*
|
|
22
|
+
* Method names mirror the Worker's own RPC method names (`localIndexWorker.ts`'s `LocalIndexRequest["method"]`),
|
|
23
|
+
* not `localIndexRpcClient.ts`'s public function names - a second implementation has no reason to repeat that
|
|
24
|
+
* file's "Local"-infixed naming (`indexLocalEntities`, `getLocalCoverage`, ...) for its own methods.
|
|
25
|
+
*
|
|
26
|
+
* Every method takes exactly the arguments its `localIndexRpcClient.ts` counterpart already resolves down to -
|
|
27
|
+
* where that file's own export has a default parameter (`offset = 0`, `options = {}`, `timeoutMs = DESTROY_ALL_TIMEOUT_MS`),
|
|
28
|
+
* this interface takes the resolved value as required, so an implementation never has to reproduce that default
|
|
29
|
+
* itself.
|
|
30
|
+
*/
|
|
31
|
+
import type { ParsedSearchQuery } from "../../../lib/search/queryGrammar.js";
|
|
32
|
+
import type { Coverage, IndexEntitiesResult, InitParams, LocalSearchPage, WindowState } from "./localIndexWorker.js";
|
|
33
|
+
import type { LocalIndexEntity } from "./localIndexSchema.js";
|
|
34
|
+
|
|
35
|
+
/** `LocalIndexTransport.pruneEntities()`'s options - which folders' unseen rows may be pruned (see
|
|
36
|
+
* `localIndexBuilder.ts`'s own "reliable" folders), and this pass's generation tag. */
|
|
37
|
+
export interface PruneLocalEntitiesOptions {
|
|
38
|
+
folderUids?: string[];
|
|
39
|
+
generation?: number;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** `LocalIndexTransport.setBuilding()`'s completion summary - whether a build pass just finished, and how much of
|
|
43
|
+
* the mailbox it covered (`Coverage.complete`/`coveredFrom`/`coveredUntil`'s own source). */
|
|
44
|
+
export interface SetLocalIndexBuildingCompletion {
|
|
45
|
+
complete: boolean;
|
|
46
|
+
coveredFrom?: string;
|
|
47
|
+
coveredUntil?: string;
|
|
48
|
+
generation?: number;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** See this module's own doc comment. */
|
|
52
|
+
export interface LocalIndexTransport {
|
|
53
|
+
/** A fresh, monotonic generation from this transport's own counter. */
|
|
54
|
+
nextGeneration(): number;
|
|
55
|
+
/** Opens (or reuses) this mailbox's index connection. */
|
|
56
|
+
init(params: InitParams): Promise<void>;
|
|
57
|
+
/** Indexes (inserts or updates) the given entities, applying byte-budget eviction as needed. */
|
|
58
|
+
indexEntities(mailboxUid: string, entities: LocalIndexEntity[], generation?: number): Promise<IndexEntitiesResult>;
|
|
59
|
+
/** Drops one indexed entity. */
|
|
60
|
+
removeEntity(mailboxUid: string, entityUid: string): Promise<void>;
|
|
61
|
+
/** Re-points one indexed entity at its new folder. */
|
|
62
|
+
moveEntity(mailboxUid: string, entityUid: string, folderUid: string): Promise<void>;
|
|
63
|
+
/** The indexed version marker (`Message.version` + folder) currently stored for each of the given entity uids. */
|
|
64
|
+
indexedVersions(mailboxUid: string, entityUids: string[]): Promise<Record<string, string>>;
|
|
65
|
+
/** Removes indexed rows outside `keepEntityUids` (and `since`/`options.folderUids`'s own scope). Returns how many rows were pruned. */
|
|
66
|
+
pruneEntities(mailboxUid: string, keepEntityUids: string[], since: string | undefined, options: PruneLocalEntitiesOptions): Promise<number>;
|
|
67
|
+
/** Runs a parsed query against the index, already scored and paginated. */
|
|
68
|
+
search(mailboxUid: string, parsed: ParsedSearchQuery, limit: number, offset: number): Promise<LocalSearchPage>;
|
|
69
|
+
/** How much of the mailbox the index currently covers. */
|
|
70
|
+
coverage(mailboxUid: string): Promise<Coverage>;
|
|
71
|
+
/** Sets this mailbox's window (time floor + byte budget), applying eviction immediately if it shrank. */
|
|
72
|
+
setWindow(mailboxUid: string, timeFloorMonths: number, byteBudgetBytes: number, generation?: number): Promise<WindowState>;
|
|
73
|
+
/** Flags whether a build pass is running, and - once it finishes - how much of the mailbox it covered. */
|
|
74
|
+
setBuilding(mailboxUid: string, building: boolean, completion: SetLocalIndexBuildingCompletion): Promise<void>;
|
|
75
|
+
/** Destroys one mailbox's index. Never rejects; resolves `false` (logging why) when it could not be removed. */
|
|
76
|
+
destroy(mailboxUid: string): Promise<boolean>;
|
|
77
|
+
/** Destroys every index this transport knows of, e.g. on sign-out. Never rejects; resolves `true` only if
|
|
78
|
+
* everything was removed within `timeoutMs`. */
|
|
79
|
+
destroyAll(timeoutMs: number): Promise<boolean>;
|
|
80
|
+
/** Removes indexes for mailboxes outside `accessibleMailboxUids`. Never rejects. */
|
|
81
|
+
pruneInaccessible(accessibleMailboxUids: Iterable<string>): Promise<void>;
|
|
82
|
+
/** Retries any deletion an earlier session couldn't finish. Never rejects. */
|
|
83
|
+
retryPendingDeletions(): Promise<void>;
|
|
84
|
+
}
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
*/
|
|
32
32
|
import SQLiteESMFactory from "@journeyapps/wa-sqlite/dist/wa-sqlite-async.mjs";
|
|
33
33
|
import * as SQLite from "@journeyapps/wa-sqlite";
|
|
34
|
-
import type { ParsedSearchQuery } from "
|
|
34
|
+
import type { ParsedSearchQuery } from "../../../lib/search/queryGrammar.js";
|
|
35
35
|
import { EncryptingVFS } from "./localIndexVFS.js";
|
|
36
36
|
import { listLocalIndexMailboxUids, poolNameFor, removeLocalIndexDirectory } from "./localIndexStorage.js";
|
|
37
37
|
import {
|