3.2 KiB
3.2 KiB
apn-relay Agent Guide
This file defines package-specific guidance for agents working in packages/apn-relay.
Scope And Precedence
- Follow root
AGENTS.mdfirst. - This file provides stricter package-level conventions for relay service work.
- If future local guides are added, closest guide wins.
Project Overview
- Minimal APNs relay service (Hono + Bun + PlanetScale via Drizzle).
- Core routes:
GET /healthGET /POST /v1/device/registerPOST /v1/device/unregisterPOST /v1/event
Commands
Run all commands from packages/apn-relay.
- Install deps:
bun install - Start relay locally:
bun run dev - Typecheck:
bun run typecheck - DB connectivity check:
bun run db:check
Build / Test Expectations
- There is no dedicated package test script currently.
- Required validation for behavior changes:
bun run typecheckbun run db:checkwhen DB/env changes are involved- manual endpoint verification against
/health,/v1/device/register,/v1/event
Single-Test Guidance
- No single-test command exists for this package today.
- For focused checks, run endpoint-level manual tests against a local dev server.
Code Style Guidelines
Formatting / Structure
- Keep handlers compact and explicit.
- Prefer small local helpers for repeated route logic.
- Avoid broad refactors when a targeted fix is enough.
Types / Validation
- Validate request bodies with
zodat route boundaries. - Keep payload and DB row shapes explicit and close to usage.
- Avoid
any; narrow unknown input immediately after parsing.
Naming
- Follow existing concise naming in this package (
reg,unreg,evt,row,key). - For DB columns, keep snake_case alignment with schema.
Error Handling
- Return clear JSON errors for invalid input.
- Keep handler failures observable via
app.onErrorand structured logs. - Do not leak secrets in responses or logs.
Logging
- Log delivery lifecycle at key checkpoints:
- registration/unregistration attempts
- event fanout start/end
- APNs send failures and retries
- Mask sensitive values; prefer token suffixes and metadata.
APNs Environment Rules
- Keep APNs env explicit per registration (
sandbox/production). - For
BadEnvironmentKeyInToken, retry once with flipped env and persist correction. - Avoid infinite retry loops; one retry max per delivery attempt.
Database Conventions
- Schema is in
src/schema.sql.ts. - Keep table/column names snake_case.
- Maintain index naming consistency with existing schema.
- For upserts, update only fields required by current behavior.
API Behavior Expectations
register/unregistermust be idempotent.eventshould return success envelope even when no devices are registered.- Delivery logs should capture per-attempt result and error payload.
Operational Notes
- Ensure
APNS_PRIVATE_KEYsupports escaped newline format (\n) and raw multiline. - Validate that
APNS_DEFAULT_BUNDLE_IDmatches mobile app bundle identifier. - Avoid coupling route behavior to deployment platform specifics.
Before Finishing
- Run
bun run typecheck. - If DB/env behavior changed, run
bun run db:check. - Manually exercise affected endpoints.
- Confirm logs are useful and secret-safe.