Skip to content

Using claude to identify and address several issues.#802

Merged
mcottontensor merged 24 commits intoEpicGamesExt:masterfrom
mcottontensor:claude-review
Apr 13, 2026
Merged

Using claude to identify and address several issues.#802
mcottontensor merged 24 commits intoEpicGamesExt:masterfrom
mcottontensor:claude-review

Conversation

@mcottontensor
Copy link
Copy Markdown
Collaborator

Summary

A broad sweep of the monorepo addressing build tooling consistency, real bugs found during review, and a broken test suite.

Tooling standardization

  • Standardized TypeScript to ^5.7.3 across all packages (was 4.9.5^5.3.2 in some Extras packages)
  • Standardized TypeScript compile target to ES6 across all tsconfig.json files
  • Standardized eslint to ^9.39.0 and typescript-eslint to ^8.26.1 across all packages
  • Standardized @types/node to ^22.14.0 across all workspaces
  • Re-enabled 7 previously-suppressed ESLint rules in Frontend/library and Frontend/ui-library (no-floating-promises, no-duplicate-type-constituents, no-redundant-type-constituents, no-unnecessary-type-assertion, no-array-delete, no-unsafe-enum-comparison, require-await, no-base-to-string) and fixed all resulting violations

Bug fixes

Common

  • EventEmitter.once(): args were passed as a single array instead of spread — listener(args)listener(...args)
  • message_helpers.ts: removed extra " from error string; guarded messageType.fields?.find( against undefined
  • WebSocketTransport.ts: error as string → proper instanceof Error check before accessing .message

Signalling

  • PlayerRegistry: removed playerCount field that was tracked but never read (.count() used players.size directly)
  • StreamerRegistry: fixed several loose equality comparisons
  • SignallingServer: extracted duplicated 3-line sendConfigMessage block that appeared identically in onStreamerConnected, onPlayerConnected, and onSFUConnected

SignallingWebServer (Wilbur)

  • status.ts: corrected operationId from 'getConfig' to 'getStatus'
  • players/{playerId}.ts and streamers/{streamerId}.ts: replaced throw new Error(...) with a proper 404 JSON response — throwing inside an Express route handler causes an unhandled rejection rather than an HTTP error response

Frontend/library

  • AFKController: replaced console.log calls with Logger.Warning
  • VideoPlayer: replaced console.log calls with Logger.Warning
  • Various files: strict equality throughout (==/!====/!==)
  • WebRtcPlayerController: simplified redundant statsTimerHandle && statsTimerHandle !== undefined guard to if (this.statsTimerHandle)

Frontend/ui-library

  • PixelStreamingApplicationStyles.ts: fixed CSS variable typo --colour8--color8 (variable was defined as --color8 but referenced with British spelling, causing the border style to silently fail)
  • ActionOverlay/TextOverlay: simplified text != null || text != undefined to idiomatic text != null

SFU

  • sfu_server.js: fixed readUint16LEreadUInt16LE (Node.js Buffer method casing)
  • sfu_server.js: added const to for...of loops, wrapped JSON.parse(message) in try/catch, strict equality throughout
  • config.js: strict equality fixes

Test suite repair

  • All 3 test suites in Frontend/library were failing to run due to a dependency conflict: the root overrides pinned glob to >=7.2.3 (a security fix), which resolved to glob@13. test-exclude@6 (a transitive dependency of babel-plugin-istanbul → jest coverage) uses promisify(require('glob')), which throws in glob@9+ because the module no longer exports a callable default. Fixed by adding "test-exclude": "^7.0.2" to root overrides — v7 uses named imports compatible with the newer glob API. All 35 tests now pass.

Bumps typescript to ^5.7.3 in Extras/SS_Test and Extras/mediasoup-sdp-bridge
(was ^5.3.2 and 4.9.5 respectively). Adds moduleResolution: Node16 override
to mediasoup-sdp-bridge tsconfig to satisfy TS5 strictness on @tsconfig/node16.

Re-enables 7 previously-disabled ESLint rules in Frontend/library and
Frontend/ui-library (no-duplicate-type-constituents, no-redundant-type-constituents,
no-unnecessary-type-assertion, no-array-delete, no-unsafe-enum-comparison,
require-await, no-base-to-string) and fixes all resulting violations.
Adds void operator to all floating promises in Frontend/library and
Frontend/ui-library. Browser UI APIs (fullscreen, pointer lock, media
play) are genuine fire-and-forget; WebRTC/XR operations use void to
explicitly acknowledge unhandled promises.
- Set target: ES6 in SignallingWebServer, SS_Test, and react tsconfigs
  (was es2016 and es5; also removed misplaced top-level lib arrays)
- Pin eslint to ^9.39.0 and typescript-eslint to ^8.26.1 across all
  packages that use it
The root overrides had "glob": ">=7.2.3" (security fix) which resolved
to glob@13. test-exclude@6 used promisify(require('glob')), which throws
because glob@9+ no longer exports a callable default. Overriding
test-exclude to ^7.0.2 fixes the incompatibility — v7 uses named imports
compatible with glob@10+.
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Apr 9, 2026

⚠️ No Changeset found

Latest commit: e73bbf9

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@mcottontensor mcottontensor added auto-backport Used to specify we want a PR to auto backport to a branch, must be paired with auto-backport-to-UEX. auto-backport-to-UE5.5 auto-backport-to-UE5.6 auto-backport-to-UE5.7 labels Apr 9, 2026
openapi-framework's dynamic import uses `file://${path}` URLs at
runtime. On Windows, paths containing `{streamerId}` produce invalid
file:// URLs (curly braces must be percent-encoded), causing those
route handlers to silently fail to register.

Replace `paths: './dist/paths'` with explicit static imports so that
Node.js require() handles the filesystem path (which has no URL
encoding requirements). Also add .catch() error logging so any future
init failures are visible in the signalling server logs.
…ions, add npm cache

- Fix healthcheck-image-sfu.yml path trigger typo (workflow -> workflows)
- Upgrade all actions/checkout from v3 to v4
- Upgrade all actions/setup-node from v3 to v4
- Add cache: 'npm' to setup-node steps in build/test workflows
- Pin npm install in changesets-publish to 11.5.1 instead of @latest
The publish workflow already validates each package builds against public
npm dependencies in sequence before publishing. By the time a release is
created, this has already been proven. The separate healthcheck is
redundant and the trigger in create-gh-release.yml has been removed.
…exclusions

Build steps were excluded from the archives anyway, making them pointless.
On a clean checkout there are no node_modules or dist directories, so those
exclusions were also redundant. The release archives are source distributions.
Also fix incorrect 'Login to GitHub Container Registry' label in
publish-sfu-image.yml — both workflows publish to Docker Hub.
Instead of creating a new issue on every failed run, find any existing
open 'Link Checker Report' issue and update it in place. Also close the
issue automatically when all links pass so it doesn't sit open stale.
@mcottontensor mcottontensor merged commit 96066d6 into EpicGamesExt:master Apr 13, 2026
10 checks passed
@mcottontensor mcottontensor deleted the claude-review branch April 13, 2026 01:30
@mcottontensor mcottontensor added auto-backport Used to specify we want a PR to auto backport to a branch, must be paired with auto-backport-to-UEX. and removed auto-backport Used to specify we want a PR to auto backport to a branch, must be paired with auto-backport-to-UEX. labels Apr 13, 2026
@github-actions
Copy link
Copy Markdown
Contributor

💔 All backports failed

Status Branch Result
UE5.5 Backport failed because of merge conflicts

You might need to backport the following PRs to UE5.5:
- Add guard against closed peerConnection (#788)
- chore(deps): bump lodash in the npm_and_yarn group across 1 directory (#777)
- Fix Pixel Streaming intermittently fails to make a network connection even with correct ICE candidates (#694)
- Made it clearer whether video timing or abs-capture-time is used
- Fixing linting error
- Merge branch 'master' into capture-time
- Linting fix
- Made code more exclusive of Firefox weirdness
- Disable header extension for Firefox as it causes it to not connect
- Added latency info to tests, fixed linting
UE5.6 Backport failed because of merge conflicts

You might need to backport the following PRs to UE5.6:
- Add guard against closed peerConnection (#788)
- chore(deps): bump lodash in the npm_and_yarn group across 1 directory (#777)
UE5.7 Backport failed because of merge conflicts

Manual backport

To create the backport manually run:

backport --pr 802

Questions ?

Please refer to the Backport tool documentation and see the Github Action logs for details

mcottontensor added a commit to mcottontensor/PixelStreamingInfrastructure that referenced this pull request Apr 13, 2026
* chore: add CLAUDE.md with repo guidance for Claude Code

* chore: standardize TypeScript version and re-enable ESLint rules

Bumps typescript to ^5.7.3 in Extras/SS_Test and Extras/mediasoup-sdp-bridge
(was ^5.3.2 and 4.9.5 respectively). Adds moduleResolution: Node16 override
to mediasoup-sdp-bridge tsconfig to satisfy TS5 strictness on @tsconfig/node16.

Re-enables 7 previously-disabled ESLint rules in Frontend/library and
Frontend/ui-library (no-duplicate-type-constituents, no-redundant-type-constituents,
no-unnecessary-type-assertion, no-array-delete, no-unsafe-enum-comparison,
require-await, no-base-to-string) and fixes all resulting violations.

* chore: re-enable no-floating-promises ESLint rule

Adds void operator to all floating promises in Frontend/library and
Frontend/ui-library. Browser UI APIs (fullscreen, pointer lock, media
play) are genuine fire-and-forget; WebRTC/XR operations use void to
explicitly acknowledge unhandled promises.

* chore: standardize @types/node to ^22.14.0 across all workspaces

* chore: standardize TypeScript target to ES6 and ESLint deps

- Set target: ES6 in SignallingWebServer, SS_Test, and react tsconfigs
  (was es2016 and es5; also removed misplaced top-level lib arrays)
- Pin eslint to ^9.39.0 and typescript-eslint to ^8.26.1 across all
  packages that use it

* fix: spread args correctly in EventEmitter.once() callback

* fix: correct error message typo, guard fields access, and fix error cast in WebSocketTransport

* fix(signalling): remove redundant playerCount, deduplicate config message, strict equality

* fix(wilbur): correct status operationId, return 404 for missing resources, strict equality

* fix(frontend/library): strict equality, replace console.log with Logger

* fix(frontend/ui-library): strict equality, fix --colour8 CSS variable typo

* fix(sfu): add const to for-of loops, guard JSON.parse, strict equality, fix readUInt16LE casing

* fix: upgrade test-exclude to v7 to fix jest tests broken by glob v13

The root overrides had "glob": ">=7.2.3" (security fix) which resolved
to glob@13. test-exclude@6 used promisify(require('glob')), which throws
because glob@9+ no longer exports a callable default. Overriding
test-exclude to ^7.0.2 fixes the incompatibility — v7 uses named imports
compatible with glob@10+.

* fix(JSStreamer): add rootDir to tsconfig.cjs.json to fix webpack ts-loader TS5011 error

* fix(ci): always output signalling and streamer logs in streaming healthcheck

* fix: use static imports for REST API path handlers to fix Windows CI

openapi-framework's dynamic import uses `file://${path}` URLs at
runtime. On Windows, paths containing `{streamerId}` produce invalid
file:// URLs (curly braces must be percent-encoded), causing those
route handlers to silently fail to register.

Replace `paths: './dist/paths'` with explicit static imports so that
Node.js require() handles the filesystem path (which has no URL
encoding requirements). Also add .catch() error logging so any future
init failures are visible in the signalling server logs.

* chore: update GitHub Actions — fix path typo, standardize action versions, add npm cache

- Fix healthcheck-image-sfu.yml path trigger typo (workflow -> workflows)
- Upgrade all actions/checkout from v3 to v4
- Upgrade all actions/setup-node from v3 to v4
- Add cache: 'npm' to setup-node steps in build/test workflows
- Pin npm install in changesets-publish to 11.5.1 instead of @latest

* fix: replace fixed sleep with registry propagation poll in npm publish workflow

* fix: create or update release tag on npm publish to handle re-runs

* chore: remove redundant healthcheck-libs-with-public-deps workflow

The publish workflow already validates each package builds against public
npm dependencies in sequence before publishing. By the time a release is
created, this has already been proven. The separate healthcheck is
redundant and the trigger in create-gh-release.yml has been removed.

* chore: simplify create-gh-release — remove redundant build steps and exclusions

Build steps were excluded from the archives anyway, making them pointless.
On a clean checkout there are no node_modules or dist directories, so those
exclusions were also redundant. The release archives are source distributions.

* fix: create or update docker release tags to handle re-runs

Also fix incorrect 'Login to GitHub Container Registry' label in
publish-sfu-image.yml — both workflows publish to Docker Hub.

* fix: deduplicate link checker issues and auto-close when links pass

Instead of creating a new issue on every failed run, find any existing
open 'Link Checker Report' issue and update it in place. Also close the
issue automatically when all links pass so it doesn't sit open stale.

* docs: add DEVELOPING.md describing development workflow from feature to release

(cherry picked from commit 96066d6)

# Conflicts:
#	.github/workflows/changesets-publish-npm-packages.yml
#	.github/workflows/healthcheck-libs-with-public-deps.yml
#	Extras/SS_Test/package.json
#	Frontend/library/src/PeerConnectionController/PeerConnectionController.ts
#	Frontend/ui-library/src/UI/SessionTest.ts
#	package-lock.json
#	package.json
mcottontensor added a commit to mcottontensor/PixelStreamingInfrastructure that referenced this pull request Apr 13, 2026
* chore: add CLAUDE.md with repo guidance for Claude Code

* chore: standardize TypeScript version and re-enable ESLint rules

Bumps typescript to ^5.7.3 in Extras/SS_Test and Extras/mediasoup-sdp-bridge
(was ^5.3.2 and 4.9.5 respectively). Adds moduleResolution: Node16 override
to mediasoup-sdp-bridge tsconfig to satisfy TS5 strictness on @tsconfig/node16.

Re-enables 7 previously-disabled ESLint rules in Frontend/library and
Frontend/ui-library (no-duplicate-type-constituents, no-redundant-type-constituents,
no-unnecessary-type-assertion, no-array-delete, no-unsafe-enum-comparison,
require-await, no-base-to-string) and fixes all resulting violations.

* chore: re-enable no-floating-promises ESLint rule

Adds void operator to all floating promises in Frontend/library and
Frontend/ui-library. Browser UI APIs (fullscreen, pointer lock, media
play) are genuine fire-and-forget; WebRTC/XR operations use void to
explicitly acknowledge unhandled promises.

* chore: standardize @types/node to ^22.14.0 across all workspaces

* chore: standardize TypeScript target to ES6 and ESLint deps

- Set target: ES6 in SignallingWebServer, SS_Test, and react tsconfigs
  (was es2016 and es5; also removed misplaced top-level lib arrays)
- Pin eslint to ^9.39.0 and typescript-eslint to ^8.26.1 across all
  packages that use it

* fix: spread args correctly in EventEmitter.once() callback

* fix: correct error message typo, guard fields access, and fix error cast in WebSocketTransport

* fix(signalling): remove redundant playerCount, deduplicate config message, strict equality

* fix(wilbur): correct status operationId, return 404 for missing resources, strict equality

* fix(frontend/library): strict equality, replace console.log with Logger

* fix(frontend/ui-library): strict equality, fix --colour8 CSS variable typo

* fix(sfu): add const to for-of loops, guard JSON.parse, strict equality, fix readUInt16LE casing

* fix: upgrade test-exclude to v7 to fix jest tests broken by glob v13

The root overrides had "glob": ">=7.2.3" (security fix) which resolved
to glob@13. test-exclude@6 used promisify(require('glob')), which throws
because glob@9+ no longer exports a callable default. Overriding
test-exclude to ^7.0.2 fixes the incompatibility — v7 uses named imports
compatible with glob@10+.

* fix(JSStreamer): add rootDir to tsconfig.cjs.json to fix webpack ts-loader TS5011 error

* fix(ci): always output signalling and streamer logs in streaming healthcheck

* fix: use static imports for REST API path handlers to fix Windows CI

openapi-framework's dynamic import uses `file://${path}` URLs at
runtime. On Windows, paths containing `{streamerId}` produce invalid
file:// URLs (curly braces must be percent-encoded), causing those
route handlers to silently fail to register.

Replace `paths: './dist/paths'` with explicit static imports so that
Node.js require() handles the filesystem path (which has no URL
encoding requirements). Also add .catch() error logging so any future
init failures are visible in the signalling server logs.

* chore: update GitHub Actions — fix path typo, standardize action versions, add npm cache

- Fix healthcheck-image-sfu.yml path trigger typo (workflow -> workflows)
- Upgrade all actions/checkout from v3 to v4
- Upgrade all actions/setup-node from v3 to v4
- Add cache: 'npm' to setup-node steps in build/test workflows
- Pin npm install in changesets-publish to 11.5.1 instead of @latest

* fix: replace fixed sleep with registry propagation poll in npm publish workflow

* fix: create or update release tag on npm publish to handle re-runs

* chore: remove redundant healthcheck-libs-with-public-deps workflow

The publish workflow already validates each package builds against public
npm dependencies in sequence before publishing. By the time a release is
created, this has already been proven. The separate healthcheck is
redundant and the trigger in create-gh-release.yml has been removed.

* chore: simplify create-gh-release — remove redundant build steps and exclusions

Build steps were excluded from the archives anyway, making them pointless.
On a clean checkout there are no node_modules or dist directories, so those
exclusions were also redundant. The release archives are source distributions.

* fix: create or update docker release tags to handle re-runs

Also fix incorrect 'Login to GitHub Container Registry' label in
publish-sfu-image.yml — both workflows publish to Docker Hub.

* fix: deduplicate link checker issues and auto-close when links pass

Instead of creating a new issue on every failed run, find any existing
open 'Link Checker Report' issue and update it in place. Also close the
issue automatically when all links pass so it doesn't sit open stale.

* docs: add DEVELOPING.md describing development workflow from feature to release

(cherry picked from commit 96066d6)

# Conflicts:
#	.github/workflows/changesets-publish-npm-packages.yml
#	Extras/SS_Test/package.json
#	Frontend/library/src/PeerConnectionController/PeerConnectionController.ts
#	package-lock.json
#	package.json
mcottontensor added a commit to mcottontensor/PixelStreamingInfrastructure that referenced this pull request Apr 13, 2026
* chore: add CLAUDE.md with repo guidance for Claude Code

* chore: standardize TypeScript version and re-enable ESLint rules

Bumps typescript to ^5.7.3 in Extras/SS_Test and Extras/mediasoup-sdp-bridge
(was ^5.3.2 and 4.9.5 respectively). Adds moduleResolution: Node16 override
to mediasoup-sdp-bridge tsconfig to satisfy TS5 strictness on @tsconfig/node16.

Re-enables 7 previously-disabled ESLint rules in Frontend/library and
Frontend/ui-library (no-duplicate-type-constituents, no-redundant-type-constituents,
no-unnecessary-type-assertion, no-array-delete, no-unsafe-enum-comparison,
require-await, no-base-to-string) and fixes all resulting violations.

* chore: re-enable no-floating-promises ESLint rule

Adds void operator to all floating promises in Frontend/library and
Frontend/ui-library. Browser UI APIs (fullscreen, pointer lock, media
play) are genuine fire-and-forget; WebRTC/XR operations use void to
explicitly acknowledge unhandled promises.

* chore: standardize @types/node to ^22.14.0 across all workspaces

* chore: standardize TypeScript target to ES6 and ESLint deps

- Set target: ES6 in SignallingWebServer, SS_Test, and react tsconfigs
  (was es2016 and es5; also removed misplaced top-level lib arrays)
- Pin eslint to ^9.39.0 and typescript-eslint to ^8.26.1 across all
  packages that use it

* fix: spread args correctly in EventEmitter.once() callback

* fix: correct error message typo, guard fields access, and fix error cast in WebSocketTransport

* fix(signalling): remove redundant playerCount, deduplicate config message, strict equality

* fix(wilbur): correct status operationId, return 404 for missing resources, strict equality

* fix(frontend/library): strict equality, replace console.log with Logger

* fix(frontend/ui-library): strict equality, fix --colour8 CSS variable typo

* fix(sfu): add const to for-of loops, guard JSON.parse, strict equality, fix readUInt16LE casing

* fix: upgrade test-exclude to v7 to fix jest tests broken by glob v13

The root overrides had "glob": ">=7.2.3" (security fix) which resolved
to glob@13. test-exclude@6 used promisify(require('glob')), which throws
because glob@9+ no longer exports a callable default. Overriding
test-exclude to ^7.0.2 fixes the incompatibility — v7 uses named imports
compatible with glob@10+.

* fix(JSStreamer): add rootDir to tsconfig.cjs.json to fix webpack ts-loader TS5011 error

* fix(ci): always output signalling and streamer logs in streaming healthcheck

* fix: use static imports for REST API path handlers to fix Windows CI

openapi-framework's dynamic import uses `file://${path}` URLs at
runtime. On Windows, paths containing `{streamerId}` produce invalid
file:// URLs (curly braces must be percent-encoded), causing those
route handlers to silently fail to register.

Replace `paths: './dist/paths'` with explicit static imports so that
Node.js require() handles the filesystem path (which has no URL
encoding requirements). Also add .catch() error logging so any future
init failures are visible in the signalling server logs.

* chore: update GitHub Actions — fix path typo, standardize action versions, add npm cache

- Fix healthcheck-image-sfu.yml path trigger typo (workflow -> workflows)
- Upgrade all actions/checkout from v3 to v4
- Upgrade all actions/setup-node from v3 to v4
- Add cache: 'npm' to setup-node steps in build/test workflows
- Pin npm install in changesets-publish to 11.5.1 instead of @latest

* fix: replace fixed sleep with registry propagation poll in npm publish workflow

* fix: create or update release tag on npm publish to handle re-runs

* chore: remove redundant healthcheck-libs-with-public-deps workflow

The publish workflow already validates each package builds against public
npm dependencies in sequence before publishing. By the time a release is
created, this has already been proven. The separate healthcheck is
redundant and the trigger in create-gh-release.yml has been removed.

* chore: simplify create-gh-release — remove redundant build steps and exclusions

Build steps were excluded from the archives anyway, making them pointless.
On a clean checkout there are no node_modules or dist directories, so those
exclusions were also redundant. The release archives are source distributions.

* fix: create or update docker release tags to handle re-runs

Also fix incorrect 'Login to GitHub Container Registry' label in
publish-sfu-image.yml — both workflows publish to Docker Hub.

* fix: deduplicate link checker issues and auto-close when links pass

Instead of creating a new issue on every failed run, find any existing
open 'Link Checker Report' issue and update it in place. Also close the
issue automatically when all links pass so it doesn't sit open stale.

* docs: add DEVELOPING.md describing development workflow from feature to release

(cherry picked from commit 96066d6)

# Conflicts:
#	package-lock.json
#	package.json
@mcottontensor
Copy link
Copy Markdown
Collaborator Author

💚 All backports created successfully

Status Branch Result
UE5.5
UE5.6
UE5.7

Note: Successful backport PRs will be merged automatically after passing CI.

Questions ?

Please refer to the Backport tool documentation

mcottontensor added a commit that referenced this pull request Apr 13, 2026
…807)

* Using claude to identify and address several issues. (#802)

* chore: add CLAUDE.md with repo guidance for Claude Code

* chore: standardize TypeScript version and re-enable ESLint rules

Bumps typescript to ^5.7.3 in Extras/SS_Test and Extras/mediasoup-sdp-bridge
(was ^5.3.2 and 4.9.5 respectively). Adds moduleResolution: Node16 override
to mediasoup-sdp-bridge tsconfig to satisfy TS5 strictness on @tsconfig/node16.

Re-enables 7 previously-disabled ESLint rules in Frontend/library and
Frontend/ui-library (no-duplicate-type-constituents, no-redundant-type-constituents,
no-unnecessary-type-assertion, no-array-delete, no-unsafe-enum-comparison,
require-await, no-base-to-string) and fixes all resulting violations.

* chore: re-enable no-floating-promises ESLint rule

Adds void operator to all floating promises in Frontend/library and
Frontend/ui-library. Browser UI APIs (fullscreen, pointer lock, media
play) are genuine fire-and-forget; WebRTC/XR operations use void to
explicitly acknowledge unhandled promises.

* chore: standardize @types/node to ^22.14.0 across all workspaces

* chore: standardize TypeScript target to ES6 and ESLint deps

- Set target: ES6 in SignallingWebServer, SS_Test, and react tsconfigs
  (was es2016 and es5; also removed misplaced top-level lib arrays)
- Pin eslint to ^9.39.0 and typescript-eslint to ^8.26.1 across all
  packages that use it

* fix: spread args correctly in EventEmitter.once() callback

* fix: correct error message typo, guard fields access, and fix error cast in WebSocketTransport

* fix(signalling): remove redundant playerCount, deduplicate config message, strict equality

* fix(wilbur): correct status operationId, return 404 for missing resources, strict equality

* fix(frontend/library): strict equality, replace console.log with Logger

* fix(frontend/ui-library): strict equality, fix --colour8 CSS variable typo

* fix(sfu): add const to for-of loops, guard JSON.parse, strict equality, fix readUInt16LE casing

* fix: upgrade test-exclude to v7 to fix jest tests broken by glob v13

The root overrides had "glob": ">=7.2.3" (security fix) which resolved
to glob@13. test-exclude@6 used promisify(require('glob')), which throws
because glob@9+ no longer exports a callable default. Overriding
test-exclude to ^7.0.2 fixes the incompatibility — v7 uses named imports
compatible with glob@10+.

* fix(JSStreamer): add rootDir to tsconfig.cjs.json to fix webpack ts-loader TS5011 error

* fix(ci): always output signalling and streamer logs in streaming healthcheck

* fix: use static imports for REST API path handlers to fix Windows CI

openapi-framework's dynamic import uses `file://${path}` URLs at
runtime. On Windows, paths containing `{streamerId}` produce invalid
file:// URLs (curly braces must be percent-encoded), causing those
route handlers to silently fail to register.

Replace `paths: './dist/paths'` with explicit static imports so that
Node.js require() handles the filesystem path (which has no URL
encoding requirements). Also add .catch() error logging so any future
init failures are visible in the signalling server logs.

* chore: update GitHub Actions — fix path typo, standardize action versions, add npm cache

- Fix healthcheck-image-sfu.yml path trigger typo (workflow -> workflows)
- Upgrade all actions/checkout from v3 to v4
- Upgrade all actions/setup-node from v3 to v4
- Add cache: 'npm' to setup-node steps in build/test workflows
- Pin npm install in changesets-publish to 11.5.1 instead of @latest

* fix: replace fixed sleep with registry propagation poll in npm publish workflow

* fix: create or update release tag on npm publish to handle re-runs

* chore: remove redundant healthcheck-libs-with-public-deps workflow

The publish workflow already validates each package builds against public
npm dependencies in sequence before publishing. By the time a release is
created, this has already been proven. The separate healthcheck is
redundant and the trigger in create-gh-release.yml has been removed.

* chore: simplify create-gh-release — remove redundant build steps and exclusions

Build steps were excluded from the archives anyway, making them pointless.
On a clean checkout there are no node_modules or dist directories, so those
exclusions were also redundant. The release archives are source distributions.

* fix: create or update docker release tags to handle re-runs

Also fix incorrect 'Login to GitHub Container Registry' label in
publish-sfu-image.yml — both workflows publish to Docker Hub.

* fix: deduplicate link checker issues and auto-close when links pass

Instead of creating a new issue on every failed run, find any existing
open 'Link Checker Report' issue and update it in place. Also close the
issue automatically when all links pass so it doesn't sit open stale.

* docs: add DEVELOPING.md describing development workflow from feature to release

(cherry picked from commit 96066d6)

# Conflicts:
#	package-lock.json
#	package.json

* chore: rebuilt package-lock.

* fix: fixing errors from version mismatches.

* ci: updating token usage in link checker to work with forked branches.
mcottontensor added a commit that referenced this pull request Apr 14, 2026
…806)

* Using claude to identify and address several issues. (#802)

* chore: add CLAUDE.md with repo guidance for Claude Code

* chore: standardize TypeScript version and re-enable ESLint rules

Bumps typescript to ^5.7.3 in Extras/SS_Test and Extras/mediasoup-sdp-bridge
(was ^5.3.2 and 4.9.5 respectively). Adds moduleResolution: Node16 override
to mediasoup-sdp-bridge tsconfig to satisfy TS5 strictness on @tsconfig/node16.

Re-enables 7 previously-disabled ESLint rules in Frontend/library and
Frontend/ui-library (no-duplicate-type-constituents, no-redundant-type-constituents,
no-unnecessary-type-assertion, no-array-delete, no-unsafe-enum-comparison,
require-await, no-base-to-string) and fixes all resulting violations.

* chore: re-enable no-floating-promises ESLint rule

Adds void operator to all floating promises in Frontend/library and
Frontend/ui-library. Browser UI APIs (fullscreen, pointer lock, media
play) are genuine fire-and-forget; WebRTC/XR operations use void to
explicitly acknowledge unhandled promises.

* chore: standardize @types/node to ^22.14.0 across all workspaces

* chore: standardize TypeScript target to ES6 and ESLint deps

- Set target: ES6 in SignallingWebServer, SS_Test, and react tsconfigs
  (was es2016 and es5; also removed misplaced top-level lib arrays)
- Pin eslint to ^9.39.0 and typescript-eslint to ^8.26.1 across all
  packages that use it

* fix: spread args correctly in EventEmitter.once() callback

* fix: correct error message typo, guard fields access, and fix error cast in WebSocketTransport

* fix(signalling): remove redundant playerCount, deduplicate config message, strict equality

* fix(wilbur): correct status operationId, return 404 for missing resources, strict equality

* fix(frontend/library): strict equality, replace console.log with Logger

* fix(frontend/ui-library): strict equality, fix --colour8 CSS variable typo

* fix(sfu): add const to for-of loops, guard JSON.parse, strict equality, fix readUInt16LE casing

* fix: upgrade test-exclude to v7 to fix jest tests broken by glob v13

The root overrides had "glob": ">=7.2.3" (security fix) which resolved
to glob@13. test-exclude@6 used promisify(require('glob')), which throws
because glob@9+ no longer exports a callable default. Overriding
test-exclude to ^7.0.2 fixes the incompatibility — v7 uses named imports
compatible with glob@10+.

* fix(JSStreamer): add rootDir to tsconfig.cjs.json to fix webpack ts-loader TS5011 error

* fix(ci): always output signalling and streamer logs in streaming healthcheck

* fix: use static imports for REST API path handlers to fix Windows CI

openapi-framework's dynamic import uses `file://${path}` URLs at
runtime. On Windows, paths containing `{streamerId}` produce invalid
file:// URLs (curly braces must be percent-encoded), causing those
route handlers to silently fail to register.

Replace `paths: './dist/paths'` with explicit static imports so that
Node.js require() handles the filesystem path (which has no URL
encoding requirements). Also add .catch() error logging so any future
init failures are visible in the signalling server logs.

* chore: update GitHub Actions — fix path typo, standardize action versions, add npm cache

- Fix healthcheck-image-sfu.yml path trigger typo (workflow -> workflows)
- Upgrade all actions/checkout from v3 to v4
- Upgrade all actions/setup-node from v3 to v4
- Add cache: 'npm' to setup-node steps in build/test workflows
- Pin npm install in changesets-publish to 11.5.1 instead of @latest

* fix: replace fixed sleep with registry propagation poll in npm publish workflow

* fix: create or update release tag on npm publish to handle re-runs

* chore: remove redundant healthcheck-libs-with-public-deps workflow

The publish workflow already validates each package builds against public
npm dependencies in sequence before publishing. By the time a release is
created, this has already been proven. The separate healthcheck is
redundant and the trigger in create-gh-release.yml has been removed.

* chore: simplify create-gh-release — remove redundant build steps and exclusions

Build steps were excluded from the archives anyway, making them pointless.
On a clean checkout there are no node_modules or dist directories, so those
exclusions were also redundant. The release archives are source distributions.

* fix: create or update docker release tags to handle re-runs

Also fix incorrect 'Login to GitHub Container Registry' label in
publish-sfu-image.yml — both workflows publish to Docker Hub.

* fix: deduplicate link checker issues and auto-close when links pass

Instead of creating a new issue on every failed run, find any existing
open 'Link Checker Report' issue and update it in place. Also close the
issue automatically when all links pass so it doesn't sit open stale.

* docs: add DEVELOPING.md describing development workflow from feature to release

(cherry picked from commit 96066d6)

# Conflicts:
#	.github/workflows/changesets-publish-npm-packages.yml
#	Extras/SS_Test/package.json
#	Frontend/library/src/PeerConnectionController/PeerConnectionController.ts
#	package-lock.json
#	package.json

* chore: fixing lint errors.

* chore: fixing versioning issues in npm packages.

* chore: fixing lint issues.
mcottontensor added a commit that referenced this pull request Apr 14, 2026
…805)

* Using claude to identify and address several issues. (#802)

* chore: add CLAUDE.md with repo guidance for Claude Code

* chore: standardize TypeScript version and re-enable ESLint rules

Bumps typescript to ^5.7.3 in Extras/SS_Test and Extras/mediasoup-sdp-bridge
(was ^5.3.2 and 4.9.5 respectively). Adds moduleResolution: Node16 override
to mediasoup-sdp-bridge tsconfig to satisfy TS5 strictness on @tsconfig/node16.

Re-enables 7 previously-disabled ESLint rules in Frontend/library and
Frontend/ui-library (no-duplicate-type-constituents, no-redundant-type-constituents,
no-unnecessary-type-assertion, no-array-delete, no-unsafe-enum-comparison,
require-await, no-base-to-string) and fixes all resulting violations.

* chore: re-enable no-floating-promises ESLint rule

Adds void operator to all floating promises in Frontend/library and
Frontend/ui-library. Browser UI APIs (fullscreen, pointer lock, media
play) are genuine fire-and-forget; WebRTC/XR operations use void to
explicitly acknowledge unhandled promises.

* chore: standardize @types/node to ^22.14.0 across all workspaces

* chore: standardize TypeScript target to ES6 and ESLint deps

- Set target: ES6 in SignallingWebServer, SS_Test, and react tsconfigs
  (was es2016 and es5; also removed misplaced top-level lib arrays)
- Pin eslint to ^9.39.0 and typescript-eslint to ^8.26.1 across all
  packages that use it

* fix: spread args correctly in EventEmitter.once() callback

* fix: correct error message typo, guard fields access, and fix error cast in WebSocketTransport

* fix(signalling): remove redundant playerCount, deduplicate config message, strict equality

* fix(wilbur): correct status operationId, return 404 for missing resources, strict equality

* fix(frontend/library): strict equality, replace console.log with Logger

* fix(frontend/ui-library): strict equality, fix --colour8 CSS variable typo

* fix(sfu): add const to for-of loops, guard JSON.parse, strict equality, fix readUInt16LE casing

* fix: upgrade test-exclude to v7 to fix jest tests broken by glob v13

The root overrides had "glob": ">=7.2.3" (security fix) which resolved
to glob@13. test-exclude@6 used promisify(require('glob')), which throws
because glob@9+ no longer exports a callable default. Overriding
test-exclude to ^7.0.2 fixes the incompatibility — v7 uses named imports
compatible with glob@10+.

* fix(JSStreamer): add rootDir to tsconfig.cjs.json to fix webpack ts-loader TS5011 error

* fix(ci): always output signalling and streamer logs in streaming healthcheck

* fix: use static imports for REST API path handlers to fix Windows CI

openapi-framework's dynamic import uses `file://${path}` URLs at
runtime. On Windows, paths containing `{streamerId}` produce invalid
file:// URLs (curly braces must be percent-encoded), causing those
route handlers to silently fail to register.

Replace `paths: './dist/paths'` with explicit static imports so that
Node.js require() handles the filesystem path (which has no URL
encoding requirements). Also add .catch() error logging so any future
init failures are visible in the signalling server logs.

* chore: update GitHub Actions — fix path typo, standardize action versions, add npm cache

- Fix healthcheck-image-sfu.yml path trigger typo (workflow -> workflows)
- Upgrade all actions/checkout from v3 to v4
- Upgrade all actions/setup-node from v3 to v4
- Add cache: 'npm' to setup-node steps in build/test workflows
- Pin npm install in changesets-publish to 11.5.1 instead of @latest

* fix: replace fixed sleep with registry propagation poll in npm publish workflow

* fix: create or update release tag on npm publish to handle re-runs

* chore: remove redundant healthcheck-libs-with-public-deps workflow

The publish workflow already validates each package builds against public
npm dependencies in sequence before publishing. By the time a release is
created, this has already been proven. The separate healthcheck is
redundant and the trigger in create-gh-release.yml has been removed.

* chore: simplify create-gh-release — remove redundant build steps and exclusions

Build steps were excluded from the archives anyway, making them pointless.
On a clean checkout there are no node_modules or dist directories, so those
exclusions were also redundant. The release archives are source distributions.

* fix: create or update docker release tags to handle re-runs

Also fix incorrect 'Login to GitHub Container Registry' label in
publish-sfu-image.yml — both workflows publish to Docker Hub.

* fix: deduplicate link checker issues and auto-close when links pass

Instead of creating a new issue on every failed run, find any existing
open 'Link Checker Report' issue and update it in place. Also close the
issue automatically when all links pass so it doesn't sit open stale.

* docs: add DEVELOPING.md describing development workflow from feature to release

(cherry picked from commit 96066d6)

# Conflicts:
#	.github/workflows/changesets-publish-npm-packages.yml
#	.github/workflows/healthcheck-libs-with-public-deps.yml
#	Extras/SS_Test/package.json
#	Frontend/library/src/PeerConnectionController/PeerConnectionController.ts
#	Frontend/ui-library/src/UI/SessionTest.ts
#	package-lock.json
#	package.json

* chore: fix npm version locks.

* chore: fix lint issue in ui-library.

* chore: SessionTest is not needed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

auto-backport Used to specify we want a PR to auto backport to a branch, must be paired with auto-backport-to-UEX. auto-backport-to-UE5.5 auto-backport-to-UE5.6 auto-backport-to-UE5.7

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant