Skip to content

chore: sdk maintenance for react-native 0.81+ - #269

Merged
velocitysystems merged 30 commits into
masterfrom
chore/sdk-maintenance
Oct 26, 2026
Merged

velocitysystems merged 30 commits into
masterfrom
chore/sdk-maintenance

Conversation

@velocitysystems

@velocitysystems velocitysystems commented Sep 18, 2026 •

Copy link
Copy Markdown
Contributor

This PR releases 2.0.0. It updates the native SDKs, fixes RUM network timing and packaging, and sets React Native 0.81 as the minimum. It also removes unused dependencies and makes CI run each check one time.

Breaking changes

  • React Native 0.81 or later and React 19.1 or later are peer dependencies. raygun4android 6 requires Android SDK 36, and React Native 0.81 is the first release that uses SDK 36 by default.
  • Android: compileSdk 36, minSdk 24 and Java 17.
  • iOS: the minimum is 15.1, from React Native's min_ios_version_supported.
  • Node: engines requires >=20.19.4, the same as React Native 0.81.
  • raygun4android 6.2.3 cannot read crash reports that 6.3.0 caches. If an app downgrades to a release with 6.2.3, the device loses its pending reports.

Changes

Release

  • Set the version to 2.0.0 and add the CHANGELOG.md entry.

SDK

  • Fix RUM network timing on React Native 0.80 and later. Since 1.6.0, RUM sent no network events on these versions, because the SDK loaded a private React Native interceptor from a path that no longer exists. The new NetworkInterceptor.ts wraps XMLHttpRequest directly.
  • Capture fetch requests on Expo SDK 56 and later. Expo replaces the global fetch with a native fetch that does not use XHR. The SDK now wraps fetch too, and reports each request one time.
  • Key in-flight RUM requests by the request object in a WeakMap. This removes uuid, the last runtime dependency. uuid 14 has no main field, so some Metro configurations could not bundle the SDK.
  • Update raygun4android to 6.3.0 and remove the kotlin-stdlib exclude (Pulls kotlin-stdlib 2.3.0, breaking Android builds on Expo SDK 55 / React Native 0.81 #237). 6.2.3 fixes lost uncaught crash reports (raygun4android#322) and the okhttp conflict (raygun4android#324). 6.3.0 sends cached reports with the API key and endpoint that created them.
  • Remove six iOS method declarations that have no implementation, and one unused function. The SDK compiles with no warnings.

Packaging

  • Point the podspec at the v<version> tag in this repository. Before, it pointed at a branch on a personal fork.
  • Build dist/ in prepare, so pack and publish always make a new build. A files allowlist decreases the package from 40 files to 32.
  • Declare the react and react-native peer dependencies and the node engine.
  • Include the MIT license in the npm package.

Dependencies

Demos

  • Upgrade the bare demo to React Native 0.87.1.
  • Upgrade ExpoDemo to Expo SDK 57. ExpoDemo did not start on master after chore(deps-dev): bump typescript from 5.9.3 to 7.0.2 in /ExpoDemo #256.
  • Link both demos to ../sdk. Before, the bare demo used a gitignored tarball.
  • Fix the type errors in the demo screens. The behaviour does not change.
  • Remove the obsolete Android plugin, unused packages and broken scripts from ExpoDemo.
  • Add XHR and Expo fetch buttons to the RUM screens.

CI and tooling

  • Type-check the SDK and its tests.
  • Run each check one time for each pull request. A new commit cancels older runs, and path filters skip workflows that a change does not affect. The workflow token is read-only.
  • Add Expo Demo CI for Android and iOS.
  • Stop Dependabot updates to the Expo-managed packages in ExpoDemo. Change these packages only with npx expo install.
  • Fix the Prettier and ESLint config warnings.

Docs

  • Update the README requirements, installation and Expo sections for React Native 0.81.
  • Correct the Native Crash Reporting section. To disable native crash reporting, set disableNativeCrashReporting to true, not false.
  • Add CI badges. Fix RELEASING.md, the 1.7.1 changelog entry, two anchors and three typos.

Verification

  • Local: npm ci, both tsc --noEmit configs, npm test (41 pass), ESLint and Prettier pass.
  • npm audit --omit=dev finds no vulnerabilities. The full audit finds 43 advisories (no critical) in dev tooling only: Jest 29, Metro and React Native.
  • npm pack --dry-run lists 32 files. It does not include old dist/ files or build output.
  • Both demos build for Android and the iOS simulator. Metro and expo export bundle both platforms.
  • Crash reports, examined in the Raygun dashboard:
    • Android (API 37): with raygun4android 6.2.3, a native uncaught crash arrives after restart. With 6.2.2, the report is lost. A JS uncaught error arrives one time.
    • Android: the okhttp crash (raygun4android#324) does not occur.
    • Android with raygun4android 6.3.0: a cached crash arrives on the next start with its original API key and endpoint.
    • iOS simulator (26.5): a native SIGSEGV and a JS uncaught error arrive. A fatal JS error also arrives a second time as RCTFatalException. This also occurred before this PR, and a separate PR will fix it.
  • RUM on Android and iOS: fetch, XHR and Expo fetch each send one network event. Five concurrent requests to the same URL send one name with five requests.

To verify: the RUM dashboard shows these events as network timing.

Not in this PR

  • dependabot.yml groups.
  • New demo features: a RUM events panel and native crash triggers.

- `babel-plugin-transform-class-properties` is a Babel 6 plugin that no config loads.
  It pulled in `babel-traverse` 6.26.0, the source of the critical Dependabot alert
- `ts-jest` and `tsconfig.jest.json` are unused, since Jest runs through `babel-jest`.
  `tsconfig.jest.json` has also been invalid since the sdk moved to `nodenext`
- `glob` is a direct dev dependency that nothing imports, and its 11.x release is
  deprecated, so every install printed a warning for it
No job ran `tsc`, so a change that broke the SDK's types could still get a green check.
That's how the uuid 14 bump (#264) merged without anything checking its types.
@velocitysystems
velocitysystems force-pushed the chore/sdk-maintenance branch 4 times, most recently from f923ed9 to 5acc379 Compare September 19, 2026 15:06
Both workflows ran on every `push` and every `pull_request`, so a PR from a branch in this
repo ran each job twice: 8 checks for 4 jobs. Force-pushes also left runs for replaced
commits holding runners ahead of the current one. ExpoDemo wasn't built at all, so
nothing noticed when a dependency update broke it.

- Run on `pull_request`, and on `push` only to master
- Cancel a PR's in-progress runs when a newer commit arrives. Each push to master gets its
  own concurrency group, keyed by commit SHA, because GitHub cancels a pending run when a
  newer run joins the same group; this way every master commit gets a complete run
- Only run each workflow when its files change: SDK CI for `sdk/`, Demo CI for `sdk/` and
  `demo/`, Expo Demo CI for `sdk/` and `ExpoDemo/`, each plus its own workflow file. Docs
  and config changes no longer start a macOS build
- Add Expo Demo CI, which installs the SDK and ExpoDemo, runs `expo prebuild`, and builds
  a debug Android app on Ubuntu and an iOS simulator app on macOS 26 with Xcode 26.6, as
  Expo SDK 56 and later need Xcode 26.4 or later
- Check formatting with `prettier --check` inside `sdk-checks`, and drop the separate
  job and its third-party action. Prettier is now a pinned dev dependency (3.9.8), so
  CI no longer picks up whatever version is latest
- Add `sdk/.prettierignore` for `dist/`. The check now runs from `sdk/`, and Prettier
  only reads ignore files from the directory it runs in, so the root `.gitignore`
  entry for `sdk/dist/` doesn't apply there; a local build would fail the check
- Limit the workflow token to `contents: read`

Master has no required status checks, so a workflow skipped by its path filter can't
leave a PR waiting on a check that never runs.
@velocitysystems
velocitysystems force-pushed the chore/sdk-maintenance branch 8 times, most recently from 08a1161 to 425c50c Compare September 21, 2026 11:16
raygun4android 6 declares `minCompileSdk=36`, so host apps must compile against Android
SDK 36 or higher. React Native 0.81 is the oldest release whose defaults do, which sets
the new floor for the SDK.

- raygun4android 5.2.1 → 6.2.3. Keep the kotlin-stdlib exclusion: 6.2.3 declares stdlib
  2.4.10, which the Kotlin compilers in React Native 0.81-0.87 can't read
- 6.2.3 saves crash reports for uncaught exceptions before the process stops, so they
  are no longer lost (raygun4android#322). It also aligns the okhttp artifacts, so React
  Native's `okhttp-urlconnection` 4.x no longer splits from okhttp 5 (raygun4android#324)
- Fallback compileSdk 35 → 36 and minSdk 23 → 24, matching React Native 0.81's defaults
- Drop the library's `targetSdk` and `buildToolsVersion`, which have no effect on an
  Android library under AGP 8
- Java 11 → 17, which React Native 0.81+ already requires
- Timber 4.7.1 → 5.0.1, the version raygun4android already resolves to
- Replace the deprecated `hasActiveCatalystInstance()` with `hasActiveReactInstance()`
`s.source` pointed at the `kerwin/refactory/storage` branch of a personal fork
(`hunteva/raygun4reactnative`), so anything resolving the pod from its source got that
branch rather than this repo's release.

- Point `s.source` at MindscapeHQ/raygun4reactnative, at the release's `v<version>` tag
- Take the iOS minimum from React Native's `min_ios_version_supported` (15.1 for
  React Native 0.81+) instead of the stale 12.0
- Use `install_modules_dependencies` instead of depending on `React-Core` directly,
  as React Native's library template does
- Remove the `RCTConvert` and `RaygunCrashReportConverter` imports from
  `RaygunNativeBridge.m`; nothing in the file uses either
- `prepublish` doesn't run on `npm publish` from npm 7 on, so a publish shipped whatever
  `dist/` was on the publishing machine, however stale. Replace it with `prepare`, which
  runs on `npm pack` and `npm publish`, and on a local `npm install` or `npm ci` as
  `prepublish` did, so ExpoDemo, which uses the SDK through `file:../sdk` and
  `dist/index.js`, still gets a build. It clears `dist/` first, because `tsc` never
  removes output for deleted sources and a 1.x `dist/` would otherwise ship its leftovers
- Installing ExpoDemo now runs that build inside `../sdk`, which needs the SDK's dev
  dependencies, so ExpoDemo's README installs the SDK first, as the bare demo's does
- Without a `files` allowlist, the 1.7.1 tarball shipped `__tests__`, `__mocks__`,
  `babel.config.js` and `eslint.config.mjs` to customers. List the runtime files
  instead. Android is listed file by file so a local `android/build/` can't be packed
- Delete `.npmignore`, which npm ignores once `files` is set

`npm pack --dry-run` now lists 34 files: `dist/`, the Android sources and Gradle files,
the iOS sources, the podspec, `react-native.config.js`, `package.json` and the README.
The SDK didn't declare which React Native versions it supports, so package managers
couldn't warn apps that fall below it. raygun4android 6 makes React Native 0.81 the
minimum, and these ranges come from what React Native 0.81 itself declares.

- `react-native >=0.81.0`
- `react >=19.1.0`, React Native 0.81's React requirement. Lower bounds only, so a
  future React or React Native major doesn't make npm refuse the install
- `engines.node >=20.19.4`, React Native 0.81's Node requirement
The README still listed React Native `^0.60.0` and async-storage `^1.13.3`, and told
Android users to declare two services that no longer exist.

- Replace the requirements with the minimums this branch sets: React Native 0.81,
  React 19.1, async-storage 1.13-3.x as a peer dependency, Android compileSdk 36 and
  minSdk 24, iOS 15.1, Expo SDK 54
- Install async-storage alongside the SDK, now that it's a peer dependency
- Remove the Android step. It declared `CrashReportingPostService` and `RUMPostService`,
  which raygun4android replaced with WorkManager workers; autolinking needs nothing more
- Remove the `platform :ios, '10.0'` Podfile line, below the new iOS minimum
- Replace the manual integration steps with a short troubleshooting note. Autolinking
  covers React Native 0.81+, and the manual Android steps named the wrong project
- Fix the Expo iOS section, which ran `npx expo run:android`, and install async-storage
  with `npx expo install` so Expo picks a compatible version
- RELEASING.md: the version lives in `sdk/package.json`, not `src/package.json`, and the
  release tag must be `v<version>` for the podspec's `s.source`
- CHANGELOG.md: Expo SDK 55 is React Native 0.83, not 0.81
Both warnings now print on every CI run.

- Prettier 3 deprecates `jsxBracketSameLine`; `bracketSameLine` is its replacement and
  formats the same way
- eslint-plugin-react warns when the React version isn't set. Set it to 19.1, the oldest
  React in the peer dependency range. `"detect"` isn't an option: it calls
  `context.getFilename()`, which ESLint 10 removed, and eslint-plugin-react 7.37.5
  crashes
The demo's Gemfile allowed activesupport 6.1.7.5 and up, which covers versions with
three moderate advisories (GHSA-2j26-frm8-cmj9, GHSA-cg4j-q9v8-6v38 and
GHSA-89vf-4333-qx8v). 7.2.3.1 is the first fixed release below 8, and CocoaPods
requires activesupport below 8.

activesupport 7.2 needs Ruby 3.1 or later, so the Ruby floor rises from 2.6.10 to 3.1.0.
Bundler resolves the Gemfile to activesupport 7.2.3.2 and CocoaPods 1.15.2.

CI runs `pod install` without Bundler, so it doesn't exercise this file. React Native
0.87's template Gemfile still has the old floor, so the demo rebuild needs to keep this.
The MIT license requires its notice to be included with copies of the software, but the
published package has never contained it: the license file is `LICENSE-MIT` at the repo
root, and the package is published from `sdk/`. `sdk/package.json` already names the
file `LICENSE` (`licenseFilename`), and npm always packs a `LICENSE` file.

Add `sdk/LICENSE` with the same text as `LICENSE-MIT`, one line per paragraph rather
than hard-wrapped.
The RUM monitor used `uuidv4()` only to key an in-memory map that pairs each request's
open, send and response callbacks; the ID never leaves the process. Keying the map on the
request itself does the same job. A `WeakMap` also lets a request that is opened but never
completed be collected, rather than holding its entry for the life of the app.

This drops `uuid`, the SDK's last runtime dependency. uuid 14 (#264) only publishes an
ES module through package `exports`, with no `main`, so apps whose Metro doesn't read
`exports` would fail to bundle the SDK. It also calls `crypto.randomUUID` without
checking that `crypto` exists, which would throw on each monitored request once network
monitoring works again.

Also remove `uuid` from Jest's `transformIgnorePatterns`, which only listed it so Jest
would transform its ES module build.
Comment thread sdk/src/NetworkInterceptor.ts Resolved
Comment thread sdk/src/NetworkInterceptor.ts Resolved
TheRealAgentK
TheRealAgentK previously approved these changes Oct 23, 2026

@TheRealAgentK TheRealAgentK left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving, see additional commentary in Slack, @velocitysystems

Real User Monitoring has sent no network timing events on React Native 0.80 or later since
1.6.0, and logged nothing about it. The SDK loaded React Native's private XHRInterceptor
from one of two paths: `react-native/src/private/inspector/XHRInterceptor`, which only
existed in React Native 0.79, or `react-native/Libraries/Network/XHRInterceptor`, which
0.79 removed. When neither loaded, it silently fell back to an interceptor that did
nothing. React Native 0.87 no longer exports `./src/*` at all, so correcting the path
wouldn't last.

- Add `NetworkInterceptor.ts`, which wraps `XMLHttpRequest.prototype.open` and `send`
  itself and reports the request when it completes. React Native's `fetch()` is built on
  XMLHttpRequest, so fetch requests are captured too. Callback errors are logged instead
  of reaching the app's request. The callbacks carry only the method, the URL and the
  request, which is all the monitor uses, so the response body is never read
- Wire it into `RealUserMonitor`, and log a warning if XMLHttpRequest isn't available
  rather than failing silently
- Name network events with the method upper-cased and without the query string and
  fragment, as raygun4js, raygun4android and raygun4apple do. The query string can carry
  tokens, and both would otherwise split one endpoint into several names. Before 1.6.0,
  when network timing last worked, the full URL was sent
- Delete `MaybeNewXHRInterceptorModule.ts` and `MaybeOldXHRInterceptorModule.ts`
- Add tests for the interceptor and for the monitor: completed requests become network
  timing events, responses pair with their own requests, ignored URLs are skipped, names
  are normalised, and nothing is intercepted when network monitoring is disabled. The two
  tests that expect events fail against the old code

Expo SDK 56 and later replace the global `fetch` with a native implementation that doesn't
use XMLHttpRequest, so this doesn't capture `fetch()` calls in those apps unless they set
`EXPO_PUBLIC_USE_RN_FETCH=1`.
Expo SDK 56 and later replace the global `fetch` with `expo/fetch`, which makes requests
through a native module rather than XMLHttpRequest. So the XMLHttpRequest interceptor
alone missed every `fetch()` call in those apps, unless they set
`EXPO_PUBLIC_USE_RN_FETCH=1`. Expo SDK 54 and 55 don't replace `fetch`.

- Wrap the global `fetch` as well, reporting each call when it settles. A fetch that
  rejects or throws is reported too, as a failed XMLHttpRequest is, and the error still
  reaches the caller
- Skip XMLHttpRequests opened while a `fetch` call is running. React Native's own `fetch`
  (whatwg-fetch) creates, opens and sends its XMLHttpRequest synchronously inside that
  call, so without this each fetch would be reported twice on React Native and Expo 54-55
- Expo's global `fetch` is a lazy property with a setter, so replacing it works there too

Tests cover resolved, rejected and synchronously throwing fetches, Request-like inputs, a
React Native-style fetch being reported once rather than twice, and interception when only
`fetch` is available.
The bare demo was on React Native 0.84.1, with a native layer older than even the 0.84
template: an Objective-C AppDelegate, and DefaultReactNativeHost and SoLoader in
MainApplication. Its tsconfig extended a path that @react-native/typescript-config no
longer exports, so `tsc` couldn't run.

- Regenerate `android/` and `ios/` from the React Native 0.87.1 template, keeping the one
  customisation: the `Raygun4ReactNativeDemo` module name. The template's lower Kotlin
  (2.2.0) now exercises the SDK's kotlin-stdlib exclusion
- Take the template's config files (Babel, Metro, Jest, TypeScript, ESLint, Prettier,
  Watchman, Bundler, `.gitignore`) and Gemfile, keeping this branch's Ruby 3.1 and
  activesupport floor
- Move react-native to 0.87.1 with its tooling, and the demo's libraries to their latest:
  React Navigation 7.4.1 and 7.19.2, react-native-screens 4.28.0,
  react-native-safe-area-context 5.10.0, and async-storage 3.1.1, which exercises the
  SDK's support for v3
- Keep @react-native-community/checkbox on 0.5.20. 0.6.0's `codegenConfig` points at a
  `js` directory the package doesn't ship, so iOS codegen fails. 0.5.20 defines
  BuildConfig fields, which Android Gradle Plugin 9 only generates when a module turns
  them on, so the root `build.gradle` turns them on for that module
- Regenerate `package-lock.json` and `Podfile.lock`, which recorded the SDK as 1.6.0

The app code (`App.tsx`, `screens/`, `utils/`) is unchanged. Built locally: an Android
debug build (AGP 9.2.1, compileSdk 37) and an iOS simulator build, plus Metro release
bundles for both platforms. `tsc` now runs and reports 9 type-only errors in the screens,
left alone because fixing them changes the demo code.
ExpoDemo was on Expo SDK 55 and couldn't start or bundle: #256 moved it to TypeScript 7,
which has no JavaScript API, and Expo's CLI reads `tsconfig.json` through that API.

- Run `npx expo install expo@~57.0.24` and `npx expo install --fix`: Expo 57.0.24, React
  Native 0.86.3, TypeScript 6.0.3, and every Expo package on its SDK 57 version
- Install react-native-worklets, a required peer dependency of react-native-reanimated 4
- Remove `newArchEnabled` from `app.json`, which SDK 57's config schema rejects, as the
  New Architecture is always on. `expo install` added the `expo-status-bar` config plugin
- Regenerate `package-lock.json`, whose SDK entry recorded 1.6.0

The app code is unchanged. `expo install --check` and `tsc` are clean. Expo Doctor passes
20 of 21 checks; the other flags the SDK's own `../sdk/node_modules`, which native
autolinking doesn't use and the Metro config blocks. Built locally: `expo export` for both
platforms, and an Android debug build and iOS simulator build after `expo prebuild`.
With the RN 0.87 tsconfig, `tsc` could run on the bare demo and reported 9 errors. All are
type-only; none changes what the demo does.

- Pass `e as Error` to `sendError` in the four `catch` blocks, whose variables are
  `unknown`
- Use `undefined` instead of `null` for the breadcrumb's `level` and the user's
  `fullName`, which the SDK types as optional strings. `recordBreadcrumb` and `setUser`
  strip `null` fields before applying defaults, so both values end up the same
- Give `@react-native-community/checkbox` a component type. Its typings declare a class
  that React 19's JSX types reject, and the package exports no props type
- Return `null` from `completedImageLoad`, which is called inside JSX; it rendered nothing
  before and still does
- Delete `plugins/withRaygunAndroid.js` and its `app.json` entry. It added
  `CrashReportingPostService` and `RUMPostService` to the Android manifest, but
  raygun4android replaced those services with WorkManager workers, so nothing ever started
  them. The SDK's README stopped asking for them in this branch
- Remove `@react-navigation/native` and `@react-navigation/bottom-tabs`. The app doesn't
  import them, and Expo Router hasn't needed them since SDK 56
- Remove the `reset-project` script, whose `scripts/reset-project.js` doesn't exist, and
  the `test` script with its Jest setup (`jest`, `jest-expo`, `@types/jest`), as there are
  no tests

The app code is unchanged. `expo install --check` and `tsc` are clean, `expo export`
bundles both platforms, and a fresh `expo prebuild` has no Raygun services in the
manifest.
The bare demo depended on `file:raygun4reactnative-<version>.tgz`, a tarball that
`.gitignore` excludes, so following its README on a fresh clone failed with ENOENT. Only
the SDK's `build_pack_1` and `build_demo_2` scripts, which CI ran, created it. Every SDK
change also changed the tarball's integrity hash in the demo's lockfile.

- Depend on `file:../sdk`, as ExpoDemo does. Installing it runs the SDK's `prepare` build
- Point Metro at `../sdk`, block the SDK's own `node_modules`, and resolve the SDK's
  imports from the demo's `node_modules`, as ExpoDemo's Metro config does
- Update the README: `npm install` replaces `npm install --install-links`
- CI installs the SDK and the demo with `npm ci` instead of packing and copying a tarball
- Remove the SDK's `builder`, `build_run`, `build_pack_1`, `build_demo_2` and `run_demo_3`
  scripts, and the `copyfiles` and `run-script-os` dev dependencies only they used

Checked on a clean install: `npm ci`, `tsc`, Metro release bundles for both platforms,
`pod install`, and Android debug and iOS simulator builds.
The SDK's iOS sources produced 8 compiler warnings in every app build. None changed
behaviour; they came from declarations and code nothing uses.

- `RaygunNativeBridge.h` declared `viewStartedLoading:atTime:` and
  `viewFinishedLoading:atTime:`, which don't exist. The bridge implements and registers
  the notification handlers `viewStartedLoading:` and `viewFinishedLoading:`
- `UIViewController+ReactNativeRaygunRUM.h` declared `loadViewCapture`,
  `viewDidLoadCapture`, `viewWillAppearCapture:` and `viewDidAppearCapture:`, which don't
  exist either. `+load` swizzles the `...CaptureReactNative` methods the category defines
- Remove `ksdl_imageNamed`, which nothing calls, and the `<mach-o/dyld.h>` include only it
  used
- Declare `processStartTime(void)`, as C requires for a function with no parameters

The demo's iOS simulator build now compiles the SDK with no warnings.
`tsc --noEmit` used the SDK's tsconfig, whose `include` is `src/` alone, so a type error
in `__tests__` passed CI: Jest strips types through `babel-jest`, and ESLint only lints
`src/`. A deliberate error in a test file exited 0 before this change, and fails now.

- Add `tsconfig.test.json`, extending the SDK's config with `src/`, `__tests__/` and
  `__mocks__/`, and with Node's types for the globals the tests replace
- Point CI's type-check step at it
- Type the `fetch` and `sendError` mocks the existing tests install, so the calls they
  record keep their types instead of widening to an empty tuple
- Add a CI badge to both READMEs, as raygun4flutter does
- The Native Crash Reporting section said to set `disableNativeCrashReporting` to `false`
  to disable it, in two places. The provider starts the native SDKs when the flag is
  false, so disabling them needs `true`
- Fix two table-of-contents anchors that no longer match their headings: the
  `sendRUMTimingEvent` parameter is `durationMs`, and `setUser` takes `User | null`
- Fix three typos

Checked every anchor in the SDK README against the heading it points at, and that the
badge URL responds.
Both demos sent every request with `fetch`, and ExpoDemo ran with Real User Monitoring
off, so two of the three paths the SDK intercepts were never exercised outside the unit
tests: a request made with XMLHttpRequest, which libraries such as axios use, and Expo SDK
56's `fetch`, which is native and does not use XMLHttpRequest.

- Add a "Send XHR Request" section to the demo's RUM screen. The URL carries a query
  string and a fragment, so the name RUM reports shows they are removed
- Turn Real User Monitoring on in ExpoDemo, and give it a fetch button and an XHR button

The API key placeholders are unchanged, so both demos still need one before they report.

Checked on an Android emulator and an iOS simulator: each path reports one network event,
and the five concurrent requests stay one name with five requests.
Nothing in the SDK or its tests imports either package. Removing them supersedes
Dependabot's jest-fetch-mock 3 to 4 bump rather than taking a major upgrade of a package
the suite doesn't use.
- Update `globals` to 17 and `typescript-eslint` to 8.71, superseding Dependabot's bumps
- Pin `@types/node` to 20, the oldest Node the `engines` field supports, so type-checking
  fails on APIs the SDK can't rely on being present. Dependabot proposed 26, which goes
  the other way
Each Expo SDK pins compatible versions of expo, react, react-native and their companions,
and `npx expo install` keeps them in step. Dependabot bumps each one alone to its latest
release, past what the SDK supports: #256 moved ExpoDemo to TypeScript 7, which Expo's CLI
can't read `tsconfig.json` through, and the demo stopped starting. Those packages now move
only when ExpoDemo moves to a new Expo SDK.

Also ignore major `@types/node` updates for the SDK, which is pinned to the oldest Node
its `engines` field supports.
raygun4android 6.3.0 publishes Kotlin 2.2 metadata and depends on `kotlin-stdlib` 2.2.21,
which the Kotlin 2.1.20 compiler in React Native 0.81-0.86 can read. The `kotlin-stdlib`
exclude added for #237 only existed because 6.2.3 published 2.4.10, so it goes with the
version that needed it, and host apps get the stdlib raygun4android was built against.

Crash reports cached by 6.3.0 can't be read by 6.2.3, so reports pending on a device are
lost if an app downgrades to a release that ships 6.2.3.
Lockfile-only bump of a dev dependency pulled in by react-devtools-core. Folded in here
so Dependabot's standalone PR doesn't conflict with this branch's lockfile changes.
Lockfile-only bump of dev dependencies pulled in by Jest and eslint-plugin-react. 1.1.21
fixes GHSA-q2hr-2g5m-vwhr, a CPU denial of service on crafted brace patterns, which only
the dev tooling can reach. Folded in here so Dependabot's standalone PR doesn't conflict
with this branch's lockfile changes.
Major version: the minimum is now React Native 0.81 with React 19.1, Android SDK 36 and
Java 17, iOS 15.1 and Node 20.19.4, and raygun4android 6.3.0's crash cache cannot be read
by 6.2.3 after a downgrade.

- Set the version in `package.json` and `package-lock.json`
- Add the 2.0.0 entry to `CHANGELOG.md`, with the breaking changes and this branch's
  commits
- Update the demo's `Podfile.lock`, which records the SDK version

@TheRealAgentK TheRealAgentK left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved. The inline XHR listener finding is non-blocking and can be addressed in a follow-up; it does not need to hold up this PR.

Comment thread sdk/src/NetworkInterceptor.ts Resolved
@velocitysystems
velocitysystems merged commit fa29c9f into master Oct 26, 2026
5 checks passed
@velocitysystems
velocitysystems deleted the chore/sdk-maintenance branch October 26, 2026 22:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants