feat(stalker): discover portal endpoints on add and edit (#1391)

* feat(stalker): discover portal connection on edit

* docs(stalker): document smart endpoint discovery

* fix(stalker): make edited connection persistence atomic

* fix(stalker): serialize edit discovery

* fix(stalker): fence all edit authentication

* fix(stalker): serialize overlapping edits

* fix(stalker): hydrate playlist identity before edit

* test(stalker): await edit hydration

* fix(stalker): release abandoned edit fences

* fix(stalker): reject stale repairs before discovery

* fix(stalker): fence stale portal modes

* test(stalker): align simple portal session guard

* fix(stalker): reject superseded portal responses

* test(stalker): await settled append failure

* fix(stalker): retain abandoned auth fences

* fix(stalker): fence abandoned discovery retries

* fix(stalker): retire restored repair overrides

* fix(stalker): verify repair override retirement

* fix(stalker): preserve edit-owned repair tokens

* fix(stalker): defer repair retirement during edits

* fix(stalker): fence repair history reads

* fix(stalker): fingerprint portal URL credentials

* fix(stalker): persist submitted identity after navigation

* fix(stalker): merge late connection saves

* fix(stalker): keep edits off Xtream save path

* fix(stalker): preserve concurrent edit state

* fix(stalker): reject replaced late edit targets

* fix(stalker): guard every resolved edit write

* fix(stalker): make pwa edit guard transactional

* fix(stalker): migrate pwa flags transactionally

* fix(stalker): reserve pwa edits across tabs

* fix(stalker): coordinate playlist replacements with edit

* fix(stalker): reserve lazy repairs across tabs

* fix(stalker): drain local repair before edit lock

* fix(stalker): block queued repairs during edit drain
This commit is contained in:
4gray authored and GitHub committed 2026-08-09 22:34:49 +02:00
1 parent ae375e0e8f
commit 6ad9f3ff8a
74 files changed
+6353 -1083

No files matched your search

@@ -35,3 +35,23 @@ export type PlaylistMeta = Pick<
| 'stalkerSignature1'
| 'stalkerSignature2'
>;
export interface StalkerPlaylistSessionMetadata {
stalkerToken: string;
stalkerSessionIdentity?: string;
stalkerWatchdogTimeout?: number;
stalkerTimeslot?: number;
stalkerAccountInfo?: Playlist['stalkerAccountInfo'];
}
/**
* Metadata update accepted by the persistence boundary.
*
* `stalkerSessionPatch` is transient: absence preserves the negotiated
* session, `null` clears it, and an object fully replaces it. The patch is
* projected onto the existing flat playlist fields and is never persisted as
* its own database or backup property.
*/
export interface PlaylistMetaUpdate extends PlaylistMeta {
stalkerSessionPatch?: StalkerPlaylistSessionMetadata | null;
}