fix: recover mobile and sync state after resume

Reconnect sync stream when native mobile app resumes
Materialize incomplete sessions with explicit recovery reasons
Add low-noise debug breadcrumb for scoped recovery
This commit is contained in:
Bohdan Triapitsyn
2026-07-01 18:32:24 +03:00
parent 0a69c4ebab
commit 4b1e05160f
6 changed files with 123 additions and 65 deletions
@@ -61,7 +61,7 @@ describe("applyDirectoryEvent", () => {
expect(result).toEqual({
changed: false,
materialization: { type: "incomplete-session-snapshot", messageID: "msg_1", partID: "prt_1" },
materialization: { type: "incomplete-session-snapshot", reason: "orphan-delta", messageID: "msg_1", partID: "prt_1" },
})
})
@@ -73,7 +73,7 @@ describe("applyDirectoryEvent", () => {
expect(result).toEqual({
changed: false,
materialization: { type: "incomplete-session-snapshot", messageID: "msg_1", partID: "prt_1" },
materialization: { type: "incomplete-session-snapshot", reason: "missing-delta-part", messageID: "msg_1", partID: "prt_1" },
})
})
@@ -86,6 +86,7 @@ describe("applyDirectoryEvent", () => {
changed: true,
materialization: {
type: "incomplete-session-snapshot",
reason: "missing-owning-message",
sessionID: "ses_1",
messageID: "msg_1",
partID: "prt_1",
@@ -102,6 +103,7 @@ describe("applyDirectoryEvent", () => {
changed: true,
materialization: {
type: "incomplete-session-snapshot",
reason: "missing-owning-message",
sessionID: "ses_1",
messageID: "msg_1",
partID: "prt_1",
@@ -123,7 +125,7 @@ describe("applyDirectoryEvent", () => {
expect(result).toEqual({
changed: false,
materialization: { type: "incomplete-session-snapshot", sessionID: "ses_1", messageID: "msg_1", partID: "prt_1" },
materialization: { type: "incomplete-session-snapshot", reason: "orphan-delta", sessionID: "ses_1", messageID: "msg_1", partID: "prt_1" },
})
})