Skip to content

Harden offline storage and acknowledgment boundaries - #68

Merged
rdlabo merged 1 commit into
mainfrom
feat/offline-horizontal-hardening
Aug 13, 2026
Merged

Harden offline storage and acknowledgment boundaries#68
rdlabo merged 1 commit into
mainfrom
feat/offline-horizontal-hardening

Conversation

@rdlabo

@rdlabo rdlabo commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Summary

  • expose typed offline storage availability and an explicit online-only fallback boundary
  • make ACK companion projection reducers atomic with command completion and exact-footprint validation
  • separate wire protocol compatibility from local replica schema fingerprints
  • preserve native read snapshots and storage failure recovery semantics

Verification

  • offline Kit test suite: 43 files / 815 tests passed
  • Kit lint passed
  • diff check passed

Open in Devin Review

@netlify

netlify Bot commented Aug 13, 2026

Copy link
Copy Markdown

Deploy Preview for rdlabo-ionic-angular-library ready!

Name Link
🔨 Latest commit b3c55ad
🔍 Latest deploy log https://app.netlify.com/projects/rdlabo-ionic-angular-library/deploys/6a7d0f3eeaf7db0008162d5a
😎 Deploy Preview https://deploy-preview-68--rdlabo-ionic-angular-library.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@rdlabo
rdlabo merged commit 93f19e6 into main Aug 13, 2026
12 checks passed
@rdlabo
rdlabo deleted the feat/offline-horizontal-hardening branch August 13, 2026 00:29

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 potential issue.

View 3 additional findings in Devin Review.

Open in Devin Review

Comment on lines +552 to +570
return async () => {
try {
const encryptionKey = await createEncryptionKey();
if (!encryptionKey) {
throw new OfflineStorageUnavailableError(
'encryption_key_unavailable',
'Native offline storage requires a non-empty encryption key on first open',
);
}
return encryptionKey;
} catch (error) {
if (error instanceof OfflineStorageUnavailableError) throw error;
throw new OfflineStorageUnavailableError(
'encryption_key_unavailable',
error instanceof Error ? error.message : 'Offline encryption key is unavailable.',
{ cause: error },
);
}
};

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟨 暗号鍵取得失敗の原因メッセージがtyped errorへ転写され、ログ等へ露出しうる

#wrapCreateEncryptionKey (projects/kit/offline/src/lib/sqlite-offline-repository.ts:552-570) は、製品側の鍵生成/取得処理が投げた例外の message をそのまま OfflineStorageUnavailableError のメッセージへ複製し、さらに元例外を cause として保持します。この typed error はコーディネータ経由で onStorageUnavailable コールバックへ渡され、製品のテレメトリやコンソールへ送られることが想定されています。Keychain/Keystore 実装によっては例外メッセージに鍵素材や機微な識別子が含まれる可能性があり、その場合は秘密情報が診断経路へ流出します。

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant