@rapidmx/web-client 0.4.0 → 0.6.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 +88 -0
- package/apps/admin/audit-log/index.tsx +35 -8
- package/apps/admin/data-requests/index.tsx +480 -485
- package/apps/admin/distribution-lists/[uid].tsx +19 -1
- package/apps/admin/escrow-scopes/[uid].tsx +348 -237
- package/apps/admin/escrow-scopes/new/index.tsx +8 -2
- package/apps/admin/index.tsx +19 -1
- package/apps/admin/ingest-queue/index.tsx +44 -5
- package/apps/admin/mailboxes/[uid].tsx +211 -184
- package/apps/admin/quarantine/index.tsx +46 -14
- package/apps/admin/transport-rules/[uid].tsx +30 -1
- package/apps/admin/transport-rules/_transportRuleConfig.tsx +38 -2
- package/apps/admin/transport-rules/index.tsx +24 -6
- package/apps/admin/transport-rules/new/index.tsx +30 -1
- package/apps/escrow/_layout.tsx +2 -3
- package/apps/escrow/audit-log/index.tsx +196 -168
- package/apps/escrow/matters/[uid].tsx +621 -521
- package/apps/shared/components/admin/escrowScopes/EscrowScopeKeyAndHoldersFields.tsx +22 -1
- package/apps/shared/components/admin/layout/AdminShell.tsx +28 -9
- package/apps/shared/components/admin/mailboxes/EscrowScopeCard.tsx +152 -0
- package/apps/shared/components/admin/mailboxes/ResourceSettingsCard.tsx +3 -3
- package/apps/shared/components/admin/mailboxes/ShareAccessCard.tsx +55 -11
- package/apps/shared/components/admin/settings/BrandingForm.tsx +15 -4
- package/apps/shared/components/admin/settings/DomainDnsSetup.tsx +18 -7
- package/apps/shared/components/admin/settings/EncryptionPolicyForm.tsx +10 -2
- package/apps/shared/components/admin/settings/MailboxCreateForm.tsx +6 -0
- package/apps/shared/components/admin/settings/MailboxPolicyForm.tsx +45 -12
- package/apps/shared/components/admin/settings/PluginsManager.tsx +1235 -595
- package/apps/shared/components/admin/settings/RetentionPolicyForm.tsx +174 -98
- package/apps/shared/components/admin/setup/EscrowSetupStep.tsx +49 -13
- package/apps/shared/components/admin/setup/SetupWizard.tsx +150 -34
- package/apps/shared/components/admin/signOut.ts +79 -0
- package/apps/shared/components/admin/usePagedList.tsx +129 -0
- package/apps/shared/components/calendar/EventModal.tsx +717 -549
- package/apps/shared/components/calendar/MonthView.tsx +173 -139
- package/apps/shared/components/calendar/RecurrenceEditor.tsx +222 -180
- package/apps/shared/components/calendar/SplitDayView.tsx +143 -137
- package/apps/shared/components/calendar/TimeGridView.tsx +244 -198
- package/apps/shared/components/calendar/allDay.ts +124 -0
- package/apps/shared/components/calendar/layout/CalendarShell.tsx +194 -192
- package/apps/shared/components/contacts/ContactDetailPane.tsx +100 -21
- package/apps/shared/components/contacts/ContactForm.tsx +377 -348
- package/apps/shared/components/contacts/ContactsSidebar.tsx +6 -2
- package/apps/shared/components/contacts/KeyChangeReview.tsx +192 -0
- package/apps/shared/components/contacts/contactKeys.ts +78 -0
- package/apps/shared/components/contacts/layout/ContactsShell.tsx +199 -197
- package/apps/shared/components/escrow/layout/EscrowShell.tsx +148 -134
- package/apps/shared/components/layout/AppShell.tsx +123 -33
- package/apps/shared/components/layout/BrandingChrome.tsx +48 -10
- package/apps/shared/components/layout/KeyEnrollmentGate.tsx +389 -298
- package/apps/shared/components/layout/MailboxProvisioning.tsx +19 -3
- package/apps/shared/components/layout/RecoveryCodeUnlock.tsx +350 -0
- package/apps/shared/components/layout/UnlockPromptProvider.tsx +257 -128
- package/apps/shared/components/mail/ConversationThreadPane.tsx +216 -181
- package/apps/shared/components/mail/MessageDetailPane.tsx +1318 -630
- package/apps/shared/components/mail/compose/ComposeContext.tsx +20 -15
- package/apps/shared/components/mail/compose/ComposeWindow.tsx +854 -132
- package/apps/shared/components/mail/compose/composeFlushRegistry.ts +60 -0
- package/apps/shared/components/mail/layout/MailShell.tsx +420 -408
- package/apps/shared/components/mail/pinnedSigners.ts +124 -0
- package/apps/shared/components/mail/verificationSeals.ts +125 -0
- package/apps/shared/components/mail/writableMailboxes.ts +101 -0
- package/apps/shared/components/rules/RuleBuilder.tsx +311 -276
- package/apps/shared/components/settings/layout/SettingsShell.tsx +23 -9
- package/apps/shared/components/tasks/layout/TasksShell.tsx +201 -199
- package/apps/shared/mail/listAllPages.ts +39 -0
- package/apps/shared/plugins/pluginNav.ts +73 -0
- package/apps/shared/search/LocalIndexLifecycle.tsx +64 -55
- package/apps/shared/search/localIndexBuilder.ts +481 -179
- package/apps/shared/search/localIndexRpcClient.ts +231 -29
- package/apps/shared/search/localIndexSchema.ts +15 -6
- package/apps/shared/search/localIndexStorage.ts +98 -0
- package/apps/shared/search/localIndexVFS.ts +32 -1
- package/apps/shared/search/localIndexWorker.ts +648 -186
- package/apps/www/calendar/index.tsx +438 -417
- package/apps/www/contacts/[uid].tsx +21 -2
- package/apps/www/contacts/index.tsx +116 -12
- package/apps/www/index.tsx +1314 -1041
- package/apps/www/messages/[uid].tsx +18 -6
- package/apps/www/settings/auto-reply/index.tsx +134 -129
- package/apps/www/settings/encryption/index.tsx +739 -216
- package/apps/www/settings/filters/[uid].tsx +171 -155
- package/apps/www/settings/filters/new/index.tsx +8 -1
- package/apps/www/settings/focused-inbox/index.tsx +150 -148
- package/apps/www/settings/privacy/index.tsx +494 -436
- package/apps/www/settings/read-receipts/index.tsx +148 -125
- package/apps/www/settings/sharing/index.tsx +17 -14
- package/apps/www/tasks/index.tsx +638 -579
- package/dist/apps/admin/_404.d.ts +2 -0
- package/dist/apps/admin/_500.d.ts +2 -0
- package/dist/apps/admin/_layout.d.ts +8 -0
- package/dist/apps/admin/audit-log/index.d.ts +11 -0
- package/dist/apps/admin/audit-log/index.js +38 -8
- package/dist/apps/admin/branding/index.d.ts +3 -0
- package/dist/apps/admin/data-requests/index.d.ts +3 -0
- package/dist/apps/admin/data-requests/index.js +52 -72
- package/dist/apps/admin/distribution-lists/[uid].d.ts +7 -0
- package/dist/apps/admin/distribution-lists/[uid].js +1 -1
- package/dist/apps/admin/distribution-lists/index.d.ts +3 -0
- package/dist/apps/admin/distribution-lists/new/index.d.ts +3 -0
- package/dist/apps/admin/domains/[uid].d.ts +7 -0
- package/dist/apps/admin/domains/index.d.ts +3 -0
- package/dist/apps/admin/domains/new/index.d.ts +3 -0
- package/dist/apps/admin/encryption-policy/index.d.ts +3 -0
- package/dist/apps/admin/escrow-scopes/[uid].d.ts +21 -0
- package/dist/apps/admin/escrow-scopes/[uid].js +91 -12
- package/dist/apps/admin/escrow-scopes/index.d.ts +3 -0
- package/dist/apps/admin/escrow-scopes/new/index.d.ts +3 -0
- package/dist/apps/admin/escrow-scopes/new/index.js +8 -3
- package/dist/apps/admin/index.d.ts +3 -0
- package/dist/apps/admin/index.js +4 -1
- package/dist/apps/admin/ingest-queue/index.d.ts +4 -0
- package/dist/apps/admin/ingest-queue/index.js +24 -6
- package/dist/apps/admin/mailbox-policy/index.d.ts +3 -0
- package/dist/apps/admin/mailboxes/[uid].d.ts +7 -0
- package/dist/apps/admin/mailboxes/[uid].js +20 -4
- package/dist/apps/admin/mailboxes/new/index.d.ts +3 -0
- package/dist/apps/admin/plugins/index.d.ts +3 -0
- package/dist/apps/admin/quarantine/index.d.ts +6 -0
- package/dist/apps/admin/quarantine/index.js +20 -11
- package/dist/apps/admin/retention-policy/index.d.ts +3 -0
- package/dist/apps/admin/setup/index.d.ts +3 -0
- package/dist/apps/admin/transport-rules/[uid].d.ts +7 -0
- package/dist/apps/admin/transport-rules/[uid].js +18 -2
- package/dist/apps/admin/transport-rules/_transportRuleConfig.d.ts +21 -0
- package/dist/apps/admin/transport-rules/_transportRuleConfig.js +19 -0
- package/dist/apps/admin/transport-rules/index.d.ts +3 -0
- package/dist/apps/admin/transport-rules/index.js +22 -6
- package/dist/apps/admin/transport-rules/new/index.d.ts +3 -0
- package/dist/apps/admin/transport-rules/new/index.js +18 -2
- package/dist/apps/escrow/_layout.d.ts +10 -0
- package/dist/apps/escrow/_layout.js +3 -3
- package/dist/apps/escrow/audit-log/index.d.ts +9 -0
- package/dist/apps/escrow/audit-log/index.js +26 -1
- package/dist/apps/escrow/index.d.ts +3 -0
- package/dist/apps/escrow/matters/[uid].d.ts +7 -0
- package/dist/apps/escrow/matters/[uid].js +77 -42
- package/dist/apps/escrow/matters/new/index.d.ts +3 -0
- package/dist/apps/shared/components/admin/distributionLists/MemberListCard.d.ts +17 -0
- package/dist/apps/shared/components/admin/escrowScopes/EscrowScopeKeyAndHoldersFields.d.ts +32 -0
- package/dist/apps/shared/components/admin/escrowScopes/EscrowScopeKeyAndHoldersFields.js +11 -2
- package/dist/apps/shared/components/admin/layout/AdminShell.d.ts +32 -0
- package/dist/apps/shared/components/admin/layout/AdminShell.js +15 -6
- package/dist/apps/shared/components/admin/mailboxes/EscrowScopeCard.d.ts +12 -0
- package/dist/apps/shared/components/admin/mailboxes/EscrowScopeCard.js +72 -0
- package/dist/apps/shared/components/admin/mailboxes/MailboxTable.d.ts +6 -0
- package/dist/apps/shared/components/admin/mailboxes/ResourceSettingsCard.d.ts +19 -0
- package/dist/apps/shared/components/admin/mailboxes/ResourceSettingsCard.js +3 -3
- package/dist/apps/shared/components/admin/mailboxes/ShareAccessCard.d.ts +12 -0
- package/dist/apps/shared/components/admin/mailboxes/ShareAccessCard.js +22 -4
- package/dist/apps/shared/components/admin/settings/BrandingForm.d.ts +9 -0
- package/dist/apps/shared/components/admin/settings/BrandingForm.js +15 -4
- package/dist/apps/shared/components/admin/settings/DomainDnsSetup.d.ts +12 -0
- package/dist/apps/shared/components/admin/settings/DomainDnsSetup.js +13 -7
- package/dist/apps/shared/components/admin/settings/EncryptionPolicyForm.d.ts +12 -0
- package/dist/apps/shared/components/admin/settings/EncryptionPolicyForm.js +7 -2
- package/dist/apps/shared/components/admin/settings/LoadedSettingsForm.d.ts +9 -0
- package/dist/apps/shared/components/admin/settings/MailboxCreateForm.d.ts +19 -0
- package/dist/apps/shared/components/admin/settings/MailboxCreateForm.js +6 -0
- package/dist/apps/shared/components/admin/settings/MailboxPolicyForm.d.ts +10 -0
- package/dist/apps/shared/components/admin/settings/MailboxPolicyForm.js +34 -12
- package/dist/apps/shared/components/admin/settings/PluginsManager.d.ts +4 -0
- package/dist/apps/shared/components/admin/settings/PluginsManager.js +390 -78
- package/dist/apps/shared/components/admin/settings/RetentionPolicyForm.d.ts +9 -0
- package/dist/apps/shared/components/admin/settings/RetentionPolicyForm.js +40 -11
- package/dist/apps/shared/components/admin/setup/EscrowSetupStep.d.ts +14 -0
- package/dist/apps/shared/components/admin/setup/EscrowSetupStep.js +29 -13
- package/dist/apps/shared/components/admin/setup/SetupWizard.d.ts +36 -0
- package/dist/apps/shared/components/admin/setup/SetupWizard.js +87 -21
- package/dist/apps/shared/components/admin/signOut.d.ts +23 -0
- package/dist/apps/shared/components/admin/signOut.js +75 -0
- package/dist/apps/shared/components/admin/usePagedList.d.ts +39 -0
- package/dist/apps/shared/components/admin/usePagedList.js +99 -0
- package/dist/apps/shared/components/calendar/CalendarListSidebar.d.ts +26 -0
- package/dist/apps/shared/components/calendar/EventModal.d.ts +46 -0
- package/dist/apps/shared/components/calendar/EventModal.js +142 -21
- package/dist/apps/shared/components/calendar/MonthView.d.ts +15 -0
- package/dist/apps/shared/components/calendar/MonthView.js +12 -5
- package/dist/apps/shared/components/calendar/RecurrenceEditor.d.ts +20 -0
- package/dist/apps/shared/components/calendar/RecurrenceEditor.js +40 -5
- package/dist/apps/shared/components/calendar/ResourcePicker.d.ts +19 -0
- package/dist/apps/shared/components/calendar/SplitDayView.d.ts +28 -0
- package/dist/apps/shared/components/calendar/SplitDayView.js +10 -4
- package/dist/apps/shared/components/calendar/TimeGridView.d.ts +17 -0
- package/dist/apps/shared/components/calendar/TimeGridView.js +23 -7
- package/dist/apps/shared/components/calendar/allDay.d.ts +51 -0
- package/dist/apps/shared/components/calendar/allDay.js +111 -0
- package/dist/apps/shared/components/calendar/layout/CalendarShell.d.ts +40 -0
- package/dist/apps/shared/components/calendar/layout/CalendarShell.js +3 -3
- package/dist/apps/shared/components/contacts/ContactDetailPane.d.ts +23 -0
- package/dist/apps/shared/components/contacts/ContactDetailPane.js +43 -5
- package/dist/apps/shared/components/contacts/ContactForm.d.ts +20 -0
- package/dist/apps/shared/components/contacts/ContactForm.js +32 -10
- package/dist/apps/shared/components/contacts/ContactsSidebar.d.ts +40 -0
- package/dist/apps/shared/components/contacts/ContactsSidebar.js +2 -2
- package/dist/apps/shared/components/contacts/ContactsToolbar.d.ts +25 -0
- package/dist/apps/shared/components/contacts/KeyChangeReview.d.ts +40 -0
- package/dist/apps/shared/components/contacts/KeyChangeReview.js +63 -0
- package/dist/apps/shared/components/contacts/contactKeys.d.ts +29 -0
- package/dist/apps/shared/components/contacts/contactKeys.js +64 -0
- package/dist/apps/shared/components/contacts/layout/ContactsShell.d.ts +21 -0
- package/dist/apps/shared/components/contacts/layout/ContactsShell.js +2 -2
- package/dist/apps/shared/components/escrow/layout/EscrowShell.d.ts +25 -0
- package/dist/apps/shared/components/escrow/layout/EscrowShell.js +24 -5
- package/dist/apps/shared/components/forms/StringListField.d.ts +22 -0
- package/dist/apps/shared/components/layout/AppShell.d.ts +49 -0
- package/dist/apps/shared/components/layout/AppShell.js +97 -26
- package/dist/apps/shared/components/layout/BrandingChrome.d.ts +18 -0
- package/dist/apps/shared/components/layout/BrandingChrome.js +45 -10
- package/dist/apps/shared/components/layout/KeyEnrollmentGate.d.ts +51 -0
- package/dist/apps/shared/components/layout/KeyEnrollmentGate.js +49 -12
- package/dist/apps/shared/components/layout/MailboxProvisioning.d.ts +13 -0
- package/dist/apps/shared/components/layout/MailboxProvisioning.js +10 -2
- package/dist/apps/shared/components/layout/RecoveryCodeUnlock.d.ts +66 -0
- package/dist/apps/shared/components/layout/RecoveryCodeUnlock.js +174 -0
- package/dist/apps/shared/components/layout/UnlockPromptProvider.d.ts +45 -0
- package/dist/apps/shared/components/layout/UnlockPromptProvider.js +73 -14
- package/dist/apps/shared/components/layout/UserMenu.d.ts +23 -0
- package/dist/apps/shared/components/mail/ConversationList.d.ts +11 -0
- package/dist/apps/shared/components/mail/ConversationThreadPane.d.ts +23 -0
- package/dist/apps/shared/components/mail/ConversationThreadPane.js +50 -12
- package/dist/apps/shared/components/mail/MessageDetailPane.d.ts +93 -0
- package/dist/apps/shared/components/mail/MessageDetailPane.js +441 -36
- package/dist/apps/shared/components/mail/compose/ComposeContext.d.ts +58 -0
- package/dist/apps/shared/components/mail/compose/ComposeContext.js +9 -6
- package/dist/apps/shared/components/mail/compose/ComposeToolbar.d.ts +15 -0
- package/dist/apps/shared/components/mail/compose/ComposeWindow.d.ts +37 -0
- package/dist/apps/shared/components/mail/compose/ComposeWindow.js +699 -128
- package/dist/apps/shared/components/mail/compose/EmojiPicker.d.ts +14 -0
- package/dist/apps/shared/components/mail/compose/GifPicker.d.ts +13 -0
- package/dist/apps/shared/components/mail/compose/RichTextEditor.d.ts +34 -0
- package/dist/apps/shared/components/mail/compose/ScheduleSendPicker.d.ts +16 -0
- package/dist/apps/shared/components/mail/compose/composeFlushRegistry.d.ts +27 -0
- package/dist/apps/shared/components/mail/compose/composeFlushRegistry.js +50 -0
- package/dist/apps/shared/components/mail/layout/MailShell.d.ts +57 -0
- package/dist/apps/shared/components/mail/layout/MailShell.js +13 -4
- package/dist/apps/shared/components/mail/pinnedSigners.d.ts +33 -0
- package/dist/apps/shared/components/mail/pinnedSigners.js +98 -0
- package/dist/apps/shared/components/mail/verificationSeals.d.ts +22 -0
- package/dist/apps/shared/components/mail/verificationSeals.js +112 -0
- package/dist/apps/shared/components/mail/writableMailboxes.d.ts +15 -0
- package/dist/apps/shared/components/mail/writableMailboxes.js +87 -0
- package/dist/apps/shared/components/rules/RuleBuilder.d.ts +70 -0
- package/dist/apps/shared/components/rules/RuleBuilder.js +34 -6
- package/dist/apps/shared/components/settings/layout/SettingsShell.d.ts +41 -0
- package/dist/apps/shared/components/settings/layout/SettingsShell.js +19 -9
- package/dist/apps/shared/components/tasks/TasksSidebar.d.ts +41 -0
- package/dist/apps/shared/components/tasks/TasksToolbar.d.ts +14 -0
- package/dist/apps/shared/components/tasks/layout/TasksShell.d.ts +24 -0
- package/dist/apps/shared/components/tasks/layout/TasksShell.js +2 -2
- package/dist/apps/shared/mail/findWellKnownFolderUid.d.ts +5 -0
- package/dist/apps/shared/mail/listAllPages.d.ts +17 -0
- package/dist/apps/shared/mail/listAllPages.js +25 -0
- package/dist/apps/shared/plugins/pluginNav.d.ts +39 -0
- package/dist/apps/shared/plugins/pluginNav.js +33 -0
- package/dist/apps/shared/search/LocalIndexLifecycle.d.ts +13 -0
- package/dist/apps/shared/search/LocalIndexLifecycle.js +58 -54
- package/dist/apps/shared/search/localIndexBlockCipher.d.ts +36 -0
- package/dist/apps/shared/search/localIndexBuilder.d.ts +85 -0
- package/dist/apps/shared/search/localIndexBuilder.js +292 -37
- package/dist/apps/shared/search/localIndexKey.d.ts +4 -0
- package/dist/apps/shared/search/localIndexRpcClient.d.ts +71 -0
- package/dist/apps/shared/search/localIndexRpcClient.js +191 -26
- package/dist/apps/shared/search/localIndexSchema.d.ts +111 -0
- package/dist/apps/shared/search/localIndexSchema.js +12 -6
- package/dist/apps/shared/search/localIndexSizePreference.d.ts +27 -0
- package/dist/apps/shared/search/localIndexStorage.d.ts +28 -0
- package/dist/apps/shared/search/localIndexStorage.js +86 -0
- package/dist/apps/shared/search/localIndexVFS.d.ts +101 -0
- package/dist/apps/shared/search/localIndexVFS.js +68 -40
- package/dist/apps/shared/search/localIndexWorker.d.ts +145 -0
- package/dist/apps/shared/search/localIndexWorker.js +519 -173
- package/dist/apps/shared/search/searchTier2.d.ts +30 -0
- package/dist/apps/www/_404.d.ts +2 -0
- package/dist/apps/www/_500.d.ts +2 -0
- package/dist/apps/www/_layout.d.ts +14 -0
- package/dist/apps/www/calendar/index.d.ts +3 -0
- package/dist/apps/www/calendar/index.js +28 -10
- package/dist/apps/www/contacts/[uid].d.ts +13 -0
- package/dist/apps/www/contacts/[uid].js +13 -2
- package/dist/apps/www/contacts/index.d.ts +3 -0
- package/dist/apps/www/contacts/index.js +80 -10
- package/dist/apps/www/index.d.ts +3 -0
- package/dist/apps/www/index.js +339 -108
- package/dist/apps/www/messages/[uid].d.ts +11 -0
- package/dist/apps/www/messages/[uid].js +18 -6
- package/dist/apps/www/settings/auto-reply/index.d.ts +4 -0
- package/dist/apps/www/settings/auto-reply/index.js +9 -4
- package/dist/apps/www/settings/encryption/index.d.ts +7 -0
- package/dist/apps/www/settings/encryption/index.js +514 -97
- package/dist/apps/www/settings/filters/[uid].d.ts +8 -0
- package/dist/apps/www/settings/filters/[uid].js +22 -7
- package/dist/apps/www/settings/filters/_mailFilterRuleConfig.d.ts +11 -0
- package/dist/apps/www/settings/filters/index.d.ts +4 -0
- package/dist/apps/www/settings/filters/new/index.d.ts +4 -0
- package/dist/apps/www/settings/filters/new/index.js +8 -2
- package/dist/apps/www/settings/focused-inbox/index.d.ts +4 -0
- package/dist/apps/www/settings/focused-inbox/index.js +3 -1
- package/dist/apps/www/settings/labels/index.d.ts +4 -0
- package/dist/apps/www/settings/privacy/index.d.ts +4 -0
- package/dist/apps/www/settings/privacy/index.js +57 -22
- package/dist/apps/www/settings/read-receipts/index.d.ts +4 -0
- package/dist/apps/www/settings/read-receipts/index.js +10 -3
- package/dist/apps/www/settings/sharing/index.d.ts +4 -0
- package/dist/apps/www/settings/sharing/index.js +7 -11
- package/dist/apps/www/settings/signatures/[uid].d.ts +8 -0
- package/dist/apps/www/settings/signatures/index.d.ts +4 -0
- package/dist/apps/www/settings/signatures/new/index.d.ts +4 -0
- package/dist/apps/www/settings/signatures/signatureDefaults.d.ts +10 -0
- package/dist/apps/www/tasks/index.d.ts +3 -0
- package/dist/apps/www/tasks/index.js +50 -10
- package/package.json +3 -3
- package/apps/shared/components/booking/AvailabilityEditor.tsx +0 -118
- package/apps/www/settings/booking-types/[uid].tsx +0 -300
- package/apps/www/settings/booking-types/index.tsx +0 -98
- package/apps/www/settings/booking-types/new/index.tsx +0 -212
- package/dist/apps/shared/components/booking/AvailabilityEditor.js +0 -45
- package/dist/apps/www/settings/booking-types/[uid].js +0 -129
- package/dist/apps/www/settings/booking-types/index.js +0 -29
- package/dist/apps/www/settings/booking-types/new/index.js +0 -86
|
@@ -3,74 +3,78 @@
|
|
|
3
3
|
// SPDX-License-Identifier: MPL-2.0
|
|
4
4
|
///////////////////////////////////////////////////////////////////////////////
|
|
5
5
|
/**
|
|
6
|
-
* Mounts the Tier 2 local index's lifecycle
|
|
7
|
-
* unlocked, and destroys
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* Mounts the Tier 2 local index's lifecycle: starts the background build for the active mailbox once it's
|
|
7
|
+
* unlocked, and destroys an index on the same events that destroy that mailbox's unlocked keys (spec §11
|
|
8
|
+
* "MUST be destroyed on the same events that destroy private keys: explicit logout, session revocation,
|
|
9
|
+
* and the configurable idle timeout").
|
|
10
10
|
*
|
|
11
11
|
* **Why polling, not hooking the existing destroy call sites directly**: `destroyUnlockedKeys()`
|
|
12
|
-
* (`react-shared/src/crypto/keySession.ts`) has no observer/callback hook
|
|
13
|
-
*
|
|
14
|
-
* button in Settings - editing the former would mean a react-shared source change that (per this
|
|
15
|
-
* session's own earlier finding) doesn't reach `web-client` without a package republish + patch refresh
|
|
16
|
-
* cycle, which is out of scope for wiring up a destroy signal. Watching `getUnlockedKeys()` for a
|
|
17
|
-
* present-to-absent transition instead catches *every* destroy path uniformly - idle timeout, the manual
|
|
12
|
+
* (`react-shared/src/crypto/keySession.ts`) has no observer/callback hook. Watching `getUnlockedKeys()`
|
|
13
|
+
* for a present-to-absent transition catches *every* destroy path uniformly - idle timeout, the manual
|
|
18
14
|
* button, or anything else that calls it - without needing to know which one fired.
|
|
19
15
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
16
|
+
* Every mailbox this component has seen unlocked is tracked for the life of the mount - not just whichever
|
|
17
|
+
* is active right now - so switching mailboxes (or a folders-list refresh re-running the build effect)
|
|
18
|
+
* can never lose a pending unlocked-to-locked transition for a mailbox whose index was already built.
|
|
19
|
+
*
|
|
20
|
+
* **Explicit logout** navigates away immediately, which may not leave time for a poll tick - `AppShell.tsx`
|
|
21
|
+
* handles that case itself via `destroyAllLocalIndexes()`.
|
|
24
22
|
*/
|
|
25
23
|
import { useEffect, useRef } from "react";
|
|
26
24
|
import { getUnlockedKeys } from "@rapidmx/react-shared/crypto/keySession.js";
|
|
27
|
-
import { buildLocalIndex } from "./localIndexBuilder.js";
|
|
28
|
-
import { destroyLocalIndex } from "./localIndexRpcClient.js";
|
|
29
|
-
const POLL_INTERVAL_MS = 5000;
|
|
30
|
-
/** Renders nothing - pure side-effect component, mounted by `MailShell.tsx
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
if (!mailboxUid || folders.length === 0) {
|
|
25
|
+
import { buildLocalIndex, cancelLocalIndexBuild } from "./localIndexBuilder.js";
|
|
26
|
+
import { destroyLocalIndex, pruneInaccessibleLocalIndexes } from "./localIndexRpcClient.js";
|
|
27
|
+
export const POLL_INTERVAL_MS = 5000;
|
|
28
|
+
/** Renders nothing - pure side-effect component, mounted by `MailShell.tsx`. */
|
|
29
|
+
export default function LocalIndexLifecycle({ mailboxUid, folders, accessibleMailboxUids }) {
|
|
30
|
+
// mailboxUid -> whether it was unlocked at the last check. An entry exists for every mailbox whose
|
|
31
|
+
// build this component started; only ever changed by a real observed transition, never reset by an
|
|
32
|
+
// effect re-run.
|
|
33
|
+
const trackedRef = useRef(new Map());
|
|
34
|
+
// The latest props, for the long-lived polling interval below.
|
|
35
|
+
const latestRef = useRef({ mailboxUid, folders });
|
|
36
|
+
latestRef.current = { mailboxUid, folders };
|
|
37
|
+
function startBuildIfUnlocked(targetMailboxUid, targetFolders) {
|
|
38
|
+
const unlocked = getUnlockedKeys(targetMailboxUid);
|
|
39
|
+
if (!unlocked || targetFolders.length === 0 || trackedRef.current.get(targetMailboxUid)) {
|
|
43
40
|
return;
|
|
44
41
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
buildLocalIndex(mailboxUid, unlocked, folders).catch(() => undefined);
|
|
42
|
+
trackedRef.current.set(targetMailboxUid, true);
|
|
43
|
+
// Never an unhandled rejection - a broken local index is best-effort infrastructure, not a build
|
|
44
|
+
// the rest of the app depends on.
|
|
45
|
+
buildLocalIndex(targetMailboxUid, unlocked, targetFolders).catch(() => undefined);
|
|
46
|
+
}
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
if (mailboxUid) {
|
|
49
|
+
startBuildIfUnlocked(mailboxUid, folders);
|
|
54
50
|
}
|
|
51
|
+
}, [mailboxUid, folders]);
|
|
52
|
+
useEffect(() => {
|
|
55
53
|
const interval = setInterval(() => {
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
54
|
+
for (const [trackedUid, wasUnlocked] of trackedRef.current) {
|
|
55
|
+
if (wasUnlocked && !getUnlockedKeys(trackedUid)) {
|
|
56
|
+
// A present-to-absent transition: something just destroyed this mailbox's keys.
|
|
57
|
+
trackedRef.current.set(trackedUid, false);
|
|
58
|
+
// Stop the pass still running with the now-destroyed keys; the destroy itself also makes
|
|
59
|
+
// the Worker reject anything that pass still sends.
|
|
60
|
+
void cancelLocalIndexBuild(trackedUid);
|
|
61
|
+
void destroyLocalIndex(trackedUid);
|
|
62
|
+
}
|
|
63
63
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
buildStartedForRef.current = mailboxUid;
|
|
69
|
-
buildLocalIndex(mailboxUid, getUnlockedKeys(mailboxUid), folders).catch(() => undefined);
|
|
64
|
+
// The active mailbox was (re-)unlocked since the last check, e.g. via an on-demand unlock prompt.
|
|
65
|
+
const { mailboxUid: activeUid, folders: activeFolders } = latestRef.current;
|
|
66
|
+
if (activeUid) {
|
|
67
|
+
startBuildIfUnlocked(activeUid, activeFolders);
|
|
70
68
|
}
|
|
71
|
-
wasUnlockedRef.current = stillUnlocked;
|
|
72
69
|
}, POLL_INTERVAL_MS);
|
|
73
70
|
return () => clearInterval(interval);
|
|
74
|
-
}, [
|
|
71
|
+
}, []);
|
|
72
|
+
// A stable string key so a re-render with an equal-but-new array doesn't re-scan OPFS.
|
|
73
|
+
const accessibleKey = accessibleMailboxUids && accessibleMailboxUids.length > 0 ? JSON.stringify([...accessibleMailboxUids].sort()) : "";
|
|
74
|
+
useEffect(() => {
|
|
75
|
+
if (accessibleKey) {
|
|
76
|
+
void pruneInaccessibleLocalIndexes(JSON.parse(accessibleKey));
|
|
77
|
+
}
|
|
78
|
+
}, [accessibleKey]);
|
|
75
79
|
return null;
|
|
76
80
|
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The actual AES-256-GCM block cipher `localIndexVFS.ts`'s `EncryptingVFS` uses to encrypt/decrypt one
|
|
3
|
+
* physical storage block - deliberately split out from that file so it can be exercised with real
|
|
4
|
+
* WebCrypto in a plain unit test, with no OPFS/Worker/wa-sqlite involved at all (none of those are
|
|
5
|
+
* available under Vitest's jsdom environment, matching the same "node" test environment convention
|
|
6
|
+
* `react-shared`'s other crypto modules already use for exactly this reason).
|
|
7
|
+
*
|
|
8
|
+
* See `localIndexVFS.ts`'s own doc comment for the full design rationale (page layout, why a fresh
|
|
9
|
+
* random nonce per write, why AAD binds to filename+block index). This module is pure mechanism; that
|
|
10
|
+
* one is where the design is explained.
|
|
11
|
+
*/
|
|
12
|
+
/** The logical SQLite page size `EncryptingVFS` is designed for - MUST match the `PRAGMA page_size` the
|
|
13
|
+
* database was created with (`localIndexWorker.ts` sets this before the first write). */
|
|
14
|
+
export declare const LOGICAL_BLOCK_SIZE = 4096;
|
|
15
|
+
/** One physical block on disk: `nonce || ciphertext || tag`. */
|
|
16
|
+
export declare const PHYSICAL_BLOCK_SIZE: number;
|
|
17
|
+
/** Thrown when a stored block fails AES-GCM authentication - a wrong/rotated key, on-disk corruption, or
|
|
18
|
+
* a block moved to the wrong position (see `localIndexVFS.ts`'s doc comment on why AAD binds position).
|
|
19
|
+
* The worker's caller treats this identically to a schema-version mismatch: discard the whole index and
|
|
20
|
+
* rebuild (spec §11 "Invalidation"). */
|
|
21
|
+
export declare class PageCorruptedError extends Error {
|
|
22
|
+
/** The underlying `DOMException`/error `crypto.subtle.decrypt()` threw, or an inner-VFS read failure
|
|
23
|
+
* - kept as a plain field rather than the ES2022 `Error` constructor's `cause` option, since
|
|
24
|
+
* web-client's `tsconfig.json` targets ES2020. */
|
|
25
|
+
readonly cause: unknown;
|
|
26
|
+
constructor(filename: string, blockIndex: number, cause: unknown);
|
|
27
|
+
}
|
|
28
|
+
export declare function importAesGcmKey(rawKey: Uint8Array): Promise<CryptoKey>;
|
|
29
|
+
/** Encrypts one logical block (`plaintext`, exactly `LOGICAL_BLOCK_SIZE` bytes) into its physical,
|
|
30
|
+
* on-disk representation (`PHYSICAL_BLOCK_SIZE` bytes: a fresh random nonce followed by
|
|
31
|
+
* ciphertext+tag). */
|
|
32
|
+
export declare function encryptBlock(key: CryptoKey, filename: string, blockIndex: number, plaintext: Uint8Array): Promise<Uint8Array>;
|
|
33
|
+
/** Inverse of `encryptBlock()`. Throws `PageCorruptedError` (never a raw `DOMException`) on auth
|
|
34
|
+
* failure - a wrong key, tampered ciphertext, or a block swapped into the wrong position (caught by the
|
|
35
|
+
* position-bound AAD not matching). */
|
|
36
|
+
export declare function decryptBlock(key: CryptoKey, filename: string, blockIndex: number, physical: Uint8Array): Promise<Uint8Array>;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Tier 2 local index's background builder (`specs/search.md` §11 "Initial build... incrementally,
|
|
3
|
+
* newest-first"). Runs on the main thread - the actual storage I/O and encryption happen in
|
|
4
|
+
* `localIndexWorker.ts` (off the UI thread, per that file's own doc comment); this module's own work is
|
|
5
|
+
* orchestration (deciding what to fetch) plus already-async fetch/decrypt calls, not CPU-heavy work that
|
|
6
|
+
* would itself need to move off-thread.
|
|
7
|
+
*
|
|
8
|
+
* **Known scoping simplification**: walks the mailbox's real mail folders one at a time (a fixed,
|
|
9
|
+
* reasonable priority order - Inbox and Sent first), each already newest-first via `listMessages()`'s own
|
|
10
|
+
* default sort, rather than a true interleaved k-way merge producing one single globally-newest-first
|
|
11
|
+
* stream across folders. A message in, say, Sent slightly older than the *oldest-processed-so-far*
|
|
12
|
+
* message in Inbox can therefore be indexed slightly out of true global date order relative to it. Given
|
|
13
|
+
* the byte-budget eviction below is itself date-based (oldest `date_for_sort` first, enforced by
|
|
14
|
+
* `localIndexWorker.ts`'s own `applyEviction()` after every insert - see that file), a small amount of
|
|
15
|
+
* cross-folder interleaving imprecision here does not affect *what* ultimately survives the window, only
|
|
16
|
+
* the exact order entities are inserted (and therefore briefly evicted-and-reinserted) in.
|
|
17
|
+
*
|
|
18
|
+
* Only encrypted messages (`subject === "[...]"`) are indexed - see `ENCRYPTED_SUBJECT_PLACEHOLDER`'s
|
|
19
|
+
* own precedent in `apps/www/index.tsx`'s inbox-list decrypt work. An unencrypted message is already
|
|
20
|
+
* fully searchable via Tier 1; indexing it here too would spend this index's bounded byte budget on
|
|
21
|
+
* content that didn't need it.
|
|
22
|
+
*
|
|
23
|
+
* **Verification seals.** A message this pass decrypts that has no seal for the vault's current `masterKeyGeneration` is
|
|
24
|
+
* evaluated with `evaluateMessageSecurityWithSeal()`, against the sender's pinned signing keys from the reader's
|
|
25
|
+
* contacts (`pinnedSigners.ts`, the message pane's own source, looked up once per sender per pass), so a verified
|
|
26
|
+
* message gets its seal without being opened (see `apps/shared/components/mail/verificationSeals.ts`). Pins only change
|
|
27
|
+
* the security state, never the recovered subject or body this index stores. Seal writes are best effort and bounded:
|
|
28
|
+
* at most `SEAL_WRITE_CONCURRENCY` in flight, at most `MAX_SEAL_WRITES_PER_PASS` per pass (past it, messages are
|
|
29
|
+
* evaluated without seals), failures ignored, and nothing new starts once the pass is aborted or its keys are destroyed.
|
|
30
|
+
* A seal carries only a hash, fingerprint, state and time, never plaintext. With no readable vault generation the pass
|
|
31
|
+
* seals nothing. Signed-only (unencrypted) messages aren't sealed here: this pass never fetches their raw MIME (see
|
|
32
|
+
* above), and fetching it only to seal would cost a download per message; they are sealed when opened.
|
|
33
|
+
*/
|
|
34
|
+
import { type Folder } from "@rapidmx/react-shared/mail/mailApi.js";
|
|
35
|
+
import type { UnlockedKeys } from "@rapidmx/react-shared/crypto/keySession.js";
|
|
36
|
+
/** §11's Window Sizing table's time-floor column - explicitly unvalidated starting-point default per the
|
|
37
|
+
* spec's own §16 "Measurement Task" ("cannot be supplied by design work... MUST NOT be treated as
|
|
38
|
+
* validated"). Used as-is rather than invented/adjusted here. Not user-adjustable today (unlike the byte
|
|
39
|
+
* budget - see `localIndexSizePreference.ts`) - nothing in this codebase has asked for that yet. */
|
|
40
|
+
export declare const WEB_TIME_FLOOR_MONTHS = 12;
|
|
41
|
+
/** Either bound as `0` means "no limit": `applyEviction()` (`localIndexWorker.ts`) already treats a
|
|
42
|
+
* falsy byte budget as unconfigured/unenforced, and `buildLocalIndex()` below mirrors that same
|
|
43
|
+
* convention for `timeFloorMonths` so a single `0` means the same thing in both dimensions. */
|
|
44
|
+
export interface LocalIndexWindowConfig {
|
|
45
|
+
timeFloorMonths: number;
|
|
46
|
+
byteBudgetBytes: number;
|
|
47
|
+
}
|
|
48
|
+
/** How many times a pass walks a folder whose total count changed during the walk. `listMessages()` only
|
|
49
|
+
* pages by offset, so a message removed from an already-walked page shifts a later one onto it unseen;
|
|
50
|
+
* only a folder whose count held steady across a whole walk is trusted for completeness and pruning. */
|
|
51
|
+
export declare const MAX_WALK_ATTEMPTS = 3;
|
|
52
|
+
/** Subtracted from the pass's start time before it's recorded as the end of guaranteed coverage - a
|
|
53
|
+
* message's server-assigned `receivedDate` can be ahead of this device's clock. */
|
|
54
|
+
export declare const CLOCK_SKEW_MARGIN_MS: number;
|
|
55
|
+
/** How many raw-MIME fetch+decrypt calls run at once - a page of 100 encrypted messages used to fire all
|
|
56
|
+
* 100 requests simultaneously. */
|
|
57
|
+
export declare const FETCH_CONCURRENCY = 6;
|
|
58
|
+
/** How many verification seal writes run at once during a pass. */
|
|
59
|
+
export declare const SEAL_WRITE_CONCURRENCY = 2;
|
|
60
|
+
/** The most verification seals one pass writes. */
|
|
61
|
+
export declare const MAX_SEAL_WRITES_PER_PASS = 200;
|
|
62
|
+
/** Runs one full incremental build pass for `mailboxUid`: sets the window, walks mail folders newest-first
|
|
63
|
+
* (per this module's own doc comment on the folder-order simplification), decrypts and indexes only
|
|
64
|
+
* `"[...]"`-subject messages until each folder's own coverage passes the time floor, then clears the
|
|
65
|
+
* `building` flag. Messages already indexed at the same version are skipped, fetches run at most
|
|
66
|
+
* `FETCH_CONCURRENCY` at a time, and messages older than the eviction watermark (`WindowState.evictedBefore`)
|
|
67
|
+
* are neither fetched nor walked past. A failure partway through leaves whatever was indexed so far in place
|
|
68
|
+
* and records the pass as incomplete (spec §11's "incomplete-index UX... MUST indicate that coverage is
|
|
69
|
+
* partial" - see `Coverage.complete`). Rows the server no longer lists (deleted or moved elsewhere by any
|
|
70
|
+
* client) are pruned only within folders whose count held steady for a whole walk (see `MAX_WALK_ATTEMPTS`).
|
|
71
|
+
*
|
|
72
|
+
* Only one pass runs per mailbox (a newer call cancels the older), and every Worker call carries this pass's
|
|
73
|
+
* generation, so a pass outlived by a destroy can't write anything (see `cancelLocalIndexBuild()`).
|
|
74
|
+
*
|
|
75
|
+
* `windowConfig` defaults to this device's own configured byte budget (`getLocalIndexByteBudget()` -
|
|
76
|
+
* 500 MB in a browser tab, 1 GB in Electron, or whatever the user has since set in Settings > Encryption)
|
|
77
|
+
* alongside the fixed time floor above. Evaluated fresh on every call with no explicit override, so a
|
|
78
|
+
* preference change in Settings takes effect starting with this mailbox's next build pass (its next
|
|
79
|
+
* unlock), without requiring a reload.
|
|
80
|
+
*/
|
|
81
|
+
export declare function buildLocalIndex(mailboxUid: string, unlocked: UnlockedKeys, folders: Folder[], windowConfig?: LocalIndexWindowConfig): Promise<void>;
|
|
82
|
+
/** Stops a mailbox's running build pass, if any (e.g. its keys were just destroyed), resolving once it has
|
|
83
|
+
* wound down. The Worker independently rejects the pass's later calls once the index is destroyed (see
|
|
84
|
+
* `GenerationParams`); this just stops the fetching and decrypting too. Never rejects. */
|
|
85
|
+
export declare function cancelLocalIndexBuild(mailboxUid: string): Promise<void>;
|