mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-08 09:01:03 -08:00
Nine PRs landed between 2026-08-01 and 2026-08-04 in parallel worktrees, each
editing its own section of docs/architecture/stalker-portal.md and CLAUDE.md.
Sections that were correct when written disagreed with each other, or with
master, afterwards. Every claim here was verified against the code.
Corrected in stalker-portal.md: routes listed without the /workspace prefix;
"simple portals carry only the mac= cookie" (every request goes through the
shared identity builder — but the direct branch forwards no serial, so no
SN/__cfduid either, while playback headers are NOT mode-gated); a facade
introduced as "three modules" above a list of five; the pre-#1370 "blank
fields are not generated" opening; an ambiguous stalker-identity.utils.ts
citation (two files share the name); two of the three surfaces that apply the
scoped header override; a bare {status: 1} now being a refusal; and the
session-state fields #1354 added to the backup exclusion list (mirrored in
playlist-backup-restore.md).
CLAUDE.md had no entry at all for portal mode / endpoint discovery / lazy
repair — the largest change of the series; added one. Its session-facade list
was missing two modules and status 1 still read as plain "blocked".
Mock server: documented the /stalker, /stream/gated and marketing-poster
routes and the HOST variable; replaced the global POST /reset guidance with
the real per-MAC isolation contract (OWNED_MACS, the sibling 00:1A:79:5F:*
range, mode: 'serial'); added get_main_info; refreshed the project tree; fixed
a broken anchor; and corrected MOCK_PORT, which moves the client side only —
nothing maps it to the server's PORT.
The repo skill's "keep Stalker request rules in Stalker data access" no longer
holds: the wire-format, identity, portal-mode and auth-failure contracts live
in shared/interfaces because the Electron main process cannot import renderer
libs.
Also fixes four stale code comments carrying the same claims, including
"Single choke point for Stalker API calls" — four callers deliberately go
direct, and only fetchViaProfile() wires repair itself.
Docs and comments only; no executable change. No release note (no user-visible
behavior); no-release-note label applied for the libs/** paths.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
124 lines
3.8 KiB
TypeScript
124 lines
3.8 KiB
TypeScript
import { defineConfig, devices } from '@playwright/test';
|
|
import { nxE2EPreset } from '@nx/playwright/preset';
|
|
import { workspaceRoot } from '@nx/devkit';
|
|
|
|
const isStaticPwaE2E = process.env['IPTVNATOR_E2E_STATIC_PWA'] === '1';
|
|
const staticPwaPort = process.env['IPTVNATOR_E2E_STATIC_PORT'] ?? '4300';
|
|
// For CI, you may want to set BASE_URL to the deployed application.
|
|
const baseURL =
|
|
process.env['BASE_URL'] ||
|
|
(isStaticPwaE2E
|
|
? `http://localhost:${staticPwaPort}`
|
|
: 'http://localhost:4200');
|
|
const webServerCommand =
|
|
isStaticPwaE2E
|
|
? `pnpm nx run web:serve-static --port=${staticPwaPort}`
|
|
: 'pnpm nx run web:serve';
|
|
const reuseExistingWebServer = isStaticPwaE2E ? false : !process.env['CI'];
|
|
|
|
/**
|
|
* Read environment variables from file.
|
|
* https://github.com/motdotla/dotenv
|
|
*/
|
|
// require('dotenv').config();
|
|
|
|
/**
|
|
* See https://playwright.dev/docs/test-configuration.
|
|
*/
|
|
export default defineConfig({
|
|
...nxE2EPreset(__filename, { testDir: './src' }),
|
|
testMatch: ['**/*.e2e.ts'],
|
|
reporter: [
|
|
['list'],
|
|
[
|
|
'html',
|
|
{
|
|
outputFolder: '../../dist/playwright-report/web-e2e',
|
|
},
|
|
],
|
|
[
|
|
'json',
|
|
{
|
|
outputFile: '../../dist/test-results/web-e2e/results.json',
|
|
},
|
|
],
|
|
],
|
|
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
|
|
use: {
|
|
baseURL,
|
|
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
|
|
trace: 'on-first-retry',
|
|
},
|
|
/* Run local dev servers before starting the tests.
|
|
* Both the Angular app and the Stalker mock server start in parallel.
|
|
*
|
|
* MOCK_PORT only moves where the CLIENT looks — this health check and the
|
|
* specs' MOCK_SERVER constants. The mock reads PORT, which
|
|
* stalker-mock-server's serve target pins to 3210, and nothing maps one to
|
|
* the other, so MOCK_PORT alone makes the wait below time out. Use it to
|
|
* point at a mock you started yourself on that port.
|
|
*/
|
|
webServer: [
|
|
{
|
|
command: webServerCommand,
|
|
url: baseURL,
|
|
reuseExistingServer: reuseExistingWebServer,
|
|
cwd: workspaceRoot,
|
|
},
|
|
{
|
|
command: 'pnpm nx run stalker-mock-server:serve',
|
|
url: `http://localhost:${process.env['MOCK_PORT'] ?? '3210'}/health`,
|
|
reuseExistingServer: !process.env['CI'],
|
|
cwd: workspaceRoot,
|
|
},
|
|
{
|
|
command: 'pnpm nx run xtream-mock-server:serve',
|
|
url: `http://localhost:${process.env['XTREAM_MOCK_PORT'] ?? '3211'}/health`,
|
|
reuseExistingServer: !process.env['CI'],
|
|
cwd: workspaceRoot,
|
|
},
|
|
{
|
|
command: 'pnpm nx run web-backend:serve',
|
|
url: 'http://localhost:3333/health',
|
|
reuseExistingServer: !process.env['CI'],
|
|
cwd: workspaceRoot,
|
|
},
|
|
],
|
|
projects: [
|
|
{
|
|
name: 'chromium',
|
|
use: { ...devices['Desktop Chrome'] },
|
|
},
|
|
|
|
{
|
|
name: 'firefox',
|
|
use: { ...devices['Desktop Firefox'] },
|
|
},
|
|
|
|
{
|
|
name: 'webkit',
|
|
use: { ...devices['Desktop Safari'] },
|
|
},
|
|
|
|
// Uncomment for mobile browsers support
|
|
/* {
|
|
name: 'Mobile Chrome',
|
|
use: { ...devices['Pixel 5'] },
|
|
},
|
|
{
|
|
name: 'Mobile Safari',
|
|
use: { ...devices['iPhone 12'] },
|
|
}, */
|
|
|
|
// Uncomment for branded browsers
|
|
/* {
|
|
name: 'Microsoft Edge',
|
|
use: { ...devices['Desktop Edge'], channel: 'msedge' },
|
|
},
|
|
{
|
|
name: 'Google Chrome',
|
|
use: { ...devices['Desktop Chrome'], channel: 'chrome' },
|
|
} */
|
|
],
|
|
});
|