[{"data":1,"prerenderedAt":1085},["ShallowReactive",2],{"docs:/docs/sdks/react-native":3},{"id":4,"title":5,"body":6,"description":1078,"extension":1079,"meta":1080,"navigation":217,"path":1081,"seo":1082,"stem":1083,"__hash__":1084},"docs/docs/sdks/react-native.md","React Native SDK",{"type":7,"value":8,"toc":1065},"minimark",[9,14,27,32,42,131,135,167,182,186,328,335,448,462,466,469,505,508,512,515,652,658,662,687,694,698,708,768,772,779,850,861,865,874,966,990,994,1016,1023,1027,1039,1061],[10,11,13],"h1",{"id":12},"nolagreact-native","@nolag/react-native",[15,16,17,18,26],"p",{},"React Native bindings for ",[19,20,22],"a",{"href":21},"/docs/sdks/javascript",[23,24,25],"code",{},"@nolag/js-sdk",".",[28,29,31],"h2",{"id":30},"overview","Overview",[15,33,34,35,37,38,41],{},"This is a convenience layer, not a required one. As of ",[23,36,25],{}," 1.12.0 the core SDK works on React Native by itself, because it ships a ",[23,39,40],{},"react-native"," export condition that Metro resolves correctly. What this package adds is the platform behaviour you would otherwise have to write yourself, and probably get wrong on iOS.",[43,44,45,60],"table",{},[46,47,48],"thead",{},[49,50,51,54,57],"tr",{},[52,53],"th",{},[52,55,56],{},"Without this package",[52,58,59],{},"With it",[61,62,63,81,95,106,117],"tbody",{},[49,64,65,75,78],{},[66,67,68,71,72],"td",{},[23,69,70],{},"TextEncoder","/",[23,73,74],{},"TextDecoder",[66,76,77],{},"msgpack constructs both at module scope; missing globals throw on import, before your code runs",[66,79,80],{},"polyfilled if absent, untouched if present",[49,82,83,86,89],{},[66,84,85],{},"App background/foreground",[66,87,88],{},"no signal at all: the core defaults to the Page Visibility API, which React Native does not have",[66,90,91,94],{},[23,92,93],{},"AppState"," wired to the SDK's lifecycle adapter",[49,96,97,100,103],{},[66,98,99],{},"Token expiry during suspend",[66,101,102],{},"JS timers do not fire reliably while suspended, so a scheduled refresh can be skipped and the held token is already dead",[66,104,105],{},"rechecked on every foreground",[49,107,108,111,114],{},[66,109,110],{},"Network flap",[66,112,113],{},"reconnect backoff grows to 30s and keeps waiting after the radio returns",[66,115,116],{},"NetInfo collapses the backoff and retries immediately",[49,118,119,122,125],{},[66,120,121],{},"Cold start",[66,123,124],{},"a round trip to your backend to mint a token, on the critical path",[66,126,127,128],{},"cached until shortly before ",[23,129,130],{},"exp",[28,132,134],{"id":133},"installation","Installation",[136,137,138],"code-tabs",{},[139,140,146],"pre",{"className":141,"code":142,"filename":143,"language":144,"meta":145,"style":145},"language-bash shiki shiki-themes github-light github-dark","npm install @nolag/react-native @nolag/js-sdk\n","Terminal","bash","",[23,147,148],{"__ignoreMap":145},[149,150,153,157,161,164],"span",{"class":151,"line":152},"line",1,[149,154,156],{"class":155},"sScJk","npm",[149,158,160],{"class":159},"sZZnC"," install",[149,162,163],{"class":159}," @nolag/react-native",[149,165,166],{"class":159}," @nolag/js-sdk\n",[168,169,171],"callout",{"type":170},"info",[15,172,173,177,178,181],{},[174,175,176],"strong",{},"No native modules."," This package pulls in no native modules of its own. NetInfo and storage are injected rather than imported, because Metro resolves ",[23,179,180],{},"require()"," statically and fails the build on an unresolved module, so the usual try/catch-around-an-optional-import trick does not work as it does under Node. That is also what lets it run in Expo Go.",[28,183,185],{"id":184},"quick-start","Quick Start",[136,187,188],{},[139,189,194],{"className":190,"code":191,"filename":192,"language":193,"meta":145,"style":145},"language-typescript shiki shiki-themes github-light github-dark","import { NoLag } from '@nolag/react-native'\n\n// Pass a TokenProvider, never a token string.\nconst client = NoLag(async () => {\n  const res = await fetch('https://your-api.example/nolag-token')\n  return (await res.json()).token\n})\n\nawait client.connect()\n","TypeScript","typescript",[23,195,196,212,219,226,257,282,303,309,314],{"__ignoreMap":145},[149,197,198,202,206,209],{"class":151,"line":152},[149,199,201],{"class":200},"szBVR","import",[149,203,205],{"class":204},"sVt8B"," { NoLag } ",[149,207,208],{"class":200},"from",[149,210,211],{"class":159}," '@nolag/react-native'\n",[149,213,215],{"class":151,"line":214},2,[149,216,218],{"emptyLinePlaceholder":217},true,"\n",[149,220,222],{"class":151,"line":221},3,[149,223,225],{"class":224},"sJ8bj","// Pass a TokenProvider, never a token string.\n",[149,227,229,232,236,239,242,245,248,251,254],{"class":151,"line":228},4,[149,230,231],{"class":200},"const",[149,233,235],{"class":234},"sj4cs"," client",[149,237,238],{"class":200}," =",[149,240,241],{"class":155}," NoLag",[149,243,244],{"class":204},"(",[149,246,247],{"class":200},"async",[149,249,250],{"class":204}," () ",[149,252,253],{"class":200},"=>",[149,255,256],{"class":204}," {\n",[149,258,260,263,266,268,271,274,276,279],{"class":151,"line":259},5,[149,261,262],{"class":200},"  const",[149,264,265],{"class":234}," res",[149,267,238],{"class":200},[149,269,270],{"class":200}," await",[149,272,273],{"class":155}," fetch",[149,275,244],{"class":204},[149,277,278],{"class":159},"'https://your-api.example/nolag-token'",[149,280,281],{"class":204},")\n",[149,283,285,288,291,294,297,300],{"class":151,"line":284},6,[149,286,287],{"class":200},"  return",[149,289,290],{"class":204}," (",[149,292,293],{"class":200},"await",[149,295,296],{"class":204}," res.",[149,298,299],{"class":155},"json",[149,301,302],{"class":204},"()).token\n",[149,304,306],{"class":151,"line":305},7,[149,307,308],{"class":204},"})\n",[149,310,312],{"class":151,"line":311},8,[149,313,218],{"emptyLinePlaceholder":217},[149,315,317,319,322,325],{"class":151,"line":316},9,[149,318,293],{"class":200},[149,320,321],{"class":204}," client.",[149,323,324],{"class":155},"connect",[149,326,327],{"class":204},"()\n",[15,329,330,331,334],{},"It returns a genuine ",[23,332,333],{},"NoLagSocket",", so it drops straight into the app SDKs:",[136,336,337],{},[139,338,340],{"className":190,"code":339,"filename":192,"language":193,"meta":145,"style":145},"import { NoLag } from '@nolag/react-native'\nimport { NoLagChat } from '@nolag/chat'\n\nconst client = NoLag(tokenProvider)\n// APP_SLUG is the slug returned when you created the app from the\n// nolag-chat-sdk blueprint (slugs carry a random suffix, e.g. 'chat-a3f9')\nconst chat = new NoLagChat({ client, appName: APP_SLUG, username: 'Alice' })\n\nawait client.connect()\nawait chat.ready()\n",[23,341,342,352,364,368,381,386,391,421,425,435],{"__ignoreMap":145},[149,343,344,346,348,350],{"class":151,"line":152},[149,345,201],{"class":200},[149,347,205],{"class":204},[149,349,208],{"class":200},[149,351,211],{"class":159},[149,353,354,356,359,361],{"class":151,"line":214},[149,355,201],{"class":200},[149,357,358],{"class":204}," { NoLagChat } ",[149,360,208],{"class":200},[149,362,363],{"class":159}," '@nolag/chat'\n",[149,365,366],{"class":151,"line":221},[149,367,218],{"emptyLinePlaceholder":217},[149,369,370,372,374,376,378],{"class":151,"line":228},[149,371,231],{"class":200},[149,373,235],{"class":234},[149,375,238],{"class":200},[149,377,241],{"class":155},[149,379,380],{"class":204},"(tokenProvider)\n",[149,382,383],{"class":151,"line":259},[149,384,385],{"class":224},"// APP_SLUG is the slug returned when you created the app from the\n",[149,387,388],{"class":151,"line":284},[149,389,390],{"class":224},"// nolag-chat-sdk blueprint (slugs carry a random suffix, e.g. 'chat-a3f9')\n",[149,392,393,395,398,400,403,406,409,412,415,418],{"class":151,"line":305},[149,394,231],{"class":200},[149,396,397],{"class":234}," chat",[149,399,238],{"class":200},[149,401,402],{"class":200}," new",[149,404,405],{"class":155}," NoLagChat",[149,407,408],{"class":204},"({ client, appName: ",[149,410,411],{"class":234},"APP_SLUG",[149,413,414],{"class":204},", username: ",[149,416,417],{"class":159},"'Alice'",[149,419,420],{"class":204}," })\n",[149,422,423],{"class":151,"line":311},[149,424,218],{"emptyLinePlaceholder":217},[149,426,427,429,431,433],{"class":151,"line":316},[149,428,293],{"class":200},[149,430,321],{"class":204},[149,432,324],{"class":155},[149,434,327],{"class":204},[149,436,438,440,443,446],{"class":151,"line":437},10,[149,439,293],{"class":200},[149,441,442],{"class":204}," chat.",[149,444,445],{"class":155},"ready",[149,447,327],{"class":204},[168,449,451],{"type":450},"warning",[15,452,453,456,457,461],{},[174,454,455],{},"Never ship a long-lived token."," An actor access token embedded in an app bundle is extractable from the IPA or APK by anyone who downloads your app. The provider should call your backend, which mints a short-lived ",[19,458,460],{"href":459},"/docs/client-tokens","client token"," using a project signing key that never leaves your server.",[28,463,465],{"id":464},"network-reachability","Network reachability",[15,467,468],{},"Pass the NetInfo module in and the client reconnects the moment the radio returns, instead of waiting out a backoff that has already grown to 30 seconds.",[136,470,471],{},[139,472,474],{"className":190,"code":473,"filename":192,"language":193,"meta":145,"style":145},"import NetInfo from '@react-native-community/netinfo'\n\nconst client = NoLag(tokenProvider, { netInfo: NetInfo })\n",[23,475,476,488,492],{"__ignoreMap":145},[149,477,478,480,483,485],{"class":151,"line":152},[149,479,201],{"class":200},[149,481,482],{"class":204}," NetInfo ",[149,484,208],{"class":200},[149,486,487],{"class":159}," '@react-native-community/netinfo'\n",[149,489,490],{"class":151,"line":214},[149,491,218],{"emptyLinePlaceholder":217},[149,493,494,496,498,500,502],{"class":151,"line":221},[149,495,231],{"class":200},[149,497,235],{"class":234},[149,499,238],{"class":200},[149,501,241],{"class":155},[149,503,504],{"class":204},"(tokenProvider, { netInfo: NetInfo })\n",[15,506,507],{},"Omit it and the client still reconnects, just on the normal backoff schedule.",[28,509,511],{"id":510},"token-caching","Token caching",[15,513,514],{},"Skip the token round trip on warm launches. Storage is injected for the same reason as NetInfo.",[136,516,517,617],{},[139,518,521],{"className":190,"code":519,"filename":520,"language":193,"meta":145,"style":145},"import { MMKV } from 'react-native-mmkv'\nimport { NoLag, createCachedTokenProvider, fromMMKV } from '@nolag/react-native'\n\nconst storage = new MMKV()\n\nconst client = NoLag(\n  createCachedTokenProvider({\n    provider: fetchTokenFromYourBackend,\n    storage: fromMMKV(storage)\n  })\n)\n","MMKV",[23,522,523,535,546,550,566,570,583,591,596,607,612],{"__ignoreMap":145},[149,524,525,527,530,532],{"class":151,"line":152},[149,526,201],{"class":200},[149,528,529],{"class":204}," { MMKV } ",[149,531,208],{"class":200},[149,533,534],{"class":159}," 'react-native-mmkv'\n",[149,536,537,539,542,544],{"class":151,"line":214},[149,538,201],{"class":200},[149,540,541],{"class":204}," { NoLag, createCachedTokenProvider, fromMMKV } ",[149,543,208],{"class":200},[149,545,211],{"class":159},[149,547,548],{"class":151,"line":221},[149,549,218],{"emptyLinePlaceholder":217},[149,551,552,554,557,559,561,564],{"class":151,"line":228},[149,553,231],{"class":200},[149,555,556],{"class":234}," storage",[149,558,238],{"class":200},[149,560,402],{"class":200},[149,562,563],{"class":155}," MMKV",[149,565,327],{"class":204},[149,567,568],{"class":151,"line":259},[149,569,218],{"emptyLinePlaceholder":217},[149,571,572,574,576,578,580],{"class":151,"line":284},[149,573,231],{"class":200},[149,575,235],{"class":234},[149,577,238],{"class":200},[149,579,241],{"class":155},[149,581,582],{"class":204},"(\n",[149,584,585,588],{"class":151,"line":305},[149,586,587],{"class":155},"  createCachedTokenProvider",[149,589,590],{"class":204},"({\n",[149,592,593],{"class":151,"line":311},[149,594,595],{"class":204},"    provider: fetchTokenFromYourBackend,\n",[149,597,598,601,604],{"class":151,"line":316},[149,599,600],{"class":204},"    storage: ",[149,602,603],{"class":155},"fromMMKV",[149,605,606],{"class":204},"(storage)\n",[149,608,609],{"class":151,"line":437},[149,610,611],{"class":204},"  })\n",[149,613,615],{"class":151,"line":614},11,[149,616,281],{"class":204},[139,618,621],{"className":190,"code":619,"filename":620,"language":193,"meta":145,"style":145},"import AsyncStorage from '@react-native-async-storage/async-storage'\n\n// AsyncStorage satisfies the TokenStore contract directly, no adapter needed.\ncreateCachedTokenProvider({ provider, storage: AsyncStorage })\n","AsyncStorage",[23,622,623,635,639,644],{"__ignoreMap":145},[149,624,625,627,630,632],{"class":151,"line":152},[149,626,201],{"class":200},[149,628,629],{"class":204}," AsyncStorage ",[149,631,208],{"class":200},[149,633,634],{"class":159}," '@react-native-async-storage/async-storage'\n",[149,636,637],{"class":151,"line":214},[149,638,218],{"emptyLinePlaceholder":217},[149,640,641],{"class":151,"line":221},[149,642,643],{"class":224},"// AsyncStorage satisfies the TokenStore contract directly, no adapter needed.\n",[149,645,646,649],{"class":151,"line":228},[149,647,648],{"class":155},"createCachedTokenProvider",[149,650,651],{"class":204},"({ provider, storage: AsyncStorage })\n",[15,653,654,655,657],{},"Opaque (non-JWT) tokens are never cached: without an ",[23,656,130],{}," claim there is no safe way to know when to stop using one. Storage failures are non-fatal, so a locked keychain or a full disk degrades to an uncached fetch rather than a failed connection.",[28,659,661],{"id":660},"backgrounding","Backgrounding",[136,663,664],{},[139,665,667],{"className":190,"code":666,"filename":192,"language":193,"meta":145,"style":145},"const client = NoLag(tokenProvider, { disconnectOnHidden: true })\n",[23,668,669],{"__ignoreMap":145},[149,670,671,673,675,677,679,682,685],{"class":151,"line":152},[149,672,231],{"class":200},[149,674,235],{"class":234},[149,676,238],{"class":200},[149,678,241],{"class":155},[149,680,681],{"class":204},"(tokenProvider, { disconnectOnHidden: ",[149,683,684],{"class":234},"true",[149,686,420],{"class":204},[15,688,689,690,693],{},"Off by default. iOS reports ",[23,691,692],{},"inactive"," for transient states, meaning the app switcher, an incoming call, Control Centre and the biometric prompt. Those are ignored, so only a real background drops the socket.",[28,695,697],{"id":696},"cleaning-up","Cleaning up",[15,699,700,703,704,707],{},[23,701,702],{},"disconnect()"," deliberately keeps the AppState and NetInfo subscriptions alive, because a backgrounded client has to be able to come back. When the client itself is going away, call ",[23,705,706],{},"destroy()",":",[136,709,710],{},[139,711,713],{"className":190,"code":712,"filename":192,"language":193,"meta":145,"style":145},"useEffect(() => {\n  const client = NoLag(tokenProvider)\n  client.connect()\n  return () => client.destroy()\n}, [])\n",[23,714,715,727,739,748,763],{"__ignoreMap":145},[149,716,717,720,723,725],{"class":151,"line":152},[149,718,719],{"class":155},"useEffect",[149,721,722],{"class":204},"(() ",[149,724,253],{"class":200},[149,726,256],{"class":204},[149,728,729,731,733,735,737],{"class":151,"line":214},[149,730,262],{"class":200},[149,732,235],{"class":234},[149,734,238],{"class":200},[149,736,241],{"class":155},[149,738,380],{"class":204},[149,740,741,744,746],{"class":151,"line":221},[149,742,743],{"class":204},"  client.",[149,745,324],{"class":155},[149,747,327],{"class":204},[149,749,750,752,754,756,758,761],{"class":151,"line":228},[149,751,287],{"class":200},[149,753,250],{"class":204},[149,755,253],{"class":200},[149,757,321],{"class":204},[149,759,760],{"class":155},"destroy",[149,762,327],{"class":204},[149,764,765],{"class":151,"line":259},[149,766,767],{"class":204},"}, [])\n",[28,769,771],{"id":770},"options","Options",[15,773,774,775,778],{},"Everything ",[23,776,777],{},"NoLagOptions"," accepts, plus:",[43,780,781,794],{},[46,782,783],{},[49,784,785,788,791],{},[52,786,787],{},"Option",[52,789,790],{},"Type",[52,792,793],{},"Default",[61,795,796,811,830],{},[49,797,798,803,808],{},[66,799,800],{},[23,801,802],{},"netInfo",[66,804,805],{},[23,806,807],{},"NetInfoModule",[66,809,810],{},"none (no reachability signal)",[49,812,813,818,823],{},[66,814,815],{},[23,816,817],{},"lifecycle",[66,819,820],{},[23,821,822],{},"LifecycleAdapter | null",[66,824,825,826,829],{},"AppState adapter; ",[23,827,828],{},"null"," disables",[49,831,832,837,842],{},[66,833,834],{},[23,835,836],{},"network",[66,838,839],{},[23,840,841],{},"NetworkAdapter | null",[66,843,844,845,847,848,829],{},"from ",[23,846,802],{}," if given; ",[23,849,828],{},[15,851,852,854,855,857,858,860],{},[23,853,817],{}," and ",[23,856,836],{}," take precedence over ",[23,859,802],{}," when set explicitly.",[28,862,864],{"id":863},"advanced-bringing-your-own-adapters","Advanced: bringing your own adapters",[15,866,867,870,871,873],{},[23,868,869],{},"NoLag()"," builds both adapters for you, so most apps never need this. Reach for it when your app-state signal does not come from ",[23,872,93],{},", when you use something other than NetInfo, or when you want the same decisions the SDK makes available to your own reconnect logic.",[43,875,876,886],{},[46,877,878],{},[49,879,880,883],{},[52,881,882],{},"Export",[52,884,885],{},"Purpose",[61,887,888,901,914,924,934,949],{},[49,889,890,895],{},[66,891,892],{},[23,893,894],{},"createAppStateLifecycleAdapter(appState?)",[66,896,897,898],{},"Lifecycle adapter from anything with ",[23,899,900],{},"addEventListener",[49,902,903,908],{},[66,904,905],{},[23,906,907],{},"mapAppState(status)",[66,909,910,911,913],{},"The status mapping, or ",[23,912,828],{}," for states that should not move the client",[49,915,916,921],{},[66,917,918],{},[23,919,920],{},"createNetInfoNetworkAdapter(netInfo)",[66,922,923],{},"Network adapter, built explicitly",[49,925,926,931],{},[66,927,928],{},[23,929,930],{},"isReachable(state)",[66,932,933],{},"Whether a NetInfo state means \"worth retrying now\"",[49,935,936,941],{},[66,937,938],{},[23,939,940],{},"decodeJwtExp(token)",[66,942,943,944,946,947],{},"Read the ",[23,945,130],{}," claim without verifying, or ",[23,948,828],{},[49,950,951,956],{},[66,952,953],{},[23,954,955],{},"fromMMKV(mmkv)",[66,957,958,959,962,963],{},"Adapt a ",[23,960,961],{},"react-native-mmkv"," instance to ",[23,964,965],{},"TokenStore",[15,967,968,969,972,973,975,976,978,979,982,983,986,987,989],{},"Two of those encode a judgement worth knowing. ",[23,970,971],{},"mapAppState"," returns ",[23,974,828],{}," for ",[23,977,692],{}," because treating it as background would tear the socket down every time someone swipes down on Control Centre. And ",[23,980,981],{},"isReachable"," treats connected-but-unknown as reachable, because ",[23,984,985],{},"isInternetReachable"," is ",[23,988,828],{}," while NetInfo is still probing and that is exactly the transition worth acting on: a wasted retry costs one connection attempt, a missed signal costs up to 30 seconds.",[28,991,993],{"id":992},"webrtc-is-not-supported-yet","WebRTC is not supported yet",[15,995,996,999,1000,1003,1004,1007,1008,1011,1012,1015],{},[23,997,998],{},"WebRTCManager"," is not exported here, and the core SDK's React Native build omits it too. Its Node path does a bare require of the ",[23,1001,1002],{},"wrtc"," package, which Metro collects statically. ",[23,1005,1006],{},"allowOptionalDependencies"," is on under ",[23,1009,1010],{},"@expo/metro-config"," but off under bare ",[23,1013,1014],{},"@react-native/metro-config",", so shipping it would bundle fine on Expo and fail the build on bare React Native.",[15,1017,1018,1019,1022],{},"Voice and video on React Native need ",[23,1020,1021],{},"react-native-webrtc",", which is separate work. Everything else in the SDK is available.",[28,1024,1026],{"id":1025},"requirements","Requirements",[1028,1029,1030,1034],"ul",{},[1031,1032,1033],"li",{},"React Native >= 0.71",[1031,1035,1036,1038],{},[23,1037,25],{}," >= 1.12.0 (peer dependency)",[168,1040,1041],{"type":450},[15,1042,1043,1046,1047,1049,1050,1052,1053,1056,1057,1060],{},[174,1044,1045],{},"Exactly one copy of the core."," ",[23,1048,25],{}," must resolve to a single copy in your tree. ",[23,1051,333],{}," has private fields, so TypeScript compares it close to nominally: two copies make passing a client into an app SDK fail to typecheck with a thoroughly unhelpful error. If that happens, add a ",[23,1054,1055],{},"resolutions"," (Yarn) or ",[23,1058,1059],{},"overrides"," (npm) entry pinning a single version.",[1062,1063,1064],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":145,"searchDepth":214,"depth":214,"links":1066},[1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077],{"id":30,"depth":214,"text":31},{"id":133,"depth":214,"text":134},{"id":184,"depth":214,"text":185},{"id":464,"depth":214,"text":465},{"id":510,"depth":214,"text":511},{"id":660,"depth":214,"text":661},{"id":696,"depth":214,"text":697},{"id":770,"depth":214,"text":771},{"id":863,"depth":214,"text":864},{"id":992,"depth":214,"text":993},{"id":1025,"depth":214,"text":1026},"React Native bindings for the NoLag core SDK: AppState lifecycle, NetInfo reachability, token caching and polyfills.","md",{},"/docs/sdks/react-native",{"title":5,"description":1078},"docs/sdks/react-native","ljD1vXy5xwytJTdfr5VTc-JxxCYd2W2eRdAJmv8YmBA",1789870601354]