Stalwart 1.0: load calendars, and keep settings and Files working #67

Merged
jcoffey-dev merged 1 commits from fix/stalwart-1-0-calendar-files into main 2026-10-30 20:21:08 +00:00
Owner

Fixes #66.

Two changes in Stalwart 1.0 broke ihasmail for its readers:

  • Calendar. A CalendarEvent/get naming recurrenceOverrides together with utcStart or utcEnd now fails whole, even with no ids, so no calendar would load. The everyday property list no longer asks for the overrides (an occurrence's are null anyway); the export asks with SERIES_PROPS, without the times.
  • Settings and Files. FileNode renamed nodeType to @type ("Directory", "File") and type to mediaType, and each version refuses the other's names on create and update. ihasmail could make no folder on 1.0, its own included, so the settings file was never written and settings reset at every sign-in. The client now asks once per session which shape the server wants and translates FileNode calls in one place, web/src/jmap/fileNodeShape.ts.

Checked

  • npm run typecheck, npm test (1562 passed), npm run build.
  • The compatibility test, extended to read events with both property lists, expand a weekly series, and write, find, update and read back the settings file through the client's own translation: 6/6 against real 0.16.27 and 1.0.0 servers (the images CI pins).
  • The app by hand against 1.0.0: calendars load and draw a weekly event; a setting survives signing out and back in, with the browser's storage emptied in between; the Files view loads with the app folder hidden.

Not in this PR: 1.0 returns myRights for folders only, so rename, delete and editing show as unavailable on files there. Recorded in KNOWN-ISSUES.md.

Fixes #66. Two changes in Stalwart 1.0 broke ihasmail for its readers: - **Calendar.** A `CalendarEvent/get` naming `recurrenceOverrides` together with `utcStart` or `utcEnd` now fails whole, even with no ids, so no calendar would load. The everyday property list no longer asks for the overrides (an occurrence's are null anyway); the export asks with `SERIES_PROPS`, without the times. - **Settings and Files.** FileNode renamed `nodeType` to `@type` (`"Directory"`, `"File"`) and `type` to `mediaType`, and each version refuses the other's names on create and update. ihasmail could make no folder on 1.0, its own included, so the settings file was never written and settings reset at every sign-in. The client now asks once per session which shape the server wants and translates FileNode calls in one place, `web/src/jmap/fileNodeShape.ts`. **Checked** - `npm run typecheck`, `npm test` (1562 passed), `npm run build`. - The compatibility test, extended to read events with both property lists, expand a weekly series, and write, find, update and read back the settings file through the client's own translation: 6/6 against real 0.16.27 and 1.0.0 servers (the images CI pins). - The app by hand against 1.0.0: calendars load and draw a weekly event; a setting survives signing out and back in, with the browser's storage emptied in between; the Files view loads with the app folder hidden. **Not in this PR:** 1.0 returns `myRights` for folders only, so rename, delete and editing show as unavailable on files there. Recorded in KNOWN-ISSUES.md.
jcoffey-dev added 1 commit 2026-10-30 20:08:11 +00:00
Stalwart 1.0: load calendars, and keep settings and Files working
ci / node (pull_request) Skipped
ci / version (pull_request) Skipped
ci / stalwart (stalwartlabs/stalwart@sha256:baafeacd6cbde77acdd94af49972d41c6709e54a376df48e18a9fe3f445eb3d5, 1.0.0) (pull_request) Skipped
ci / stalwart (stalwartlabs/stalwart@sha256:c429b311c93db5606598abc1c68225a85a6953183848ae01bee9c6a98885836c, 0.16.27) (pull_request) Skipped
ci / docker-build (pull_request) Skipped
ci / publish (pull_request) Skipped
github/ci (branch) GitHub Actions
ci / github (pull_request) Successful in 3m4s
590edd50a1
Two changes in Stalwart 1.0 broke ihasmail for its readers (#66).

A CalendarEvent/get that names recurrenceOverrides together with utcStart
or utcEnd now fails whole, even with no ids, so no calendar would load.
The everyday property list no longer asks for the overrides; an
occurrence's are null anyway. The export, which needs them, asks with
SERIES_PROPS, without the times.

FileNode renamed nodeType to @type ("Directory", "File") and type to
mediaType, and each version refuses the other's names on create and
update. ihasmail could make no folder on 1.0, including its own, so the
settings file was never written and settings reset at every sign-in. The
client now asks once per session which shape the server wants (a query
sorted by type, which 1.0 refuses as unsupportedSort), asking the
reader's own account, and translates FileNode calls in one place,
jmap/fileNodeShape.ts, so the rest of the app keeps the shape it was
written for. A filter by nodeType, which 1.0 answers with nothing, is
dropped there; the Files tree already sorts folders from files itself.

The compatibility test missed both because it never made these calls. It
now reads events with both property lists, expands a weekly series, and
writes, finds, updates and reads back the settings file through the
client's own translation. Run against real 0.16.27 and 1.0.0 servers,
and the app was checked by hand on 1.0: calendars load, and a setting
survives signing out and back in.

Fixes #66
jcoffey-dev merged commit dd8ebf1b85 into main 2026-10-30 20:21:08 +00:00
jcoffey-dev deleted branch fix/stalwart-1-0-calendar-files 2026-10-30 20:21:08 +00:00
Sign in to join this conversation.