@bobfrankston/rmfmail 1.2.110 → 1.2.112
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/TODO.md
CHANGED
|
@@ -19,6 +19,7 @@ These items don't need user input — source-only changes, compile-verified befo
|
|
|
19
19
|
| ~~5~~ | ~~**C126 — Cold-start latency (~28s observed)**~~ — **MOSTLY DONE** (2026-05-11). Root cause IDed from boot log: 43 s of cascading ES module imports through msger's custom protocol IPC (one roundtrip per file). Fixes shipped: (a) bundling via esbuild (`bin/build-bundles.mjs`) collapses the cascade to one fetch per entry point — `client/app.bundle.js` 345 kb, `client/compose/compose.bundle.js` 99 kb; (b) boot-snapshot hydration — bundled app saves `folder-tree` + `ml-body` innerHTML to localStorage every 30 s; inline script in `index.html` restores at cold start before the bundle has fetched. Sub-bullet (c) [500 ms placeholder pause] not in current code at cited line — skipped as stale. Expected cold start now 3-5 s (full WebView2 + bundle parse), with near-instant *feel* via hydrated snapshot after the first run. | M | |
|
|
20
20
|
| **6** | **C125 — Unify desktop + Android IMAP code paths** | M | Today's split (`mailx-imap` Node-only + `mailx-store-web` browser-only) duplicates orchestration that's protocol-identical. Differences boil down to (a) transport factory choice (b) whether clients are persistent — both parameters, not architectural divides. Plan: extract `mailx-imap-core` with ImapManager + ops queue + fast-lane + sync orchestration over a `Transport` and a `Storage` interface, no Node-specific imports. `mailx-imap` and `mailx-store-web` become thin shims that wire engine-specific Storage + Transport. `{persistent: true\|false}` flag on ImapManager covers the lifetime split (no fast-lane queue when ephemeral). Pre-req for Android non-Gmail IMAP without forking sync code. |
|
|
21
21
|
| **5** | **C124 — mailto handler on Linux + macOS** | S | Counterpart to P115 (Win). Linux: write a `~/.local/share/applications/rmfmail.desktop` with `MimeType=x-scheme-handler/mailto;` + `Exec=node /path/to/mailx.js --mailto %u`, `xdg-mime default rmfmail.desktop x-scheme-handler/mailto`, `update-desktop-database`. No exe-launcher needed — Linux pickers read `Name=` from the `.desktop` directly. macOS: real `.app` bundle (LaunchServices won't register a bare script) with `Info.plist` `CFBundleURLTypes` declaring `mailto` + a tiny launcher binary; `LSSetDefaultHandlerForURLScheme` programmatically sets the default. Rust `rmfmailto-src/` crate already portable — drop the Win32 imports and `cargo build --target x86_64-apple-darwin` produces the macOS launcher. |
|
|
22
|
+
| **7** | **C154 — Audit Android bridge vs MailxApi contract** | S | The hand-written `installBridge()` api object in `mailx-store-web/android-bootstrap.ts` exposes ~45 fewer methods than `client/lib/api-client.ts` can call (`getThreadMessages`, `getOutboxStatus`, `unsubscribeOneClick`, calendar/tasks, user-dict, …). Any missing one fails as `parent bridge has no method "X"` from the compose/app IPC relay — that's how the ⊘ denylist button broke on the phone (fixed v1.2.109: added `addToDenylist`/`addPreferredContact`/`hasBccHistoryTo`/`loadContactsConfig`). Web-service already `implements MailxApi` with explicit stubs, so the gap is purely the bridge layer. Audit each remaining name: expose real impls + notImpl stubs (arg shapes per `client/lib/mailxapi.js`), consciously comment-skip desktop-only ones, and add a typed check or generic stub pass-through so the class of bug can't recur. |
|
|
22
23
|
~~done — C120 read transport diagnostics~~ shipped v1.0.583 (per-folder timeout error now includes `[conn#X r=YB w=ZB writes=N sinceLastRead=Tms]` snapshot for the doomed socket).
|
|
23
24
|
| 11 | **[P116](#ext116) — Signature edit in Settings menu** | M | Deferred v1.0.401 — turns out to be M (multi-account modal + save path + JSONC round-trip), not S. Real work when Settings UI gets its proper pass. |
|
|
24
25
|
| 13 | **S56 full AbortController plumbing** | L | Thread `AbortSignal` through `getMessage → fetchMessageBody → provider.fetchOne`. Touches IMAP + Gmail + Outlook providers. |
|
package/client/app.bundle.js
CHANGED
|
@@ -5185,11 +5185,12 @@ async function fetchUpcoming(from) {
|
|
|
5185
5185
|
}
|
|
5186
5186
|
function formatDayHeader(d, today, tomorrow) {
|
|
5187
5187
|
const sameDay = (a, b) => a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
|
|
5188
|
+
const label = d.toLocaleDateString(void 0, { weekday: "long", month: "long", day: "numeric" });
|
|
5188
5189
|
if (sameDay(d, today))
|
|
5189
|
-
return
|
|
5190
|
+
return `${label} (today)`;
|
|
5190
5191
|
if (sameDay(d, tomorrow))
|
|
5191
|
-
return
|
|
5192
|
-
return
|
|
5192
|
+
return `${label} (tomorrow)`;
|
|
5193
|
+
return label;
|
|
5193
5194
|
}
|
|
5194
5195
|
function formatTime(e) {
|
|
5195
5196
|
if (e.allDay)
|