Commit Graph
264 Commits
Author SHA1 Message Date
4gray da49820e80 fix(stalker): restore playback command compatibility 2026-07-29 12:06:45 +02:00
4gray 9163f2d515 chore(stalker): merge master compatibility updates 2026-07-27 20:21:56 +02:00
4gray f5090d623e fix(player): isolate authenticated vlc launches 2026-07-27 14:00:40 +02:00
4gray bdf353a3b8 fix(stalker): harden session compatibility 2026-07-27 14:00:30 +02:00
4gray 3129d22a71 fix(player): bind reused mpv headers to source 2026-07-27 12:45:58 +02:00
4gray 9aa93079bd fix(player): clear reused mpv request headers 2026-07-27 12:35:59 +02:00
4gray 8569612dbd fix(stalker): harden provisional connection lifecycle 2026-07-27 12:29:46 +02:00
4gray 9204f400bb fix(stalker): rediscover stale learned MIME routes 2026-07-27 12:23:46 +02:00
4gray 317f4ffdad fix(stalker): surface watchdog session failures 2026-07-27 12:15:35 +02:00
4gray 4317380137 fix(stalker): rediscover after benign html endpoints 2026-07-27 12:13:17 +02:00
4gray a44f578ddc fix(stalker): clean sessions after playlist deletion 2026-07-27 12:07:41 +02:00
4gray 9988e506de fix(stalker): redetect session recipes atomically 2026-07-27 12:05:43 +02:00
4gray 91d116a572 fix(stalker): fail closed on incompatible responses 2026-07-27 12:01:23 +02:00
4gray f99380c65d fix(stalker): harden session identity boundaries 2026-07-27 11:54:56 +02:00
4gray 6d38a7cc4b fix(stalker): preserve exact portal principals 2026-07-27 11:43:15 +02:00
4gray dfdce824d9 feat(stalker): bootstrap main session runtime 2026-07-27 11:36:52 +02:00
4gray 38c07e13a3 fix(stalker): omit empty handshake token 2026-07-27 11:30:33 +02:00
4gray e66ef84df1 feat(stalker): manage authenticated portal sessions in main 2026-07-27 11:29:41 +02:00
4gray c042af85db feat(stalker): load matching saved credentials 2026-07-27 11:22:50 +02:00
4gray 7ee6e97ceb fix(stalker): preserve VOD series season shape 2026-07-27 11:04:21 +02:00
4gray 91761f5abe feat(stalker): secure native playback contexts 2026-07-27 10:56:33 +02:00
4gray cede2c6bb3 fix(stalker): preserve catalog pagination metadata 2026-07-27 10:48:16 +02:00
4gray b76e65c2bf feat(stalker): expose typed session IPC 2026-07-27 10:41:32 +02:00
4gray 580a056035 feat(stalker): bind secret playback contexts in main 2026-07-27 10:37:27 +02:00
4gray 24f0dee6f0 test(performance): add formal M3U import benchmark (#1287)
* test(performance): add formal M3U import benchmark

* test(performance): harden formal capture validity

* test(performance): address benchmark review feedback
2026-07-27 10:34:22 +02:00
4gray d5acb329e0 feat(stalker): map typed portal operations in main 2026-07-27 10:32:14 +02:00
4gray 5b22bee0f4 feat(stalker): add session watchdog scheduler 2026-07-27 10:27:16 +02:00
4gray 97c50071ac feat(stalker): install discovered principals atomically 2026-07-27 10:23:44 +02:00
4gray ffefe48992 feat(stalker): authenticate resolved portal sessions 2026-07-27 10:21:58 +02:00
4gray c12ad52019 feat(stalker): resolve portal endpoints safely 2026-07-27 10:17:21 +02:00
4gray c4974e9b93 feat(stalker): add cookie-aware portal HTTP session 2026-07-27 10:01:55 +02:00
4gray f3acc2ce39 feat(stalker): serialize base identity mutations 2026-07-27 09:52:24 +02:00
4gray 2a88060fae feat(stalker): add one-time challenge registry 2026-07-27 09:49:41 +02:00
4gray 13f05d0a7e feat(stalker): validate portal transport inputs 2026-07-27 09:48:19 +02:00
4gray d0cf96caf8 feat(stalker): add isolated RFC cookie jar 2026-07-27 09:47:32 +02:00
4gray 9166d0f12c feat(stalker): add validated redirect session hooks 2026-07-27 09:35:43 +02:00
4grayandClaude Opus 5 26331676f9 fix(epg): await mapping queries so lookups fail soft (#1279)
The four EPG mapping handlers wrap their DB call in try/catch but return the
promise instead of awaiting it. An async function *adopts* a returned promise
rather than awaiting it, so the catch block only ever fired when getDatabase()
itself threw — a rejection from the underlying query escaped to the IPC caller
instead of returning the intended null / {success:false} / [] fallback.

Add the missing await to handleGetEpgMapping, handleSetEpgMapping,
handleDeleteEpgMapping and handleSearchEpgChannels, matching
handleGetEpgMappingsBatch and resolveChannelIds in the same module, which
already awaited and so already failed soft for both cases. This restores the
contract stated in the module's own doc comment: a mapping lookup must never
take down an EPG request.

The behavior predates the max-lines split in #1278, which carried it over
verbatim from epg.events.ts.

The new spec drives the real IPC handlers captured from ipcMain.handle, so it
asserts the contract that matters: the caller gets a fallback, not a rejected
promise. Reverting the four awaits fails exactly those four handlers and
leaves the already-correct batch handler green.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-07-27 08:43:52 +02:00
4gray e1c4853a39 Merge pull request #1280 from 4gray/agent/perf-exact-process-memory
fix(perf): make process memory captures comparison-safe
2026-07-27 02:57:02 +02:00
4gray 636545cbb7 refactor(electron-backend): split four files under the max-lines limit (#1278)
Split epg.events.ts (514), the embedded MPV frame-copy adapter (428) and two of its specs (547, 539) below the 400-line hard limit, and teach the baseline generator to skip files that already carry a justified file-wide eslint-disable max-lines.

The generated baseline list is unchanged: 128 entries before and after. No behavior change.
2026-07-27 02:16:02 +02:00
4gray 2455165043 chore(electron): route the worker heap probe 2026-07-27 02:15:58 +02:00
4gray d1e268f1dd chore(electron): add perf-only worker heap probe 2026-07-27 02:15:58 +02:00
4gray a3a8f6e90c fix(perf): optimize benchmark worker builds 2026-07-26 23:25:09 +02:00
4gray df7eee7e52 fix(perf): exclude profiler flush from cancel latency 2026-07-26 23:14:57 +02:00
4gray da3b657277 fix(perf): make worker profiling request scoped 2026-07-26 22:37:52 +02:00
4gray 0579d253c4 fix(electron): fail closed on unknown performance completions 2026-07-26 22:37:52 +02:00
4gray f9e71a6d8d fix(electron): isolate refresh performance correlation 2026-07-26 22:37:52 +02:00
4gray e3ce60a35e chore(electron): add preload performance markers 2026-07-26 22:37:52 +02:00
4gray 28ed38906d test(perf): add production renderer benchmark build 2026-07-26 22:37:52 +02:00
4gray 08b868d6c1 test(electron): harden runtime boundary coverage (#1267)
Adds contract-focused regression coverage for the Electron HTTP server,
remote-control events, settings events, and managed download paths, and makes
Tier A coverage fail closed when instrumentation fails or a runtime-owning
production file disappears from a project or from the merged Istanbul report.

The old `coverage:ci` exited 0 despite a `Failed to collect coverage`
diagnostic: libs/m3u-state/src/lib/effects.ts was simply absent from the merged
map. All 30 Tier A reports are now required, the merged map covers 710 files,
and effects.ts is reported as 0/159 instead of silently disappearing.

Also fixes remote static-file path containment for encoded, malformed, NUL,
POSIX and Win32-style traversal inputs, with behavior-preserving testability
seams.

Statements 69.27% -> 69.54%; http-server.ts 0% -> 90.21%,
remote-control.events.ts 0% -> 96.55%, settings.events.ts 59.25% -> 96.29%.
2026-07-26 22:27:50 +02:00
4gray d5f5beab38 chore(deps): bump the npm minor/patch group across 43 packages (#1270)
Rebuilt from #1251 so the group could merge, on top of the transitive-CVE
overrides from #1258. Supersedes #1230 and #1251.

Carries axios 1.16.0 -> 1.18.1, closing seven runtime-scope advisories
including the proxy-credential leak on redirects, and sharp 0.34.5 -> 0.35.3
for the libvips CVEs.

`esModuleInterop` moves to tsconfig.base.json. artplayer 5.4.0 switched from a
Parcel build exposing `module.exports.default` to UMD assigning
`module.exports` directly; the flag was only set in apps/web, so every lib
compiled `import Artplayer from 'artplayer'` to `.default` and got undefined.
Production was never affected — esbuild resolves the ESM entry.

Two packages are deliberately held back, each for its own PR:

- epg-parser ^0.5.0 — grouped as a minor, but 0.x minors are breaking and this
  one reshapes the parse output (`channel.name` -> `displayName`, icons/urls
  become objects, `credits` becomes role-keyed, dates switch to ISO). Its only
  consumer is the uncovered web-backend `/parse-xml` endpoint.
- electron-builder ^26.15.3 — rewrote the snap target, and the resulting snap
  cannot start (`command.sh` execs a `desktop-init.sh` that never lands at the
  snap root under our core22 strict config). Its two required fixes go with it:
  the `engines` node floor from @electron/rebuild 4, and resolving upstream
  node-gyp instead of the dropped `@electron/node-gyp` fork.
2026-07-26 19:43:35 +02:00