Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
c286ddf
Update the OpenFeature package documentation
yugisu-flux Jan 28, 2026
0f9f828
Bump peerDependencies to ^3.0.0
sbarrio Jan 29, 2026
b10510a
Merge pull request #1116 from DataDog/sbarrio/fix/bump-peer-dependeci…
sbarrio Jan 29, 2026
964bf94
Bump to version 3.0.1
sbarrio Jan 29, 2026
e2eb57a
Remove extra line break when adding a new version entry on NATIVE_SDK…
sbarrio Jan 29, 2026
da8d12a
Merge pull request #1117 from DataDog/sbarrio/release-v3.0.1
sbarrio Jan 29, 2026
627c1c6
Fix iOS SR Text Extraction on React Native 0.84
sbarrio Jan 28, 2026
72e4f18
Add IH assistant GH action and tools
sbarrio Jan 30, 2026
85c359b
Introduce request queue and gertByIds fetch on rumAuto scenario
sbarrio Jan 30, 2026
1355340
Update the README
yugisu-flux Feb 3, 2026
815b8dc
Remove `'TARGETING_KEY_MISSING'` from `FlagErrorCode` type
yugisu-flux Feb 3, 2026
5561318
Merge pull request #1112 from DataDog/sbarrio/chore/fix-session-repla…
sbarrio Feb 3, 2026
70fbe70
Update type validation in FlagsClient
yugisu-flux Feb 3, 2026
1b422b4
Merge remote-tracking branch 'origin/develop' into dima/address-featu…
yugisu-flux Feb 3, 2026
15b9fcf
Restore utf8ByteLength to replace Buffer.byteLength()
sbarrio Feb 4, 2026
1c8b863
Merge branch 'develop' of github.com:DataDog/dd-sdk-reactnative into …
sbarrio Feb 5, 2026
022c4da
Enable Jank Stats Tracking on Android
sbarrio Feb 5, 2026
c02af9d
Merge pull request #1124 from DataDog/sbarrio/fix/refresh-rate-averag…
sbarrio Feb 6, 2026
f8c49af
Merge pull request #1123 from DataDog/sbarrio/fix/restore-utf8ByteLength
sbarrio Feb 6, 2026
00e5abf
Merge pull request #1121 from DataDog/sbarrio/chore/rumauto-benchmark…
sbarrio Feb 6, 2026
9aebd85
Merge pull request #1120 from DataDog/sbarrio/chore/set-up-ih-assistant
sbarrio Feb 6, 2026
ec1fa39
Merge pull request #1118 from DataDog/sbarrio/chore/remove-extra-line…
sbarrio Feb 6, 2026
50ceeb2
Enable NDK Crash Reports
sbarrio Feb 5, 2026
2bcf6d3
Merge pull request #1125 from DataDog/sbarrio/RUM-6208/enable-ndk-cra…
sbarrio Feb 9, 2026
3124ece
Bump to version 3.0.2
sbarrio Feb 9, 2026
9d885e7
Merge remote-tracking branch 'origin/develop' into dima/address-featu…
yugisu-flux Feb 9, 2026
5ba4e33
Merge pull request #1127 from DataDog/sbarrio/release-v3.0.2
sbarrio Feb 9, 2026
754d843
Merge remote-tracking branch 'origin/develop' into dima/address-featu…
yugisu-flux Feb 9, 2026
66e8607
Bump OpenFeature provider's version
yugisu-flux Feb 9, 2026
cddd670
Update yarn.lock
yugisu-flux Feb 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions .github/workflows/issue_notification.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@

name: Github Issue Notification

on:
# # When a new issue is opened
# issues:
# types:
# - opened

# When manually triggering the workflow
workflow_dispatch:
inputs:
issue_number:
description: 'Issue number to process'
required: true
type: number

jobs:
process_issue:
runs-on: ubuntu-latest
environment: protected-dev-env

steps:
- name: Checkout Repository
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1

- name: Set up Python 3.x
uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
with:
python-version: '3.x'

- name: Install Dependencies
run: |
cd tools/issue_handler
pip install -r requirements.txt

- name: Set Issue Number
run: |
if [ "${{ github.event_name }}" = "issues" ]; then
echo "GITHUB_EVENT_NUMBER=${{ github.event.issue.number }}" >> $GITHUB_ENV
else
echo "GITHUB_EVENT_NUMBER=${{ github.event.inputs.issue_number }}" >> $GITHUB_ENV
fi

- name: Run the Processing Script
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
OPENAI_TOKEN: ${{ secrets.OPENAI_TOKEN }}
OPENAI_SYSTEM_PROMPT: ${{ vars.OPENAI_SYSTEM_PROMPT }}
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
SLACK_CHANNEL_ID: ${{ secrets.SLACK_CHANNEL_ID }}
GITHUB_REPOSITORY: ${{ github.repository }}
run: |
cd tools/issue_handler
# Add timeout to prevent hanging processes (5 minutes)
timeout 300 python -m src.analyze_issue $GITHUB_EVENT_NUMBER
2 changes: 2 additions & 0 deletions NATIVE_SDK_VERSIONS.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
| React Native | iOS Bridge / iOS SDK | Android Bridge / Android SDK |
|-------------|---------------------|-----------------------------|
| 3.0.2 | 3.4.0 | 3.4.0 |
| 3.0.1 | 3.4.0 | 3.4.0 |
| 3.0.0 | 3.4.0 | 3.4.0 |
| 2.14.1 | 2.30.2 | 2.26.2 |
| 2.14.0 | 2.30.2 | 2.26.2 |
Expand Down
12 changes: 6 additions & 6 deletions benchmarks/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ PODS:
- DatadogInternal (= 3.4.0)
- DatadogRUM (3.4.0):
- DatadogInternal (= 3.4.0)
- DatadogSDKReactNative (3.0.0):
- DatadogSDKReactNative (3.0.2):
- DatadogCore (= 3.4.0)
- DatadogCrashReporting (= 3.4.0)
- DatadogLogs (= 3.4.0)
Expand All @@ -37,7 +37,7 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- Yoga
- DatadogSDKReactNativeSessionReplay (3.0.0):
- DatadogSDKReactNativeSessionReplay (3.0.2):
- DatadogSDKReactNative
- DatadogSessionReplay (= 3.4.0)
- DoubleConversion
Expand All @@ -60,7 +60,7 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- Yoga
- DatadogSDKReactNativeWebView (3.0.0):
- DatadogSDKReactNativeWebView (3.0.2):
- DatadogInternal (= 3.4.0)
- DatadogSDKReactNative
- DatadogWebViewTracking (= 3.4.0)
Expand Down Expand Up @@ -2075,9 +2075,9 @@ SPEC CHECKSUMS:
DatadogInternal: b0372935ad8dde5ad06960fe8d88c39b2cc92bcc
DatadogLogs: 484bb1bfe0c9a7cb2a7d9733f61614e8ea7b2f3a
DatadogRUM: 00069b27918e0ce4a9223b87b4bfa7929d6a0a1f
DatadogSDKReactNative: 7e6f0c40720299e8463ca27a4c13583572818c6d
DatadogSDKReactNativeSessionReplay: b50d5d7cf696f9c709911d322ce228110030881e
DatadogSDKReactNativeWebView: c4ccb711e5da1ba1d08ae472ff967e0bc17167e6
DatadogSDKReactNative: c42153d2e963bbe95aaf3d21f2e130a497236422
DatadogSDKReactNativeSessionReplay: 6724542881d483b0afb2f127413280b38175c743
DatadogSDKReactNativeWebView: 13bab160304d4a9b621a2d9b63ae217de36ffe13
DatadogSessionReplay: 462a3a2e39e9e2193528cf572c8d1acfd6cdace1
DatadogTrace: 852cb80f9370eb1321eb30a73c82c8e3d9e4e980
DatadogWebViewTracking: 32dfeaf7aad47a605a689ed12e0d21ee8eb56141
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,8 @@ function CharacterDetailScreen(): React.JSX.Element {

const onShowEpisodes = async () => {
try {
const episodeNames = await Promise.all(episodeURLs.map((url) =>
RickMortyService.fetchRequest(url).then(json => json.name)
));
const episodeData = await RickMortyService.fetchEpisodesByIds(episodeURLs);
const episodeNames = episodeData.map(episode => episode.name);
setEpisodes(episodeNames);
} catch (_error) {
Alert.alert("Something went wrong. Please try again later.");
Expand Down Expand Up @@ -86,4 +85,4 @@ function CharacterDetailScreen(): React.JSX.Element {
);
};

export default CharacterDetailScreen;
export default CharacterDetailScreen;
8 changes: 3 additions & 5 deletions benchmarks/src/scenario/RUM/Auto/screens/episodeDetail.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,8 @@ function EpisodeDetailScreen(): React.JSX.Element {
const getCharacters = async () => {
try {
setIsLoading(true);
const charaterList = await Promise.all(characterURLS.map((url) =>
RickMortyService.fetchRequest(url).then(json => json as Character)
));
setCharacters(charaterList);
const characterList = await RickMortyService.fetchCharactersByIds(characterURLS);
setCharacters(characterList as Character[]);
} catch (_error) {
Alert.alert("Something went wrong. Please try again later.");
} finally {
Expand Down Expand Up @@ -103,4 +101,4 @@ function EpisodeDetailScreen(): React.JSX.Element {
);
};

export default EpisodeDetailScreen;
export default EpisodeDetailScreen;
8 changes: 3 additions & 5 deletions benchmarks/src/scenario/RUM/Auto/screens/locationDetail.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,8 @@ function LocationDetailScreen(): React.JSX.Element {
const getCharacters = async () => {
try {
setIsLoading(true);
const charaterList = await Promise.all(characterURLS.map((url) =>
RickMortyService.fetchRequest(url).then(json => json as Character)
));
setCharacters(charaterList);
const characterList = await RickMortyService.fetchCharactersByIds(characterURLS);
setCharacters(characterList as Character[]);
} catch (_error) {
Alert.alert("Something went wrong. Please try again later.");
} finally {
Expand Down Expand Up @@ -103,4 +101,4 @@ function LocationDetailScreen(): React.JSX.Element {
);
};

export default LocationDetailScreen;
export default LocationDetailScreen;
118 changes: 106 additions & 12 deletions benchmarks/src/scenario/RUM/Auto/service/rickMorty.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,27 +10,121 @@ const CHARACTERS_ENDPOINT = "character";
const LOCATIONS_ENDPOINT = "location";
const EPISODES_ENDPOINT = "episode";

const MAX_CONCURRENT_REQUESTS = 1;
const REQUEST_DELAY_MS = 600;
interface QueuedRequest {
url: string;
resolve: (value: any) => void;
reject: (error: any) => void;
}

class RickMortyService {
fetchRequest(url: string, page?: number) {
const fullURL = url + (page ? ("?page=" + page.toString()) : '');
return fetch(fullURL).then((data) => {
return data.json();
}).catch((_error) => {
return Promise.reject();
})
};
private requestQueue: QueuedRequest[] = [];
private activeRequests = 0;
private isProcessing = false;

private delay(ms: number): Promise<void> {
return new Promise(resolve => setTimeout(resolve, ms));
}

private async processQueue(): Promise<void> {
if (this.isProcessing) {
return;
}

this.isProcessing = true;

while (this.requestQueue.length > 0 && this.activeRequests < MAX_CONCURRENT_REQUESTS) {
const request = this.requestQueue.shift();
if (!request) break;

this.activeRequests++;

try {
await this.delay(REQUEST_DELAY_MS);

const response = await fetch(request.url);

if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}

const data = await response.json();
request.resolve(data);
} catch (error) {
request.reject(error);
} finally {
this.activeRequests--;
}
}

this.isProcessing = false;

if (this.requestQueue.length > 0) {
this.processQueue();
}
}

fetchRequest(url: string, page?: number): Promise<any> {
const fullURL = url + (page ? `?page=${page}` : '');

return new Promise((resolve, reject) => {
this.requestQueue.push({
url: fullURL,
resolve,
reject
});

this.processQueue();
});
}

private extractIdFromUrl(url: string): string | null {
const match = url.match(/\/(\d+)$/);
return match ? match[1] : null;
}

private async fetchByIds(endpoint: string, urls: string[], resourceType: string): Promise<any[]> {
const ids = urls.map(url => this.extractIdFromUrl(url)).filter(Boolean);
if (ids.length === 0) return [];

const batchUrl = `${BASE_URL}/${endpoint}/${ids.join(',')}`;

try {
const response = await fetch(batchUrl);
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}
const data = await response.json();
return Array.isArray(data) ? data : [data];
} catch (error) {
throw error;
}
}

fetchCharacters(page?: number) {
return this.fetchRequest(BASE_URL + "/" + CHARACTERS_ENDPOINT, page);
};
}

fetchLocations(page?: number) {
return this.fetchRequest(BASE_URL + "/" + LOCATIONS_ENDPOINT, page);
};
}

fetchEpisodes(page?: number) {
return this.fetchRequest(BASE_URL + "/" + EPISODES_ENDPOINT, page);
};
}

fetchCharactersByIds(urls: string[]): Promise<any[]> {
return this.fetchByIds(CHARACTERS_ENDPOINT, urls, 'characters');
}

fetchEpisodesByIds(urls: string[]): Promise<any[]> {
return this.fetchByIds(EPISODES_ENDPOINT, urls, 'episodes');
}

fetchLocationsByIds(urls: string[]): Promise<any[]> {
return this.fetchByIds(LOCATIONS_ENDPOINT, urls, 'locations');
}
};

export default new RickMortyService();
export default new RickMortyService();
5 changes: 4 additions & 1 deletion example-new-architecture/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,10 @@ import {APPLICATION_ID, CLIENT_TOKEN, ENVIRONMENT} from './ddCredentials';
trackErrors: true,
sessionSampleRate: 100,
telemetrySampleRate: 100,
}
nativeCrashReportEnabled: true
},
logsConfiguration: {},
traceConfiguration: {}
}
);
config.verbosity = SdkVerbosity.DEBUG;
Expand Down
6 changes: 3 additions & 3 deletions example-new-architecture/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ PODS:
- DatadogInternal (= 3.5.0)
- DatadogRUM (3.5.0):
- DatadogInternal (= 3.5.0)
- DatadogSDKReactNative (3.0.0):
- DatadogSDKReactNative (3.0.2):
- DatadogCore (= 3.5.0)
- DatadogCrashReporting (= 3.5.0)
- DatadogFlags (= 3.5.0)
Expand Down Expand Up @@ -41,7 +41,7 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- Yoga
- DatadogSDKReactNative/Tests (3.0.0):
- DatadogSDKReactNative/Tests (3.0.2):
- DatadogCore (= 3.5.0)
- DatadogCrashReporting (= 3.5.0)
- DatadogFlags (= 3.5.0)
Expand Down Expand Up @@ -1872,7 +1872,7 @@ SPEC CHECKSUMS:
DatadogInternal: 63308b529cd87fb2f99c5961d9ff13afb300a3aa
DatadogLogs: be538def1d5204e011f7952915ad0261014a0dd5
DatadogRUM: cffc65659ce29546fcc2639a74003135259548fc
DatadogSDKReactNative: ab55448d4e1fd641f08091f0329d2f1cfe0e5c78
DatadogSDKReactNative: 200d41945d09592fa12c9bbc328dc4bb6a21fed3
DatadogTrace: 085e35f9e4889f82f8a747922c58ea4b19728720
DatadogWebViewTracking: 61b8344da898cbaccffc75bc1a17c86175e8573a
DoubleConversion: f16ae600a246532c4020132d54af21d0ddb2a385
Expand Down
Loading