# Iptvnator Sqlite DB Worker

> Use when changing Electron SQLite IPC, database-worker operations, request-scoped progress or cancellation, worker packaging, or runtime verification of non-EPG database work.

- Skill: `4gray/iptvnator-sqlite-db-worker` (Agent Skill)
- Install (CLI): `npx skillmds@latest add 4gray/iptvnator-sqlite-db-worker`
- Raw SKILL.md: https://api.skillmd.com/api/skills/4gray/iptvnator-sqlite-db-worker/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: 4gray (https://skillmd.com/u/4gray)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/4gray/iptvnator-sqlite-db-worker

---


# IPTVnator SQLite DB Worker

## Ownership and Flow

- Renderer service: `libs/services/src/lib/database-electron.service.ts`
- Preload API: `apps/electron-backend/src/app/api/main.preload.ts`
- IPC handlers: `apps/electron-backend/src/app/events/database/`
- Client: `apps/electron-backend/src/app/services/database-worker-client.ts`
- Protocol: `apps/electron-backend/src/app/workers/database-worker.types.ts`
- Thin dispatcher: `apps/electron-backend/src/app/workers/database.worker.ts`
- Connection: `apps/electron-backend/src/app/workers/database.worker-connection.ts`
- Runtime paths: `apps/electron-backend/src/app/workers/worker-runtime-paths.ts`
- SQL operations: `apps/electron-backend/src/app/database/operations/`
- Shared schema: `libs/shared/database/src/lib/schema.ts`
- Bundler: `apps/electron-backend/build-worker.js`
- Canonical guide: `docs/architecture/sqlite-db-worker.md`

The chain is renderer `DatabaseService` → preload IPC → main event handler →
`DatabaseWorkerClient` and its request protocol → worker dispatcher →
worker connection → operation module → shared
`@iptvnator/shared/database/schema`, then response or request-scoped event back
to the originating renderer. Keep SQL-heavy logic in operation modules and the
worker entrypoint focused on dispatch/orchestration.

The build script produces three bundles: EPG parser, database, and playlist
refresh. EPG parsing stays in its dedicated worker. Do not silently migrate
lightweight download handlers or EPG-specific main-process query/mapping/fetch
handlers as part of unrelated database work.

## Identity, Progress, and Cancellation

`requestId` is generated for every client request and correlates worker
event/response transport. `operationId` is the renderer-visible identity for
long-operation progress and cooperative cancellation.

Tracked operations are save content, delete Xtream content, restore Xtream user
data, delete playlist, and delete all playlists. The first four are
cancellable. Delete-all is deliberately tracked with `cancellable: false`.

Cancellation is cooperative at chunk checkpoints. Committed chunks remain
committed and the request finally rejects with `AbortError`. For the
operation/busy lifecycle, only a terminal completed/error/cancelled event
settles UI state; a cancel-requested flag may update immediately.

Inside synchronous `better-sqlite3` transactions, prepared writes must use
`.run()`. `.execute()` defers work and can commit a silent no-op.

## Rebuild and Verify

After worker source changes:

```bash
pnpm nx test electron-backend
pnpm nx run electron-backend:build-worker
stat dist/apps/electron-backend/workers/database.worker.js
```

Confirm the artifact timestamp, restart Electron, then run the closest
Electron E2E or CDP workflow.

For SQL output, `IPTVNATOR_TRACE_DB=1` and `IPTVNATOR_TRACE_SQL=1` emit only
fixed, allowlisted statement types through the shared redacting summary in
`libs/shared/logging/src/lib/sql-trace-summary.ts`; never log expanded SQL or
bound values. DB transport traces remain separately redacted.

