@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
|
@@ -21,7 +21,8 @@
|
|
|
21
21
|
* handles that case itself via `destroyAllLocalIndexes()`.
|
|
22
22
|
*/
|
|
23
23
|
import { useEffect, useRef } from "react";
|
|
24
|
-
import { getUnlockedKeys } from "
|
|
24
|
+
import { getUnlockedKeys } from "../../../lib/crypto/keySession.js";
|
|
25
|
+
import { useApiClient } from "../../../lib/util/apiClientContext.js";
|
|
25
26
|
/**
|
|
26
27
|
* The index builder (with the message security code it decrypts through - PKI.js and the ASN.1/X.509 libraries, over half a
|
|
27
28
|
* megabyte) is loaded only once a mailbox is actually unlocked and a build is due, so an inbox that never unlocks - the
|
|
@@ -37,14 +38,18 @@ import { destroyLocalIndex, pruneInaccessibleLocalIndexes } from "./localIndexRp
|
|
|
37
38
|
export const POLL_INTERVAL_MS = 5000;
|
|
38
39
|
/** Renders nothing - pure side-effect component, mounted by `MailShell.tsx`. */
|
|
39
40
|
export default function LocalIndexLifecycle({ mailboxUid, folders, accessibleMailboxUids }) {
|
|
41
|
+
// The explicit ApiClient (from useApiClient()) this component is rendered under - undefined for every existing caller (the SSR web/admin
|
|
42
|
+
// apps, Electron), which keeps building the index against the default global cookie-based session exactly as before. A native,
|
|
43
|
+
// multi-account host that renders this under an ApiClientContext.Provider gets its own account's client threaded through instead.
|
|
44
|
+
const client = useApiClient();
|
|
40
45
|
// mailboxUid -> whether it was unlocked at the last check. An entry exists for every mailbox whose
|
|
41
46
|
// build this component started; only ever changed by a real observed transition, never reset by an
|
|
42
47
|
// effect re-run.
|
|
43
48
|
const trackedRef = useRef(new Map());
|
|
44
|
-
// The latest props, for the long-lived polling interval below.
|
|
45
|
-
const latestRef = useRef({ mailboxUid, folders });
|
|
46
|
-
latestRef.current = { mailboxUid, folders };
|
|
47
|
-
function startBuildIfUnlocked(targetMailboxUid, targetFolders) {
|
|
49
|
+
// The latest props (and client), for the long-lived polling interval below.
|
|
50
|
+
const latestRef = useRef({ mailboxUid, folders, client });
|
|
51
|
+
latestRef.current = { mailboxUid, folders, client };
|
|
52
|
+
function startBuildIfUnlocked(targetMailboxUid, targetFolders, targetClient) {
|
|
48
53
|
const unlocked = getUnlockedKeys(targetMailboxUid);
|
|
49
54
|
if (!unlocked || targetFolders.length === 0 || trackedRef.current.get(targetMailboxUid)) {
|
|
50
55
|
return;
|
|
@@ -53,14 +58,14 @@ export default function LocalIndexLifecycle({ mailboxUid, folders, accessibleMai
|
|
|
53
58
|
// Never an unhandled rejection - a broken local index is best-effort infrastructure, not a build
|
|
54
59
|
// the rest of the app depends on.
|
|
55
60
|
loadBuilder()
|
|
56
|
-
.then(({ buildLocalIndex }) => buildLocalIndex(targetMailboxUid, unlocked, targetFolders))
|
|
61
|
+
.then(({ buildLocalIndex }) => buildLocalIndex(targetMailboxUid, unlocked, targetFolders, undefined, targetClient))
|
|
57
62
|
.catch(() => undefined);
|
|
58
63
|
}
|
|
59
64
|
useEffect(() => {
|
|
60
65
|
if (mailboxUid) {
|
|
61
|
-
startBuildIfUnlocked(mailboxUid, folders);
|
|
66
|
+
startBuildIfUnlocked(mailboxUid, folders, client);
|
|
62
67
|
}
|
|
63
|
-
}, [mailboxUid, folders]);
|
|
68
|
+
}, [mailboxUid, folders, client]);
|
|
64
69
|
useEffect(() => {
|
|
65
70
|
const interval = setInterval(() => {
|
|
66
71
|
for (const [trackedUid, wasUnlocked] of trackedRef.current) {
|
|
@@ -76,9 +81,9 @@ export default function LocalIndexLifecycle({ mailboxUid, folders, accessibleMai
|
|
|
76
81
|
}
|
|
77
82
|
}
|
|
78
83
|
// The active mailbox was (re-)unlocked since the last check, e.g. via an on-demand unlock prompt.
|
|
79
|
-
const { mailboxUid: activeUid, folders: activeFolders } = latestRef.current;
|
|
84
|
+
const { mailboxUid: activeUid, folders: activeFolders, client: activeClient } = latestRef.current;
|
|
80
85
|
if (activeUid) {
|
|
81
|
-
startBuildIfUnlocked(activeUid, activeFolders);
|
|
86
|
+
startBuildIfUnlocked(activeUid, activeFolders, activeClient);
|
|
82
87
|
}
|
|
83
88
|
}, POLL_INTERVAL_MS);
|
|
84
89
|
return () => clearInterval(interval);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SearchResult } from "
|
|
1
|
+
import type { SearchResult } from "../../../lib/search/searchApi.js";
|
|
2
2
|
/**
|
|
3
3
|
* 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
|
|
4
4
|
* minute for a timeout; nothing else writes to it.
|
|
@@ -10,8 +10,8 @@
|
|
|
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 { normalizeServerScores } from "
|
|
13
|
+
import { ApiRequestError } from "../../../lib/util/api.js";
|
|
14
|
+
import { normalizeServerScores } from "../../../lib/search/searchScoring.js";
|
|
15
15
|
/**
|
|
16
16
|
* 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
|
|
17
17
|
* minute for a timeout; nothing else writes to it.
|
|
@@ -31,8 +31,9 @@
|
|
|
31
31
|
* seals nothing. Signed-only (unencrypted) messages aren't sealed here: this pass never fetches their raw MIME (see
|
|
32
32
|
* above), and fetching it only to seal would cost a download per message; they are sealed when opened.
|
|
33
33
|
*/
|
|
34
|
-
import { type Folder } from "
|
|
35
|
-
import type { UnlockedKeys } from "
|
|
34
|
+
import { type Folder } from "../../../lib/mail/mailApi.js";
|
|
35
|
+
import type { UnlockedKeys } from "../../../lib/crypto/keySession.js";
|
|
36
|
+
import type { ApiClient } from "../../../lib/util/api.js";
|
|
36
37
|
/** §11's Window Sizing table's time-floor column - explicitly unvalidated starting-point default per the
|
|
37
38
|
* spec's own §16 "Measurement Task" ("cannot be supplied by design work... MUST NOT be treated as
|
|
38
39
|
* validated"). Used as-is rather than invented/adjusted here. Not user-adjustable today (unlike the byte
|
|
@@ -78,7 +79,7 @@ export declare const MAX_SEAL_WRITES_PER_PASS = 200;
|
|
|
78
79
|
* preference change in Settings takes effect starting with this mailbox's next build pass (its next
|
|
79
80
|
* unlock), without requiring a reload.
|
|
80
81
|
*/
|
|
81
|
-
export declare function buildLocalIndex(mailboxUid: string, unlocked: UnlockedKeys, folders: Folder[], windowConfig?: LocalIndexWindowConfig): Promise<void>;
|
|
82
|
+
export declare function buildLocalIndex(mailboxUid: string, unlocked: UnlockedKeys, folders: Folder[], windowConfig?: LocalIndexWindowConfig, client?: ApiClient): Promise<void>;
|
|
82
83
|
/** Stops a mailbox's running build pass, if any (e.g. its keys were just destroyed), resolving once it has
|
|
83
84
|
* wound down. The Worker independently rejects the pass's later calls once the index is destroyed (see
|
|
84
85
|
* `GenerationParams`); this just stops the fetching and decrypting too. Never rejects. */
|
|
@@ -35,8 +35,8 @@
|
|
|
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 } from "
|
|
39
|
-
import { evaluateMessageSecurity, evaluateMessageSecurityWithSeal } from "
|
|
38
|
+
import { getMessageRawContent, listFolders, listMessages } from "../../../lib/mail/mailApi.js";
|
|
39
|
+
import { evaluateMessageSecurity, evaluateMessageSecurityWithSeal } from "../../../lib/crypto/messageSecurity.js";
|
|
40
40
|
import { getPinnedSignerFingerprints } from "../components/mail/pinnedSigners.js";
|
|
41
41
|
import { currentVerificationSeal, readVaultGeneration, sendVerificationSeal, verificationSealPending } from "../components/mail/verificationSeals.js";
|
|
42
42
|
import { getIndexedVersions, indexLocalEntities, initLocalIndex, nextLocalIndexGeneration, pruneLocalEntities, setLocalIndexBuilding, setLocalIndexWindow, } from "./localIndexRpcClient.js";
|
|
@@ -75,7 +75,7 @@ export const FETCH_CONCURRENCY = 6;
|
|
|
75
75
|
export const SEAL_WRITE_CONCURRENCY = 2;
|
|
76
76
|
/** The most verification seals one pass writes. */
|
|
77
77
|
export const MAX_SEAL_WRITES_PER_PASS = 200;
|
|
78
|
-
function createPassSealer(mailboxUid, unlocked, signal) {
|
|
78
|
+
function createPassSealer(mailboxUid, unlocked, signal, client) {
|
|
79
79
|
let generation;
|
|
80
80
|
const pins = new Map();
|
|
81
81
|
const queue = [];
|
|
@@ -83,12 +83,12 @@ function createPassSealer(mailboxUid, unlocked, signal) {
|
|
|
83
83
|
let active = 0;
|
|
84
84
|
let idle;
|
|
85
85
|
const stopped = () => signal.aborted || !!unlocked.destroyed;
|
|
86
|
-
const vaultGeneration = () => (generation ?? (generation = readVaultGeneration(mailboxUid)));
|
|
86
|
+
const vaultGeneration = () => (generation ?? (generation = readVaultGeneration(mailboxUid, client)));
|
|
87
87
|
const pinsFor = (address) => {
|
|
88
88
|
const key = address.toLowerCase();
|
|
89
89
|
let entry = pins.get(key);
|
|
90
90
|
if (!entry) {
|
|
91
|
-
entry = getPinnedSignerFingerprints(mailboxUid, address).then((fingerprints) => (fingerprints.length > 0 ? fingerprints : undefined), () => undefined);
|
|
91
|
+
entry = getPinnedSignerFingerprints(mailboxUid, address, client).then((fingerprints) => (fingerprints.length > 0 ? fingerprints : undefined), () => undefined);
|
|
92
92
|
pins.set(key, entry);
|
|
93
93
|
}
|
|
94
94
|
return entry;
|
|
@@ -126,7 +126,7 @@ function createPassSealer(mailboxUid, unlocked, signal) {
|
|
|
126
126
|
const sealToWrite = result.sealToWrite;
|
|
127
127
|
if (sealToWrite && queued < MAX_SEAL_WRITES_PER_PASS) {
|
|
128
128
|
queued++;
|
|
129
|
-
queue.push(() => sendVerificationSeal(message.uid, sealToWrite));
|
|
129
|
+
queue.push(() => sendVerificationSeal(message.uid, sealToWrite, client));
|
|
130
130
|
pump();
|
|
131
131
|
}
|
|
132
132
|
return result;
|
|
@@ -178,6 +178,9 @@ async function mapWithConcurrency(items, limit, fn) {
|
|
|
178
178
|
async function buildEntity(message, sealer) {
|
|
179
179
|
let rawMime;
|
|
180
180
|
try {
|
|
181
|
+
// getMessageRawContent() bypasses apiFetch() entirely (it streams message/rfc822, not JSON - see its own doc comment) and does not
|
|
182
|
+
// 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
|
|
183
|
+
// this task's files). It still falls back to the default global session even under an ApiClientContext.Provider.
|
|
181
184
|
rawMime = await getMessageRawContent(message.uid);
|
|
182
185
|
}
|
|
183
186
|
catch {
|
|
@@ -241,7 +244,7 @@ async function buildEntity(message, sealer) {
|
|
|
241
244
|
* preference change in Settings takes effect starting with this mailbox's next build pass (its next
|
|
242
245
|
* unlock), without requiring a reload.
|
|
243
246
|
*/
|
|
244
|
-
export async function buildLocalIndex(mailboxUid, unlocked, folders, windowConfig = { timeFloorMonths: WEB_TIME_FLOOR_MONTHS, byteBudgetBytes: getLocalIndexByteBudget() }) {
|
|
247
|
+
export async function buildLocalIndex(mailboxUid, unlocked, folders, windowConfig = { timeFloorMonths: WEB_TIME_FLOOR_MONTHS, byteBudgetBytes: getLocalIndexByteBudget() }, client) {
|
|
245
248
|
// At most one pass per mailbox: a newer one cancels the older and waits for it to wind down first.
|
|
246
249
|
const previous = activeBuilds.get(mailboxUid);
|
|
247
250
|
const controller = new AbortController();
|
|
@@ -250,7 +253,7 @@ export async function buildLocalIndex(mailboxUid, unlocked, folders, windowConfi
|
|
|
250
253
|
previous.controller.abort();
|
|
251
254
|
await previous.settled;
|
|
252
255
|
}
|
|
253
|
-
await runBuildPass(mailboxUid, unlocked, folders, windowConfig, controller.signal);
|
|
256
|
+
await runBuildPass(mailboxUid, unlocked, folders, windowConfig, controller.signal, client);
|
|
254
257
|
})();
|
|
255
258
|
const entry = { controller, settled: run.catch(() => undefined) };
|
|
256
259
|
activeBuilds.set(mailboxUid, entry);
|
|
@@ -277,7 +280,7 @@ export async function cancelLocalIndexBuild(mailboxUid) {
|
|
|
277
280
|
function isOlderThan(date, watermark) {
|
|
278
281
|
return !!watermark && new Date(date).getTime() < new Date(watermark).getTime();
|
|
279
282
|
}
|
|
280
|
-
async function runBuildPass(mailboxUid, unlocked, folders, windowConfig, signal) {
|
|
283
|
+
async function runBuildPass(mailboxUid, unlocked, folders, windowConfig, signal, client) {
|
|
281
284
|
const generation = nextLocalIndexGeneration();
|
|
282
285
|
const indexKey = await deriveLocalIndexKey(unlocked.masterKey, mailboxUid);
|
|
283
286
|
signal.throwIfAborted();
|
|
@@ -295,7 +298,7 @@ async function runBuildPass(mailboxUid, unlocked, folders, windowConfig, signal)
|
|
|
295
298
|
// count, no listing/fetch failure and no budget cut-off - the only case where coverage can be used to
|
|
296
299
|
// narrow Tier 3.
|
|
297
300
|
let complete = true;
|
|
298
|
-
const sealer = createPassSealer(mailboxUid, unlocked, signal);
|
|
301
|
+
const sealer = createPassSealer(mailboxUid, unlocked, signal, client);
|
|
299
302
|
try {
|
|
300
303
|
if (folders.some((f) => !MESSAGE_FOLDER_TYPES.has(f.type) && !NON_MESSAGE_FOLDER_TYPES.has(f.type))) {
|
|
301
304
|
complete = false;
|
|
@@ -309,7 +312,7 @@ async function runBuildPass(mailboxUid, unlocked, folders, windowConfig, signal)
|
|
|
309
312
|
signal.throwIfAborted();
|
|
310
313
|
let messages;
|
|
311
314
|
try {
|
|
312
|
-
messages = await listMessages(folder.uid, { page, limit: PAGE_SIZE });
|
|
315
|
+
messages = await listMessages(folder.uid, { page, limit: PAGE_SIZE }, client);
|
|
313
316
|
}
|
|
314
317
|
catch {
|
|
315
318
|
return "failed";
|
|
@@ -350,7 +353,7 @@ async function runBuildPass(mailboxUid, unlocked, folders, windowConfig, signal)
|
|
|
350
353
|
/** Each folder's current total, or `undefined` if the listing failed. */
|
|
351
354
|
async function folderTotals() {
|
|
352
355
|
try {
|
|
353
|
-
return new Map((await listFolders(mailboxUid)).map((f) => [f.uid, f.totalCount]));
|
|
356
|
+
return new Map((await listFolders(mailboxUid, client)).map((f) => [f.uid, f.totalCount]));
|
|
354
357
|
}
|
|
355
358
|
catch {
|
|
356
359
|
return undefined;
|
|
@@ -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
|
/** Fixed, non-secret HKDF salt - see this module's own doc comment for why a fixed salt is fine here. */
|
|
19
19
|
const FIXED_SALT = new TextEncoder().encode("rapidmx-local-search-index-v1");
|
|
20
20
|
/** Derives this mailbox's local-index page-encryption key from its already-unlocked master key. Every
|
|
@@ -21,17 +21,44 @@
|
|
|
21
21
|
* every pending request and drops the module-level `worker` reference so the next `call()` spawns a
|
|
22
22
|
* replacement. `searchTier2.ts` additionally races its own calls against a timeout, since a Worker that's
|
|
23
23
|
* merely stuck (not crashed) posts no `error` event at all.
|
|
24
|
+
*
|
|
25
|
+
* **Swappable transport**: everything above is specific to this one implementation - the Worker/OPFS-backed
|
|
26
|
+
* default. Every function this module exports below (`initLocalIndex`, `searchLocal`, `destroyLocalIndex`, ...)
|
|
27
|
+
* is a thin delegator to whichever `LocalIndexTransport` (`localIndexTransport.ts`) is "current," which defaults
|
|
28
|
+
* to `workerLocalIndexTransport` - this file's own implementation, wrapped - and can be swapped once, at startup,
|
|
29
|
+
* via `setLocalIndexTransport()`. A host app with a different storage backend (no Worker, no OPFS, no WASM at
|
|
30
|
+
* all - `tauri-client`'s native SQLCipher/`rusqlite` index) installs its own transport there; every call site
|
|
31
|
+
* that already goes through this file's exports (`searchTier2.ts`, `LocalIndexLifecycle.tsx`,
|
|
32
|
+
* `localIndexBuilder.ts`, and the rest) then runs against that backend instead, unmodified. The three
|
|
33
|
+
* module-level constants below (`SIGN_OUT_CHANNEL`, `PENDING_DELETIONS_KEY`, `DESTROY_ALL_TIMEOUT_MS`) remain
|
|
34
|
+
* plain exports, not part of the swappable interface - they name this one transport's own cross-tab/localStorage
|
|
35
|
+
* mechanics, which a different transport has no reason to share.
|
|
24
36
|
*/
|
|
25
|
-
import type { ParsedSearchQuery } from "
|
|
37
|
+
import type { ParsedSearchQuery } from "../../../lib/search/queryGrammar.js";
|
|
26
38
|
import type { Coverage, IndexEntitiesResult, InitParams, LocalSearchPage, WindowState } from "./localIndexWorker.js";
|
|
27
39
|
import type { LocalIndexEntity } from "./localIndexSchema.js";
|
|
28
|
-
|
|
29
|
-
export declare function nextLocalIndexGeneration(): number;
|
|
40
|
+
import type { LocalIndexTransport, PruneLocalEntitiesOptions, SetLocalIndexBuildingCompletion } from "./localIndexTransport.js";
|
|
30
41
|
export declare const SIGN_OUT_CHANNEL = "rapidmx-localsearch";
|
|
31
42
|
export declare const PENDING_DELETIONS_KEY = "rapidmx-localsearch-pending-deletions";
|
|
32
|
-
/**
|
|
33
|
-
|
|
34
|
-
|
|
43
|
+
/** How long sign-out waits for local index destruction before navigating anyway. */
|
|
44
|
+
export declare const DESTROY_ALL_TIMEOUT_MS = 3000;
|
|
45
|
+
/**
|
|
46
|
+
* This file's own Worker/OPFS-backed implementation, wrapping the functions above - see this module's own doc
|
|
47
|
+
* comment ("Swappable transport"). The default `LocalIndexTransport` (`localIndexTransport.ts`); every export
|
|
48
|
+
* below delegates to whichever transport `setLocalIndexTransport()` has made current, which starts out as this
|
|
49
|
+
* one.
|
|
50
|
+
*/
|
|
51
|
+
export declare const workerLocalIndexTransport: LocalIndexTransport;
|
|
52
|
+
/**
|
|
53
|
+
* Swaps the `LocalIndexTransport` every export below delegates to - see this module's own doc comment
|
|
54
|
+
* ("Swappable transport"). Defaults to `workerLocalIndexTransport`; a host app with a different storage backend
|
|
55
|
+
* (e.g. `tauri-client`'s native SQLCipher/`rusqlite` index) calls this once, at startup, before any of this
|
|
56
|
+
* module's other exports are used, so every call site already wired through them runs against that backend
|
|
57
|
+
* instead - unmodified.
|
|
58
|
+
*/
|
|
59
|
+
export declare function setLocalIndexTransport(transport: LocalIndexTransport): void;
|
|
60
|
+
/** A fresh generation - see this module's doc comment. */
|
|
61
|
+
export declare function nextLocalIndexGeneration(): number;
|
|
35
62
|
export declare function initLocalIndex(params: InitParams): Promise<void>;
|
|
36
63
|
export declare function indexLocalEntities(mailboxUid: string, entities: LocalIndexEntity[], generation?: number): Promise<IndexEntitiesResult>;
|
|
37
64
|
/** Drops one message from this session's local index (a delete). A no-op for a mailbox not indexed in
|
|
@@ -41,36 +68,21 @@ export declare function removeLocalEntity(mailboxUid: string, entityUid: string)
|
|
|
41
68
|
* local searches stay correct. Same no-op/never-rejects rules as `removeLocalEntity()`. */
|
|
42
69
|
export declare function moveLocalEntity(mailboxUid: string, entityUid: string, folderUid: string): Promise<void>;
|
|
43
70
|
export declare function getIndexedVersions(mailboxUid: string, entityUids: string[]): Promise<Record<string, string>>;
|
|
44
|
-
export declare function pruneLocalEntities(mailboxUid: string, keepEntityUids: string[], since: string | undefined, options?:
|
|
45
|
-
folderUids?: string[];
|
|
46
|
-
generation?: number;
|
|
47
|
-
}): Promise<number>;
|
|
71
|
+
export declare function pruneLocalEntities(mailboxUid: string, keepEntityUids: string[], since: string | undefined, options?: PruneLocalEntitiesOptions): Promise<number>;
|
|
48
72
|
export declare function searchLocal(mailboxUid: string, parsed: ParsedSearchQuery, limit: number, offset?: number): Promise<LocalSearchPage>;
|
|
49
73
|
export declare function getLocalCoverage(mailboxUid: string): Promise<Coverage>;
|
|
50
74
|
export declare function setLocalIndexWindow(mailboxUid: string, timeFloorMonths: number, byteBudgetBytes: number, generation?: number): Promise<WindowState>;
|
|
51
|
-
export declare function setLocalIndexBuilding(mailboxUid: string, building: boolean, completion?:
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}): Promise<void>;
|
|
57
|
-
/** Destroys one mailbox's local index (both the SQLite connection and its on-disk OPFS storage) - spec
|
|
58
|
-
* §11 "MUST be destroyed on the same events that destroy private keys." Never rejects (it's called from
|
|
59
|
-
* lifecycle hooks where a failure mustn't block key destruction) but resolves `false` - and logs why -
|
|
60
|
-
* when the index could not be removed, e.g. because another tab still has it open; the deletion is then
|
|
61
|
-
* retried on the next page load. */
|
|
75
|
+
export declare function setLocalIndexBuilding(mailboxUid: string, building: boolean, completion?: SetLocalIndexBuildingCompletion): Promise<void>;
|
|
76
|
+
/** Destroys one mailbox's local index - spec §11 "MUST be destroyed on the same events that destroy private
|
|
77
|
+
* keys." Never rejects (it's called from lifecycle hooks where a failure mustn't block key destruction) but
|
|
78
|
+
* resolves `false` when the index could not be removed - see the current transport's own doc comment for what
|
|
79
|
+
* that means for it (the Worker transport also logs why, and retries on the next page load). */
|
|
62
80
|
export declare function destroyLocalIndex(mailboxUid: string): Promise<boolean>;
|
|
63
|
-
/**
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Destroys **every** local index on this device - not just the mailboxes this page load opened (sign-out
|
|
67
|
-
* from Calendar, say, never opened any), by enumerating OPFS for the index directory prefix - and tells every
|
|
68
|
-
* other tab to close its own connections. Closes this tab's own open connections through the Worker first
|
|
69
|
-
* (only if one was ever spawned - there's nothing to close otherwise, and booting one just to delete files
|
|
70
|
-
* would be waste), then removes the directories. Anything left behind is retried on the next load. Resolves
|
|
71
|
-
* `true` when everything was removed within `timeoutMs`; never rejects.
|
|
72
|
-
*/
|
|
81
|
+
/** Destroys **every** local index this transport knows of - not just the mailboxes this session opened - e.g.
|
|
82
|
+
* on sign-out. Never rejects. Resolves `true` only if everything was removed within `timeoutMs`. */
|
|
73
83
|
export declare function destroyAllLocalIndexes(timeoutMs?: number): Promise<boolean>;
|
|
74
84
|
/** Removes local indexes for mailboxes outside `accessibleMailboxUids` - e.g. left behind by a different
|
|
75
85
|
* user who signed in on this device without signing out. Never rejects. */
|
|
76
86
|
export declare function pruneInaccessibleLocalIndexes(accessibleMailboxUids: Iterable<string>): Promise<void>;
|
|
87
|
+
/** Retries every deletion an earlier session couldn't finish. Never rejects. */
|
|
88
|
+
export declare function retryPendingLocalIndexDeletions(): Promise<void>;
|
|
@@ -8,7 +8,7 @@ const pending = new Map();
|
|
|
8
8
|
const initializedMailboxes = new Set();
|
|
9
9
|
let generationCounter = 0;
|
|
10
10
|
/** A fresh generation - see this module's doc comment. */
|
|
11
|
-
|
|
11
|
+
function nextLocalIndexGenerationImpl() {
|
|
12
12
|
generationCounter += 1;
|
|
13
13
|
return generationCounter;
|
|
14
14
|
}
|
|
@@ -83,7 +83,7 @@ function listenForSignOut() {
|
|
|
83
83
|
async function closeEverythingInThisTab() {
|
|
84
84
|
signedOut = true;
|
|
85
85
|
initializedMailboxes.clear();
|
|
86
|
-
await call("destroyAll", { generation:
|
|
86
|
+
await call("destroyAll", { generation: nextLocalIndexGenerationImpl() }).catch(() => undefined);
|
|
87
87
|
}
|
|
88
88
|
function call(method, params) {
|
|
89
89
|
const id = nextRequestId++;
|
|
@@ -133,7 +133,7 @@ function updatePendingDeletions(update) {
|
|
|
133
133
|
let pendingRetry;
|
|
134
134
|
/** Retries every deletion an earlier page load couldn't finish. Runs once per page load (memoized), before
|
|
135
135
|
* this tab's first `init` - so it never races an index this tab itself opens. Never rejects. */
|
|
136
|
-
|
|
136
|
+
function retryPendingLocalIndexDeletionsImpl() {
|
|
137
137
|
pendingRetry ?? (pendingRetry = (async () => {
|
|
138
138
|
const uids = readPendingDeletions();
|
|
139
139
|
if (uids.length === 0) {
|
|
@@ -153,49 +153,49 @@ export function retryPendingLocalIndexDeletions() {
|
|
|
153
153
|
})());
|
|
154
154
|
return pendingRetry;
|
|
155
155
|
}
|
|
156
|
-
|
|
157
|
-
await
|
|
156
|
+
async function initLocalIndexImpl(params) {
|
|
157
|
+
await retryPendingLocalIndexDeletionsImpl();
|
|
158
158
|
if (signedOut) {
|
|
159
159
|
throw new Error("Signed out - the local search index is unavailable in this tab.");
|
|
160
160
|
}
|
|
161
161
|
await call("init", params);
|
|
162
162
|
initializedMailboxes.add(params.mailboxUid);
|
|
163
163
|
}
|
|
164
|
-
|
|
164
|
+
function indexLocalEntitiesImpl(mailboxUid, entities, generation) {
|
|
165
165
|
return call("indexEntities", { mailboxUid, entities, generation });
|
|
166
166
|
}
|
|
167
167
|
/** Drops one message from this session's local index (a delete). A no-op for a mailbox not indexed in
|
|
168
168
|
* this tab - a later build pass prunes it instead. Never rejects: best-effort housekeeping. */
|
|
169
|
-
|
|
169
|
+
async function removeLocalEntityImpl(mailboxUid, entityUid) {
|
|
170
170
|
if (!initializedMailboxes.has(mailboxUid)) {
|
|
171
171
|
return;
|
|
172
172
|
}
|
|
173
173
|
await call("removeEntity", { mailboxUid, entityUid }).catch(() => undefined);
|
|
174
174
|
}
|
|
175
175
|
/** Re-points one indexed message at its new folder (archive, cancel-scheduled-send) so `folder:`-scoped
|
|
176
|
-
* local searches stay correct. Same no-op/never-rejects rules as `
|
|
177
|
-
|
|
176
|
+
* local searches stay correct. Same no-op/never-rejects rules as `removeLocalEntityImpl()`. */
|
|
177
|
+
async function moveLocalEntityImpl(mailboxUid, entityUid, folderUid) {
|
|
178
178
|
if (!initializedMailboxes.has(mailboxUid)) {
|
|
179
179
|
return;
|
|
180
180
|
}
|
|
181
181
|
await call("moveEntity", { mailboxUid, entityUid, folderUid }).catch(() => undefined);
|
|
182
182
|
}
|
|
183
|
-
|
|
183
|
+
function getIndexedVersionsImpl(mailboxUid, entityUids) {
|
|
184
184
|
return call("indexedVersions", { mailboxUid, entityUids });
|
|
185
185
|
}
|
|
186
|
-
|
|
186
|
+
function pruneLocalEntitiesImpl(mailboxUid, keepEntityUids, since, options) {
|
|
187
187
|
return call("pruneEntities", { mailboxUid, keepEntityUids, since, ...options });
|
|
188
188
|
}
|
|
189
|
-
|
|
189
|
+
function searchLocalImpl(mailboxUid, parsed, limit, offset) {
|
|
190
190
|
return call("search", { mailboxUid, parsed, limit, offset });
|
|
191
191
|
}
|
|
192
|
-
|
|
192
|
+
function getLocalCoverageImpl(mailboxUid) {
|
|
193
193
|
return call("coverage", mailboxUid);
|
|
194
194
|
}
|
|
195
|
-
|
|
195
|
+
function setLocalIndexWindowImpl(mailboxUid, timeFloorMonths, byteBudgetBytes, generation) {
|
|
196
196
|
return call("setWindow", { mailboxUid, timeFloorMonths, byteBudgetBytes, generation });
|
|
197
197
|
}
|
|
198
|
-
|
|
198
|
+
function setLocalIndexBuildingImpl(mailboxUid, building, completion) {
|
|
199
199
|
return call("setBuilding", { mailboxUid, building, ...completion });
|
|
200
200
|
}
|
|
201
201
|
/** Destroys one mailbox's local index (both the SQLite connection and its on-disk OPFS storage) - spec
|
|
@@ -203,10 +203,10 @@ export function setLocalIndexBuilding(mailboxUid, building, completion = { compl
|
|
|
203
203
|
* lifecycle hooks where a failure mustn't block key destruction) but resolves `false` - and logs why -
|
|
204
204
|
* when the index could not be removed, e.g. because another tab still has it open; the deletion is then
|
|
205
205
|
* retried on the next page load. */
|
|
206
|
-
|
|
206
|
+
async function destroyLocalIndexImpl(mailboxUid) {
|
|
207
207
|
updatePendingDeletions((current) => current.add(mailboxUid));
|
|
208
208
|
try {
|
|
209
|
-
await call("destroy", { mailboxUid, generation:
|
|
209
|
+
await call("destroy", { mailboxUid, generation: nextLocalIndexGenerationImpl() });
|
|
210
210
|
updatePendingDeletions((current) => current.delete(mailboxUid));
|
|
211
211
|
return true;
|
|
212
212
|
}
|
|
@@ -229,7 +229,7 @@ export const DESTROY_ALL_TIMEOUT_MS = 3000;
|
|
|
229
229
|
* would be waste), then removes the directories. Anything left behind is retried on the next load. Resolves
|
|
230
230
|
* `true` when everything was removed within `timeoutMs`; never rejects.
|
|
231
231
|
*/
|
|
232
|
-
|
|
232
|
+
async function destroyAllLocalIndexesImpl(timeoutMs) {
|
|
233
233
|
signedOut = true;
|
|
234
234
|
writePendingDeletions([ALL_INDEXES]);
|
|
235
235
|
try {
|
|
@@ -241,7 +241,7 @@ export async function destroyAllLocalIndexes(timeoutMs = DESTROY_ALL_TIMEOUT_MS)
|
|
|
241
241
|
const work = (async () => {
|
|
242
242
|
let ok = true;
|
|
243
243
|
if (worker) {
|
|
244
|
-
const { failed } = await call("destroyAll", { generation:
|
|
244
|
+
const { failed } = await call("destroyAll", { generation: nextLocalIndexGenerationImpl() }).catch(() => ({
|
|
245
245
|
failed: ["(worker)"],
|
|
246
246
|
}));
|
|
247
247
|
ok = failed.length === 0;
|
|
@@ -264,6 +264,99 @@ export async function destroyAllLocalIndexes(timeoutMs = DESTROY_ALL_TIMEOUT_MS)
|
|
|
264
264
|
}
|
|
265
265
|
/** Removes local indexes for mailboxes outside `accessibleMailboxUids` - e.g. left behind by a different
|
|
266
266
|
* user who signed in on this device without signing out. Never rejects. */
|
|
267
|
-
|
|
267
|
+
async function pruneInaccessibleLocalIndexesImpl(accessibleMailboxUids) {
|
|
268
268
|
await removeLocalIndexDirectories(new Set(accessibleMailboxUids)).catch(() => undefined);
|
|
269
269
|
}
|
|
270
|
+
/**
|
|
271
|
+
* This file's own Worker/OPFS-backed implementation, wrapping the functions above - see this module's own doc
|
|
272
|
+
* comment ("Swappable transport"). The default `LocalIndexTransport` (`localIndexTransport.ts`); every export
|
|
273
|
+
* below delegates to whichever transport `setLocalIndexTransport()` has made current, which starts out as this
|
|
274
|
+
* one.
|
|
275
|
+
*/
|
|
276
|
+
export const workerLocalIndexTransport = {
|
|
277
|
+
nextGeneration: nextLocalIndexGenerationImpl,
|
|
278
|
+
init: initLocalIndexImpl,
|
|
279
|
+
indexEntities: indexLocalEntitiesImpl,
|
|
280
|
+
removeEntity: removeLocalEntityImpl,
|
|
281
|
+
moveEntity: moveLocalEntityImpl,
|
|
282
|
+
indexedVersions: getIndexedVersionsImpl,
|
|
283
|
+
pruneEntities: pruneLocalEntitiesImpl,
|
|
284
|
+
search: searchLocalImpl,
|
|
285
|
+
coverage: getLocalCoverageImpl,
|
|
286
|
+
setWindow: setLocalIndexWindowImpl,
|
|
287
|
+
setBuilding: setLocalIndexBuildingImpl,
|
|
288
|
+
destroy: destroyLocalIndexImpl,
|
|
289
|
+
destroyAll: destroyAllLocalIndexesImpl,
|
|
290
|
+
pruneInaccessible: pruneInaccessibleLocalIndexesImpl,
|
|
291
|
+
retryPendingDeletions: retryPendingLocalIndexDeletionsImpl,
|
|
292
|
+
};
|
|
293
|
+
let currentTransport = workerLocalIndexTransport;
|
|
294
|
+
/**
|
|
295
|
+
* Swaps the `LocalIndexTransport` every export below delegates to - see this module's own doc comment
|
|
296
|
+
* ("Swappable transport"). Defaults to `workerLocalIndexTransport`; a host app with a different storage backend
|
|
297
|
+
* (e.g. `tauri-client`'s native SQLCipher/`rusqlite` index) calls this once, at startup, before any of this
|
|
298
|
+
* module's other exports are used, so every call site already wired through them runs against that backend
|
|
299
|
+
* instead - unmodified.
|
|
300
|
+
*/
|
|
301
|
+
export function setLocalIndexTransport(transport) {
|
|
302
|
+
currentTransport = transport;
|
|
303
|
+
}
|
|
304
|
+
/** A fresh generation - see this module's doc comment. */
|
|
305
|
+
export function nextLocalIndexGeneration() {
|
|
306
|
+
return currentTransport.nextGeneration();
|
|
307
|
+
}
|
|
308
|
+
export function initLocalIndex(params) {
|
|
309
|
+
return currentTransport.init(params);
|
|
310
|
+
}
|
|
311
|
+
export function indexLocalEntities(mailboxUid, entities, generation) {
|
|
312
|
+
return currentTransport.indexEntities(mailboxUid, entities, generation);
|
|
313
|
+
}
|
|
314
|
+
/** Drops one message from this session's local index (a delete). A no-op for a mailbox not indexed in
|
|
315
|
+
* this tab - a later build pass prunes it instead. Never rejects: best-effort housekeeping. */
|
|
316
|
+
export function removeLocalEntity(mailboxUid, entityUid) {
|
|
317
|
+
return currentTransport.removeEntity(mailboxUid, entityUid);
|
|
318
|
+
}
|
|
319
|
+
/** Re-points one indexed message at its new folder (archive, cancel-scheduled-send) so `folder:`-scoped
|
|
320
|
+
* local searches stay correct. Same no-op/never-rejects rules as `removeLocalEntity()`. */
|
|
321
|
+
export function moveLocalEntity(mailboxUid, entityUid, folderUid) {
|
|
322
|
+
return currentTransport.moveEntity(mailboxUid, entityUid, folderUid);
|
|
323
|
+
}
|
|
324
|
+
export function getIndexedVersions(mailboxUid, entityUids) {
|
|
325
|
+
return currentTransport.indexedVersions(mailboxUid, entityUids);
|
|
326
|
+
}
|
|
327
|
+
export function pruneLocalEntities(mailboxUid, keepEntityUids, since, options = {}) {
|
|
328
|
+
return currentTransport.pruneEntities(mailboxUid, keepEntityUids, since, options);
|
|
329
|
+
}
|
|
330
|
+
export function searchLocal(mailboxUid, parsed, limit, offset = 0) {
|
|
331
|
+
return currentTransport.search(mailboxUid, parsed, limit, offset);
|
|
332
|
+
}
|
|
333
|
+
export function getLocalCoverage(mailboxUid) {
|
|
334
|
+
return currentTransport.coverage(mailboxUid);
|
|
335
|
+
}
|
|
336
|
+
export function setLocalIndexWindow(mailboxUid, timeFloorMonths, byteBudgetBytes, generation) {
|
|
337
|
+
return currentTransport.setWindow(mailboxUid, timeFloorMonths, byteBudgetBytes, generation);
|
|
338
|
+
}
|
|
339
|
+
export function setLocalIndexBuilding(mailboxUid, building, completion = { complete: false }) {
|
|
340
|
+
return currentTransport.setBuilding(mailboxUid, building, completion);
|
|
341
|
+
}
|
|
342
|
+
/** Destroys one mailbox's local index - spec §11 "MUST be destroyed on the same events that destroy private
|
|
343
|
+
* keys." Never rejects (it's called from lifecycle hooks where a failure mustn't block key destruction) but
|
|
344
|
+
* resolves `false` when the index could not be removed - see the current transport's own doc comment for what
|
|
345
|
+
* that means for it (the Worker transport also logs why, and retries on the next page load). */
|
|
346
|
+
export function destroyLocalIndex(mailboxUid) {
|
|
347
|
+
return currentTransport.destroy(mailboxUid);
|
|
348
|
+
}
|
|
349
|
+
/** Destroys **every** local index this transport knows of - not just the mailboxes this session opened - e.g.
|
|
350
|
+
* on sign-out. Never rejects. Resolves `true` only if everything was removed within `timeoutMs`. */
|
|
351
|
+
export function destroyAllLocalIndexes(timeoutMs = DESTROY_ALL_TIMEOUT_MS) {
|
|
352
|
+
return currentTransport.destroyAll(timeoutMs);
|
|
353
|
+
}
|
|
354
|
+
/** Removes local indexes for mailboxes outside `accessibleMailboxUids` - e.g. left behind by a different
|
|
355
|
+
* user who signed in on this device without signing out. Never rejects. */
|
|
356
|
+
export function pruneInaccessibleLocalIndexes(accessibleMailboxUids) {
|
|
357
|
+
return currentTransport.pruneInaccessible(accessibleMailboxUids);
|
|
358
|
+
}
|
|
359
|
+
/** Retries every deletion an earlier session couldn't finish. Never rejects. */
|
|
360
|
+
export function retryPendingLocalIndexDeletions() {
|
|
361
|
+
return currentTransport.retryPendingDeletions();
|
|
362
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Tier 2 local index's transport contract - every operation `localIndexRpcClient.ts`'s public functions perform
|
|
3
|
+
* against whatever actually stores and queries the index. Type-only: this module declares the shape, it never runs
|
|
4
|
+
* anything itself.
|
|
5
|
+
*
|
|
6
|
+
* The browser/Electron path is backed by `workerLocalIndexTransport` (`localIndexRpcClient.ts`, exported from that
|
|
7
|
+
* same file) - a Promise/RPC wrapper around a Worker running `@journeyapps/wa-sqlite` over OPFS. That module's own
|
|
8
|
+
* doc comment covers the Worker/RPC mechanics this interface abstracts away (generations, cross-tab sign-out,
|
|
9
|
+
* retried deletions, Worker-crash recovery); none of that is part of this contract - it is that transport's own
|
|
10
|
+
* implementation detail, not something a second implementation needs to reproduce.
|
|
11
|
+
*
|
|
12
|
+
* A host app with no Worker/OPFS/WASM at all - `tauri-client`, backed instead by real SQLCipher-encrypted SQLite
|
|
13
|
+
* via a Rust `rusqlite` `invoke()` command - implements this same shape and installs it once at startup via
|
|
14
|
+
* `localIndexRpcClient.ts`'s `setLocalIndexTransport()`. Every call site already going through that file's exported
|
|
15
|
+
* functions (`searchTier2.ts`, `LocalIndexLifecycle.tsx`, `localIndexBuilder.ts`, and the rest) then runs against
|
|
16
|
+
* the native backend instead, unmodified - those exports are thin delegators to whichever transport is current.
|
|
17
|
+
*
|
|
18
|
+
* Method names mirror the Worker's own RPC method names (`localIndexWorker.ts`'s `LocalIndexRequest["method"]`),
|
|
19
|
+
* not `localIndexRpcClient.ts`'s public function names - a second implementation has no reason to repeat that
|
|
20
|
+
* file's "Local"-infixed naming (`indexLocalEntities`, `getLocalCoverage`, ...) for its own methods.
|
|
21
|
+
*
|
|
22
|
+
* Every method takes exactly the arguments its `localIndexRpcClient.ts` counterpart already resolves down to -
|
|
23
|
+
* where that file's own export has a default parameter (`offset = 0`, `options = {}`, `timeoutMs = DESTROY_ALL_TIMEOUT_MS`),
|
|
24
|
+
* this interface takes the resolved value as required, so an implementation never has to reproduce that default
|
|
25
|
+
* itself.
|
|
26
|
+
*/
|
|
27
|
+
import type { ParsedSearchQuery } from "../../../lib/search/queryGrammar.js";
|
|
28
|
+
import type { Coverage, IndexEntitiesResult, InitParams, LocalSearchPage, WindowState } from "./localIndexWorker.js";
|
|
29
|
+
import type { LocalIndexEntity } from "./localIndexSchema.js";
|
|
30
|
+
/** `LocalIndexTransport.pruneEntities()`'s options - which folders' unseen rows may be pruned (see
|
|
31
|
+
* `localIndexBuilder.ts`'s own "reliable" folders), and this pass's generation tag. */
|
|
32
|
+
export interface PruneLocalEntitiesOptions {
|
|
33
|
+
folderUids?: string[];
|
|
34
|
+
generation?: number;
|
|
35
|
+
}
|
|
36
|
+
/** `LocalIndexTransport.setBuilding()`'s completion summary - whether a build pass just finished, and how much of
|
|
37
|
+
* the mailbox it covered (`Coverage.complete`/`coveredFrom`/`coveredUntil`'s own source). */
|
|
38
|
+
export interface SetLocalIndexBuildingCompletion {
|
|
39
|
+
complete: boolean;
|
|
40
|
+
coveredFrom?: string;
|
|
41
|
+
coveredUntil?: string;
|
|
42
|
+
generation?: number;
|
|
43
|
+
}
|
|
44
|
+
/** See this module's own doc comment. */
|
|
45
|
+
export interface LocalIndexTransport {
|
|
46
|
+
/** A fresh, monotonic generation from this transport's own counter. */
|
|
47
|
+
nextGeneration(): number;
|
|
48
|
+
/** Opens (or reuses) this mailbox's index connection. */
|
|
49
|
+
init(params: InitParams): Promise<void>;
|
|
50
|
+
/** Indexes (inserts or updates) the given entities, applying byte-budget eviction as needed. */
|
|
51
|
+
indexEntities(mailboxUid: string, entities: LocalIndexEntity[], generation?: number): Promise<IndexEntitiesResult>;
|
|
52
|
+
/** Drops one indexed entity. */
|
|
53
|
+
removeEntity(mailboxUid: string, entityUid: string): Promise<void>;
|
|
54
|
+
/** Re-points one indexed entity at its new folder. */
|
|
55
|
+
moveEntity(mailboxUid: string, entityUid: string, folderUid: string): Promise<void>;
|
|
56
|
+
/** The indexed version marker (`Message.version` + folder) currently stored for each of the given entity uids. */
|
|
57
|
+
indexedVersions(mailboxUid: string, entityUids: string[]): Promise<Record<string, string>>;
|
|
58
|
+
/** Removes indexed rows outside `keepEntityUids` (and `since`/`options.folderUids`'s own scope). Returns how many rows were pruned. */
|
|
59
|
+
pruneEntities(mailboxUid: string, keepEntityUids: string[], since: string | undefined, options: PruneLocalEntitiesOptions): Promise<number>;
|
|
60
|
+
/** Runs a parsed query against the index, already scored and paginated. */
|
|
61
|
+
search(mailboxUid: string, parsed: ParsedSearchQuery, limit: number, offset: number): Promise<LocalSearchPage>;
|
|
62
|
+
/** How much of the mailbox the index currently covers. */
|
|
63
|
+
coverage(mailboxUid: string): Promise<Coverage>;
|
|
64
|
+
/** Sets this mailbox's window (time floor + byte budget), applying eviction immediately if it shrank. */
|
|
65
|
+
setWindow(mailboxUid: string, timeFloorMonths: number, byteBudgetBytes: number, generation?: number): Promise<WindowState>;
|
|
66
|
+
/** Flags whether a build pass is running, and - once it finishes - how much of the mailbox it covered. */
|
|
67
|
+
setBuilding(mailboxUid: string, building: boolean, completion: SetLocalIndexBuildingCompletion): Promise<void>;
|
|
68
|
+
/** Destroys one mailbox's index. Never rejects; resolves `false` (logging why) when it could not be removed. */
|
|
69
|
+
destroy(mailboxUid: string): Promise<boolean>;
|
|
70
|
+
/** Destroys every index this transport knows of, e.g. on sign-out. Never rejects; resolves `true` only if
|
|
71
|
+
* everything was removed within `timeoutMs`. */
|
|
72
|
+
destroyAll(timeoutMs: number): Promise<boolean>;
|
|
73
|
+
/** Removes indexes for mailboxes outside `accessibleMailboxUids`. Never rejects. */
|
|
74
|
+
pruneInaccessible(accessibleMailboxUids: Iterable<string>): Promise<void>;
|
|
75
|
+
/** Retries any deletion an earlier session couldn't finish. Never rejects. */
|
|
76
|
+
retryPendingDeletions(): Promise<void>;
|
|
77
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ParsedSearchQuery } from "
|
|
1
|
+
import type { ParsedSearchQuery } from "../../../lib/search/queryGrammar.js";
|
|
2
2
|
import { LocalIndexEntity } from "./localIndexSchema.js";
|
|
3
3
|
/** One request sent from the main thread. `id` correlates the eventual response - `postMessage` has no
|
|
4
4
|
* native request/response pairing, so every RPC call carries its own id (see `localIndexRpcClient.ts`,
|