From 983834bc13933eaae1a62f4b90aa6c11068b21c5 Mon Sep 17 00:00:00 2001 From: sunnylqm Date: Sat, 17 Oct 2026 21:00:18 +0800 Subject: [PATCH] feat(native): one persisted layout on every platform, migrated once Every platform now keeps the same keys with the same value encoding in two stores of its own, pushy_state and pushy_cache (Android SharedPreferences files, iOS NSUserDefaults suites, Harmony preferences): every value is a string, booleans are "1"/"0", markers are "1" while set, and the state store carries schemaVersion. scripts/contract.ts (storeSchema, stateFields, storedItems, legacyLayouts) is the single source; the generator emits each platform's key table and State <-> store mapping and the C++ legacy tables. The one-time move out of the layouts SDKs up to 10.61 wrote is a shared pure function, cpp/patch_core/stored_items.h MigrateStoredItems, pinned by stored-items-vectors.json. It carries only what a binary upgrade keeps (uuid, native config, round breadcrumb, bundle hash cache) plus the binary identity: the new layout ships in a new binary, whose release buildTime always changes, so its first launch resets the update state anyway. Puts end with the schema, legacy keys are deleted only after the puts are durable, the store always wins over the legacy value, and a store a later SDK wrote is left alone. A migration that cannot run falls back to a fresh store that still carries the uuid and retries on the next launch. iOS moves off standardUserDefaults into its own suites: no collisions with host keys, no wipe when the host clears its defaults domain. Co-Authored-By: Claude Opus 5.5 --- Example/e2etest/e2e/bundle-hash.test.ts | 15 +- android/lib/arm64-v8a/librnpushy.so | Bin 453856 -> 475872 bytes android/lib/armeabi-v7a/librnpushy.so | Bin 285832 -> 300036 bytes android/lib/x86/librnpushy.so | Bin 439868 -> 464132 bytes android/lib/x86_64/librnpushy.so | Bin 459688 -> 481576 bytes .../modules/update/StoreMigration.java | 152 ++++ .../modules/update/StoreSchema.java | 129 ++++ .../modules/update/SyncCoordinator.java | 37 +- .../modules/update/UpdateContext.java | 112 ++- .../modules/update/UpdateModule.java | 10 +- .../modules/update/VersionScopedKeys.java | 18 +- .../modules/update/StoreMigrationTest.java | 358 ++++++++++ .../modules/update/SyncRoundReplayTest.java | 4 +- .../modules/update/VersionScopedKeysTest.java | 15 +- cpp/android_jni/jni_natives.h | 1 + cpp/android_jni/jni_registration.cpp | 5 + cpp/android_jni/stored_items_jni.cpp | 28 + cpp/patch_core/native_texts.h | 4 - cpp/patch_core/stored_items.cpp | 253 +++++++ cpp/patch_core/stored_items.h | 80 +++ .../tests/stored-items-vectors.json | 653 ++++++++++++++++++ cpp/patch_core/tests/stored_items_test.cpp | 216 ++++++ docs/STORED_STATE_LAYOUT.md | 141 ++++ harmony/pushy/src/main/cpp/pushy.cpp | 24 +- harmony/pushy/src/main/ets/NativePatchCore.ts | 5 + .../pushy/src/main/ets/PushyTurboModule.ts | 19 +- harmony/pushy/src/main/ets/StoreSchema.ts | 262 +++++++ harmony/pushy/src/main/ets/SyncCoordinator.ts | 35 +- harmony/pushy/src/main/ets/UpdateContext.ts | 235 ++++--- ios/RCTPushy/RCTPushy+Launch.mm | 7 +- ios/RCTPushy/RCTPushy.mm | 38 +- ios/RCTPushy/RCTPushyInternal.h | 39 +- ios/RCTPushy/RCTPushyOrchestrator.mm | 39 +- ios/RCTPushy/RCTPushyState.mm | 289 +++++--- scripts/contract.ts | 241 +++++-- scripts/generate-contract.ts | 323 +++++++-- scripts/test-ios-purge-restore.sh | 6 +- scripts/test-patch-core.sh | 11 + scripts/tests/ios-purge-restore/extract.py | 45 +- .../ios-purge-restore/purge_restore_test.mm | 220 +++++- .../ios-purge-restore/round_replay_test.mm | 2 +- .../tests/ios-purge-restore/test_extract.py | 5 + src/__tests__/harmonyStateLifecycle.test.ts | 223 +++++- src/__tests__/harmonySyncRound.test.ts | 3 +- src/__tests__/nativeConfiguration.test.ts | 32 +- src/__tests__/nativeHostApi.test.ts | 7 +- src/__tests__/nativeSources.ts | 22 + 47 files changed, 3796 insertions(+), 567 deletions(-) create mode 100644 android/src/main/java/cn/reactnative/modules/update/StoreMigration.java create mode 100644 android/src/main/java/cn/reactnative/modules/update/StoreSchema.java create mode 100644 android/src/test/java/cn/reactnative/modules/update/StoreMigrationTest.java create mode 100644 cpp/android_jni/stored_items_jni.cpp create mode 100644 cpp/patch_core/stored_items.cpp create mode 100644 cpp/patch_core/stored_items.h create mode 100644 cpp/patch_core/tests/stored-items-vectors.json create mode 100644 cpp/patch_core/tests/stored_items_test.cpp create mode 100644 docs/STORED_STATE_LAYOUT.md create mode 100644 harmony/pushy/src/main/ets/StoreSchema.ts diff --git a/Example/e2etest/e2e/bundle-hash.test.ts b/Example/e2etest/e2e/bundle-hash.test.ts index 22aedb6e..97c199a0 100644 --- a/Example/e2etest/e2e/bundle-hash.test.ts +++ b/Example/e2etest/e2e/bundle-hash.test.ts @@ -9,7 +9,8 @@ import { device } from 'detox'; // 就会确信 pdiff 可用而实际 hpatch 源校验失败,比 buildTime 启发式更糟。 // // 无需 app 配合:JS 层(core.ts)在模块加载时预取 getBundleHash,原生算完后 -// 缓存进 NSUserDefaults / SharedPreferences;宿主机直读缓存末段,与 Node 侧 +// 缓存进状态存储(三端同名的 pushy_state:iOS 独立 suite、Android +// SharedPreferences 文件,见 docs/STORED_STATE_LAYOUT.md);宿主机直读缓存末段,与 Node 侧 // 对包内 bundle 算的 sha256 比对。 // // Android 有独立的验证价值:它的哈希实现(MessageDigest)与被哈希字节的来源 @@ -23,8 +24,10 @@ const ANDROID_APK_PATH = path.resolve( __dirname, '../android/app/build/outputs/apk/release/app-release.apk' ); -const IOS_DEFAULTS_KEY = 'REACTNATIVECN_PUSHY_BUNDLEHASH_KEY'; -const ANDROID_PREFS_KEY = 'bundleHashCache'; +// scripts/contract.ts storeSchema: the state store and the cache's key, the +// same on every platform. +const STATE_STORE = 'pushy_state'; +const BUNDLE_HASH_KEY = 'bundleHashCache'; const POLL_TIMEOUT_MS = 60000; const POLL_INTERVAL_MS = 1000; @@ -52,7 +55,7 @@ function readIosCachedBundleHash( .toString() .trim(); const raw = execSync( - `plutil -extract ${IOS_DEFAULTS_KEY} raw -o - "${container}/Library/Preferences/${bundleId}.plist"`, + `plutil -extract ${BUNDLE_HASH_KEY} raw -o - "${container}/Library/Preferences/${STATE_STORE}.plist"`, { stdio: ['ignore', 'pipe', 'ignore'] } ) .toString() @@ -86,7 +89,7 @@ function readAndroidCachedBundleHash( } adbRooted = true; } - const prefsPath = `/data/data/${packageName}/shared_prefs/update.xml`; + const prefsPath = `/data/data/${packageName}/shared_prefs/${STATE_STORE}.xml`; for (const cmd of [ `adb -s ${adbName} shell cat ${prefsPath}`, `adb -s ${adbName} shell su 0 cat ${prefsPath}`, @@ -96,7 +99,7 @@ function readAndroidCachedBundleHash( stdio: ['ignore', 'pipe', 'ignore'], }).toString(); const match = xml.match( - new RegExp(`name="${ANDROID_PREFS_KEY}"[^>]*>([^<]+)<`) + new RegExp(`name="${BUNDLE_HASH_KEY}"[^>]*>([^<]+)<`) ); if (match) { return extractHash(match[1]); diff --git a/android/lib/arm64-v8a/librnpushy.so b/android/lib/arm64-v8a/librnpushy.so index c8a60737a13a8b8a65fafd4ace2295fe52e0c240..64a7d3c69f0c0bb5e096005052a13846d906c6e5 100755 GIT binary patch delta 151386 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®`6*R^-vJ8CE|Cuk}! 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 z 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

7{M_&Vu-@wv^`F(han7iJ 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 diff --git a/android/lib/armeabi-v7a/librnpushy.so b/android/lib/armeabi-v7a/librnpushy.so index 43761aedab9cf016825af5f94382d4bd3c278330..eef3fd7d24135f3d6771f645a3854c89a796ea07 100755 GIT binary patch delta 106637 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

OqxF(D4hfNJgpb&*!dA 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

gqL340&v&YtG1Hx-;^4H&dtFrY+8>*KiRXplOI< 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 delta 93762 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 ZWm|#yY_+;eMyH!^klryJUxTIk{0Gvl=RyDg diff --git a/android/lib/x86/librnpushy.so b/android/lib/x86/librnpushy.so index a1685e4d084a13c21598d09b1097314ba70971c2..b6c617ce026b8aa178657adb29c7846a2c9daff8 100755 GIT binary patch delta 152684 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 delta 132657 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
P5uhLecE2M$*E1Aaw0C+E!1rYJF*>oMKa$ zx2>m1xliZT@L6B`T%dne)jpXj&JEE%x9XpzrcpwDalb-^sbE$kgKeMrEOJcgeT;B2 z6V1_F#SM8pu3{>+jTaxcGXAN{$8O17CUfpwNv1q>)#3+skCX8cjvAUwc^v#too;i< zwSo9Z6rW5J8-ObZCS_(dz`%+0A@rc3m?N%Eq?AUYju^0nwlxxAV#Y)|-AHU`a&-dw z+t%FQ{vpErxb+hZNH@>W`}7k&ncnXhtk3daYw0fBpD!lR?gY`NdpuyeHxQ0;l9!Q1 zVd-WkPrVq-r|RKo$I02Zj)6ZG0`=Z+WF-13VFl9h z?;AXxEyB5GLS<-R??FZEw&h_oR(x%Fn+X5GblVrwlP1uR8Y$Gasp!fPY3rL}kjACZ zwWcB@zH`cd6+1r?XaffpK|Ax|8YcEV%o`R^twa$Sc@PDm5OuZb{fyHw){V}sS(-v@ z9!Rqj#b+*Y2*aPT_X-6y6Xm0;+27Zb&ZiPX7;ND*C==|l?{)Ir*w9vj+7 z7UThG^luAM%l#*8C4n=g>`(epgO(_GO546HDEQ}e8rxEY_#PN73~*FDK^Tv_w7}nt zrVTAco6>!er>}`5yxnNIRq67g9BB9IOChb`i>|U#d@ErV5Bt!-R-$|`dp8h0?2{hX zb{?ahBD1#-t#2h-iT)qaBSavG-lM2oYjI7q8$~#b3`u*}Thct#S-w5KK~jHU!&Eb^ zaBU*P);wWq*xX$~Dd|yL+k*P1_Cx3j>(R}T!Vr_+B5y91n7}fTh4vI+!$or5cnvlZ zFj$9{I4!Z){)bkz5i#N4_A1)wXy^Qvf@Kttj+sJ_+K45UPmYk|Fa6*HNIM2PiN1+F zCPzo-*RMTkYghS%28OryOr(itx| zDW>!f-{$A%Eyq|nTWHji8nwgLEn4c+PBbn3JHm#+Fe4V46Pe;|lW1o<5g=v_r&I0V zz_lO#d3zC;=smnp&0V#$Z1wGj5-wYPjC6tIUeP2MBDOpfqrV$_R`g^s0)AS2LW|mq zdA`+98gAbVY@;TEIB%vq@I#92Aex9v!)Rg$5mS2oFey;HrzWS1#lvWC2NCL0GXyBx zccYsfupl~@P98~Ora3Jbz%Q`3w|Uc7H*K+9AW=|-Y=dIzj@>@5 z1f!+Dhry9*KiP!_cM=U^t{&5woM`UB{oDde23eGw)*0_IUO^jsWW2Wb#Th)eFm(w1 z+DSyF&BD$Tx}Km3^y$L|NMadDqK3ro!Oa^0!4SskLjA;56Kc;Pa(EKByb)=}{&p}J z4|4M+vHg)Tk9h!bs8Gf$e0!K30dgDDPgXn4d0MPxTSjwWFfHgTd|W;V0J~>(qOEXc zM5&qdb7xW6Gy$7hv$HTSd!{tBSME&4E@FtcQz7O-?XCo8O zqvjbvF}hue1O_uY?$5orpF|V8icu9m7zi8R5MBv4!Cc|YP5?5gR#aeen+zn6ZlYdd z?IfdtqZC~@N)aN9@=|QS?Z~}0rGLiKCdpi0XnbUcuZ_`&+>k_byTO1v^r@$?8(-@s zK1!mjZcvkn1L#sW?D`GrKtbI_mDu6~FbwP_@QPg8k>|MPR-kS?Ys;mXCwE}E535{z zd0-_Hr_s{xVxGu2LFIagZ4pzGH91JZU*HPo3d6K?RZjOwrl&nb>%cMCtwOJ6&*ol% z3kJR3%YM|Yr2wTyo$;Ck74>(^tM-0b^?0;V)p4n#PJFgT(1s@W7NNmQS{E@%mWN4&+s5T5(eB>Z*k9C#9-^f9 zFqb^~h=5?1_iIEK)>t-?8uvl;2R0sh^nu>BXhReFi0D#ZVa5lA+Ti!5@B4`QRr&y? z&&Cqo7T>zOAWUBKDqfmEc$rq(+WhMYRI@J@cx?vK$9=J;_94Z9{;*KU%A=nCG zv00^F;hu@jdi*lA?I(7M4m~NqAFT3UC4tPX1(}mY!;-0~7<|oNU!6julR<2oRGObG z(xd9(R_Kf3n4H+Vv5t4mTgVb7*N1PNhEm_F4Eul@^%udV=M~PYQr4afrBVIG81?2A zg>Lp2{^FPG^t!*O;#RS{CO~1`srmpBS}MPrWQRs zanx?02rI>>)6Oub!HF~(u!I(cj+oqA+66PqW^78Lt~41>Fe41bE_xnca80mT2eZC$ zh$sjwmPo%1gwy|PQwkm=%xTw9tL|gdY`%erVT#8zkdSe*(&4(7KHkKgT-j8{CnL2E zso5_~=?}G%(iqMM47I$`LpV<1&NY~>1zCe6W!4mPusxki8bARoc2!B?h?k&{4h|Bo zY0WqjLoTs2c%aW#ToCO})UenSoET*7DyYr5t-D}O#Va0C`TuPq$&sWz;j|OyW9NRH zPMKN9$vaV212rEk8n>N|^bBnF8&aCVpZ&0)?kep2fHFQL3TF;(gNookHRHQ zeQ>{lX`0fR&JTtKuHBjZhlt8yZk-GCiG{@B?(lR7hlh45|7Rx}Fhm3go#|9W$#_>2 z0yD)0g7SF+EgK?2!Xic&>}sZ)@iYi_4o+c{W5zTO>`3*zO&5j;bH~KSYfSnHnY0myCF(h6EQ_ehEI2%bnG)9=K|d_R zRc%ByhKX`RifYl6hKx651enh=1X{7p)4HuI$TwQU=__^QQ4&G^G+S?Cl3eHS^XkJi#N z`>p!aZUh1c@3h4mj$%OEjJA?!1Lo{P*4dp$2!*T}hKU8VTKN#>nZ0s-GL94-Tz{+w z#-y0dRC0vy59?W9qrhhQ!09&Z)_9Aqoa#l3MvCr%DpzT1?oy?#IjQb()9hFJ;JMc$ zbrd#g7uKT&qeRmJamjdQD@2mhlW3HPZ!xL0wD{}>fSM87R}wR@;tH6mZ`tCY&C+#? zj$7beeZY10C*ns2KN8i2+M3#YBwCBiRzx4+sDDu_+V>IG979`?{UZ@pqS!kG`aiRW z)*;W)0IwZF@uS672QC!}6gV40R4m3M|VjvSWvL>y)hG0A2 zvDjssG6+u`Li*YaqWNP*OQ8&+D`Q1R(X<9t87FKmU0ws%=$cymsydJ^jT5cQW+D`Z z!#p^~BO|-gY2a5UAld_6<$dM8HRTNuwfO)&NM>MvEl9=$fHO$OL@z$ZCf?!xjva@q048OAu}xvf|FXhrW=u3nR@!etyXo90W3ZT) zOzl#!1Z|m23sXfv#p;lZj-7^wC)uymkild_tR?y0ZT+@p&(z{t^r^jXv=*=US3f<} z`dz9B^ndIV_tQdrr}xuBd|{js;@c%645jV$suz)&nGeTcesI=1*_TWc z1Xe}uXvhTUcE4w|eu60Lu_qD69t#(n#pgbq1w>dA>DdH~!@V<9ZlZ`RsU%=>4Zzyc zW@+{t^_U1jt#Oyq`R|vFXvajcMfhe@-$|m1INFfrPQvw?k%&~mLKe$z1g}`qU(&Nl z7|=tlsljAX(_HMSrY$T1H(?|&R@fF91AiskRhxN!YCuaS~nhrj_ zJx^X~_&Xw(8uQ=laWpnfn44wB!IJDVBhXQ{vk9MasW?i`+9eJZGGTudw2&iE(zT6w zDAhOdu$r!xR}?l~l%+RmSQw0oC$AZzY~;uU?LtwynH^xR$6EMx15K0P)`4_>YP0xV zpk6aT&CxnEcZM)~eF-@5OKMR3vpRHe296mz*P%BvM3PYIP`jC;mCqUHZO(LaI1`Sd zyPDCKnP7f$ZTf4b2&>t!Hsm1}O*?!cIPzSj3WJ!MJh_Gi)G^J$j)%-GS(_Tqf^^)h zMIX&VjLCsov|tw2D__>49kVdHV`|YKvqWU6=C!2h9n6i^t3}=xQOD&_9>n@uggnx% zFbWIhB4$rUXdG}7tlPQMO=*Dz9{q+`dCVJ>9{XRb6wOH6L`bC**OTb2Mf4IgllWXJ zoF=A2u;-T5&Y?n*XkWTm>#{u;HBN?WhM;c;nmSuF6C=Vk4F9(0nyr0{hilqb^a}Z^ z_7wk#n9?#Ft6_vgu{xwcIS^vq&SR*l+wrHSKKR!Qan}8sdp%}{lfAQF)-QP#+z!qK!{BH-Ul+imda-oP&r~j_f!i8Ax#xx~_58QT{brlF! zm7#@;(2MF#=$l1iyUVWM06bk+%mNUYT#xne(A?P9*g*bJx`8JE7GvMoHh-||fxi7~3ZU9@94~#DubY!<~frO$K4R&9bZPM{?CqZ(gP*D@D_w?ghnmVRseg+R2e` zgJ{i4#6Q@}(VmrJz9=3zErGE5MmD&Gm9R|kwhu3wp)*uwbS%g~ zXCj<{*L|0Q>m z0|KblY8cK{w`l<9{u^90_n<$0wp#eO_Q0mO&GP6fZAF==@7^nu;txS-WK1n>$-#vy zPv^W=QdY6!l|@vk{K0!wD#HrxcD;-Tqi2JTs(=!9;?)Fod{IZY8YwkCAEThbCoRX zM6+`I)FI2+xQ`{qV4n5H_<%q9!fLROAmy@(doAllY42#{$N~0u=7;)F^m<`-+j9b~ zoENx;PD%>ggds7MvL3Uny$pT6UbJ-|?ydPV5hql7@;iw8%?;RZUmryOZh#vI zHT>o)OdK;x)9J6o1n+TJl|mzASgM1sD_9cmQqQkN8~-?8jh&y5*1VQwUMv{dztX<1 zMeVSqe4w&h)&mLgs9A)B&jQG6qiE@G(IYKxeWan_*9YZzjom1Q`Kx;F06lk*%w38Z zZ6gBJR(Vt7O_0YICazQW6!qIAT33yQW6tBa2q&vhBfb~JOtNtyof>e0*>K8_E^HD* zMQIboZx%gWCmg{TEPAWbs?9Kk5mhL2v-p%XCE*(^Abd*Fhu?@A^%|Gf@UI>r@n3+y z#Q47`3H<3=SSvoQ_~bU)dCC~sG@AuFb@3ZGo)!;!13Y587ggUPe8OG1B5gYFdl!cso~aX!Ipd_rb3CG$$ zH1g#HX~nG1@luMs5omWak>_uUx43B5)?440dA+qLq|H7wJoNAX5A~aJ+C_yoJ8%Gc zq#XI~gfW<1t_an!dr`T=bB*d-5%h8=sQxUXDAh}T`u|Y3il7DGf$E?LjcSYys6KR4 zUIAV4q=4!`4~^=3@L&0=?N4R-s_mkX-uMMa`}n8-A8Plqbb6Pl?R_5JE3_OJCRo{6 zQiiJJzgtAOl{RWpa&nLK2gS5->a!bbhsNQwY&S;BGn|w?xJ!C}x9IA9h_$6Tt{oO! z?A~so4&P%VbaJMw-YyFMt?szVn1d#$0Y9qfCEMywkiV@1KTm~NzF;TFZ0lgwKqUa8 zwR_>pJt{?>KVW}lLnzhyK{WRMq!bh3Z*Ax4-0@B+MRR`;)r)ohfqyuY4P{y}94zzo z5Lh<7!^^N&g^RxYZUFC@BDMrRkA0Se`U9U1^=9Zu2{qfA^PV7=^<-!_Kuwv=qlad+ zh_Q=*XHtS+@DZ@*V%TxjNT$z*@(qvNZ*Q9WDpc!e9w=cvM{OZphycs#igU0WH z%#7MiYxf9WuW%fQOSB1$>(hLNj_<()@mCN%*n?B2%pi*R5yw3ff@t86A}ajPe-%9F zVP?XnDljqa{So1BlG8XC)4`p#|0p6%RbUxleIy~H-{JJ-M^Uj{GdxDi6j?CY6!@sT zg9Kc8-$8PX52MJOan*4VF85`WrUOf{SM zWoc839E8ozgXL_L5Z}EsfveCSWt0gzq@^VxqK>DT&*SU z_))LoYN*;BfGNe*4q~hyohq&dsv`~ggr~V$i4uM^{e}qiDULTBp#zre1P8yT!*`S# zRH2{ExR^fOMfDWhd})D;T0sqn$fqA&)J9@iu2iO~ReW_J_O!J~K+W#?=-r8_>d=H1axFf)uW-;|^z}yvrPRc)_`vfdQzrk0Cp>hzB>SW6$i%P+Xqa2R`qG8CZ0KNw03o6A;}&SL6I z`>9NUlZE>TxPSe!xare#e2$AZjjZXG!8{mOaNEL|f3slhhnZ#{MiIH(s)(nJ@=n6w z!O3fmdr*Qes)*mMbCFs z!ULlj@s1KaR3G8~j=FoOwZ-{==`;Sj?l$FksFpZ>e3@B|6QTsi`U2W9l)Tkit;zlE#7mII|)ShUVSxPTj?|+J3gpZ(IiR>zidQ*(2 z>hJdyC$w58VDsXbT@jt^;x+a6R6{$u;zb+FQ4gEtwH9>iZL_4X4+%48vkcRY-jExw z9S=qVrk&cDZI&TgZn({|h~F%dyO9Sk(ixx?GhWkQo@z?t5WGzd?zYGqg0K@bZ90$z z@y^A2*$%vo0ZO{rui^tm3fLT1gw2nxYjf9358CIYRuPqMQl6I@B<5YG;-xXzz8;ws zORH{*2-{CJ%cxPV@*e9eds(VmMh$aQ@`mtwZZU4ME-a&-E@|q*L`a{f`Jb61z12^I zh}}caebshib|y9TQ{&a7()pRQ{M5=ysn^Y=%ay`*^rfAC@>d6kzw9raz!{J`2Cu?u z)0S>tqkmrQPYnaqmhMK~CG~HfpSdtVZ7amC^K>If9U>kjXEqO3?O?2}eCq(C{lTRmRU_%OA1TC-lb zU68C9h4Z&CN~w;jj>_8ikByLrm>|%{%O0#gJ?&pHtRpVF1I6^SQbb} z0n8lCMEN}(NKs^l#xV(+?Owpd@+f9M+_OMe(q#ZWmom*B#S049sDGDIYPdQ=^!}G_ zhpS^msXXdZRvjI@Oq!(pn>*a{W-<2Tj_Er}IwoUHc-=%d%BsPY?Fc+d8ZPoDxaQZf zPjpDJo1K-~UkmJUwPcA5g!sI&lZnblsPzSYoO57=+EVv zn6A=*yUK9q%NU~c2@0>M1~?za5WUguRaXn>;J2 z<{;kfV0+x&Sf$jVSH-ccH|EEhd1{?X9V)41y?)XQjK_r$Oxv*dYj27OhoNszV}6~z!#7~KrPvkmYhh8BZ6x0 zXdw9_iP-#%DpXc$8$EB}72l5YgtyxB8GcC|_m+jrIikvH1NGHY{H``0sR;Q54m)_k zu2DbGT6jHq-4n$?wra*8(f%pTtfGD-_MgR%i(z_LakdD5^(dX|8R*H&!;(t@RxB3e ziyWBEo22(T)zf4q<`e9;kM+&VnP++syoW# zrMC)-mF9Ygpz22?W4SC8%x;CYGDBOq#%k>3-v|J}st?;FT60sBQ@YAgb6NN)`noks z&Z%m`Un-rvFX|cBU3D_s@kr%s?4e@w32Ky!TjN#$aGkvjEy@+6LR=peaGYPyD&)BN zPbbIE;)m3#sC7#YLu?KFd)#-mWW~~FkCaH!;e<8_Q78U82+6ZS*yICp5WGwN`M-lO zv>KJl!aP}kuY0zG#XrDpIzI`6 zDRTWk)S#N`FE0N>-K(i)PcNKc7h&Ic>aYkar%o?vM>W;g#lr$JEAEq?bfq63=wvb~ zIdpA*k%kHn_W^?Ue}=!1$msOXxO0^HfGSs48>(~nYNV(k5AfigqIMD?do|a5dmcTm zuC^^d00%I-l1mL4_Uk)2#yPz9;!#ere}9e!M5|>zf>6|EksfzAd5%-PeKGIato)ds zZSlCqZ}8MeCwtUSDlIq)mK?mHln^;~x)QD0MD^zML5zx!PJ8D381)0i_-`g2GxRzM zBWk-(rE97!{YyWWJ5A3q))~#;%Ecm-4L`m$uBKYPQcLYsP5+GMv6yM9veT-^haAKs zEw)FL$vf%X$n0iegC>po~ahw_xI0mG^5!H?ZrdgvtOk4 zwx%F3Ha+$+BjANKvd->%$G#B{lJb~=a0B{tV@tmS;d;b=5u}DwIv7QI=>+rvdTXM& zB$PES53UJ#c=}g5Sxc=Q)CA~@)UFAVw4kh4*%VY8Zj#47imR>85wnib;o2%9in7UG zTOHGPVpTb~lIeO-?M(fx!KLLimg;O+a7?mPjthvIiBHEA>pnTy*4^^#8rC?->f)5I z0jKEuI%?yf$~!;|52}v;zCL8Hu@3Z#!*cM&cDPLu;Er>+R{O}7ox^kc5w%6R(hXpe zn3pRe@E2pg>L^W!!-8@I5Uq(*<3zoqbTv*5O!Gzoxpn6aq|PnM5=TKWA1^S_iTXj= zA|;*Ue*+J@ql|O>vrz`0Yji$j^5^v9mh4kZ!)AQpm@D1PgIzZ#^`3RAnLe(omRHAM z1-hcHTD4vqpvxl`XWkn@ooH^fgQJzBg%c9W5GQR*^oGhDAv}{6p6~=OljzZz-Zo7w z(Vml6D{y$kOu2`pEI1sVfwB2M93<-7qq`2%fO@K5n+1SbvX5Kdol3Rqf;$Z$eW8(V z#-rkV%?6mFC%}BR*`YZN`s=+#B6hF+K}YK0An@%kWUmLmI%pfY)W-(Fov?h0tgnUy z9SJKyTi_l|8V{WKjqU#R;a8depegmS$Y^_-L*QsZ`8lBep$h&-81wzPsNBy=EbNu`%j3^$!vj)Ld zI_2{KfO%8FY#dUW5x8*&J2zN(n2VG`)((nl~XE#*K zxm5lbqta}v+{)u1t{+5FY^IrrB8_8vrvSF1#uk z#<jxU0G3dO`M}da{`4rYzt)qU2M9;=*aNorNPF2H5dO8Ae3$hM4 zC>3u)(LBkb(V$J*DLxZ9%O(wc>%~AVdYr-6bZ}iX@oQtXqRVfiAra3veclABpMIHw zny6!x!8EUlT3wh9(EcWB#nOihBa;&t<@D^#7fsX=S@3%D2=sQH?6I4!@KJ{R=jj()V%s#h4~7iE2#i`P-m7>^XoJv-W|P ztVK8_P&I)8=BohO>l4by{2yUv2WctNiCCh{l|B_2@`2ZF@a5pG?R=7 zK(V=9%)v9BDs%7$IoKhSIr+OmVBz51$L2NuuokRI$hC0eiyQq()KZN~o358-zKz>c&~>L=jmC*T z&=hb2buIg()EQHwZE$}xi^4x{Djc$HnV>tn2$>^y(WX{ddZccmGp(@E zGx`}hTB%W@@+Jywtpc@9mI+E+=Cw4C&eksP zl#M%EJHC_Jwo#jkU0>6}Hdt2X{6<^asKEihe-9RbEp>qcT!P+8vl6?LZnjZbX88v}>fsR}JMq_}WsV@+q zs}c+)8wET}$><%@<>wbp*ic34c;{&NWS4bH)?cABKop(1TdV1#QR1xOsUgw?0P7Hp zQ3l$n^c4lQQwKFQqgE08Q%Y(`rfrwaoAu_i^je>9klhLAk=L8wd6^EiL-WUWX*J6M z0}wiEgldT5bwo3CM0GY$$@Z#$oi>+I3&HtdjLhOGyHH<}fwKs%A3U@s_Iyiy+GE>0 zXFW{=l99h((vhT_cQbyCWzI4G3+pWAXgkyfGFbu)X!$K9LsuqkjUtU)O}!goD7`}g zD*rq)tcAAq>*kS9N(aczt8En2K@C$+yXR8_PHaUYxq}+eW&yU#(3+!)BU-DI1^}An z@pY7O1ZlwG8c@m^Xc@8%0?*e>3%lMD2#<7tw_SA`**mCJs^xD*nUS)Lv)V%jx#aES zJ{PTf68oFdu#ViR8`jhkjyic96CukvE$nKpAI3B}nmEQfM$1g6HcfPcf6z~YoXRws z%WGshOLamiX?s)4fOw~=eZJ!z)^!p?x}M!E4&5a~AwX`*co%2k?m&d>mzD3p`P00LMlK3+*~@0t41=!I0~3;8{!L z(~OR)w@btRa8i0MrxhL5dTz&a5IqK2$=^mdI;vgO4|DMQPP0W2b?OACW$ZGV`GHzS zxa82XPU=vxI{Wj^>OfIHn+A8rbf{+2%Fb99mq@L3w$MNQUsm+Mf8u4-h+ zfX`KarZ`f@$KwC*$H($>%wqFp`k<@&rTXc`cXTTQJCPyX)S#d)7vB{whHyBwWPuIMJoK9im{Q~wG7P)C z>?GDxlb&jY%2$`cknsTyY=u=n(a+up)#Wtrg6R)geYcDj^;Bz?YPVjBj*N3_yq?bY zRO8IYAYZx%#hxVu>>tJen(i3z7j)lSN7Z{_0zI*g+VoPx#m03ss+Ss2W!^feNc{YT zq-rX@3l_S=w0=c)N57gbpq;27&L5ytz0^99A8Tigu99)P&3uoM+q(_33`+3!B5##h zD?g_yz185(9l%lvUaH+k)P8Miw|S3Vt-6-aelfd&=s^9A(s!^gT&t}sGVs?1CFKgp zp1hX6=&iQ*xS_4X@NC7H8}z)lIw7zXW=N)FH8xAEe8o+l9S$y~*?rV%qU`6mm#fYd z>$hY!?yG*Nh+$vS)_&>-V)R$!ldMLR>8W451lufw@yj;$xW&{uSsfJMvR+O(P7=DU z(wxWkt0+5J{Wz9X%`;;YUbyA6>bN!#J73FTj%VVxuhjaqaV4(Ls*z&aN}~R1MD3n{ z<7f>hzBM(s-xVEj`b%?kR)ylBTgl3a92JNkEup{qtL2BxTC9O}7O^l%Mj`@r_S*O8 zzOX`aQsM(K$MA`+a=Z2)wX8KdlaC&g73CnIVayTx;>VoH#`D}8D}ZD1o;QIq+nrjnSpNHIHrxrvw!4> zNL){rQ@KHERP3H2upfZRsw?CgzzfuZqXnQ+-P)u5v7f4+Pcr({HzFQND*$~xt-x1^#N|o%g3h=16DxJ|8e%^fi)fP-^o3v1R+5piG(b!2qMH91PKvAXl$_) zYKfq>SZcetQLgLO5{$O?s-;!5NmVP>s;#w_ZkF2JxYWLryq{-g&OJBU@9&TIkL28$ zdFI*XnP+C6nKMUv;P*R#9m|J;ouF@vveQ{a;K{{tc9IcBA|vALeC!f*srRj5=V0x( z*a=EXYiIKTL8+Iku;azxJ!03hxr3FqreAUt-2G+5=~b*T z@HrrV{L+qc*mhAqDJ>h55xg>Y8TWaM^9-sjhajn8|H_fw;J-fyv^@*MCs547+)Dc# zP!&u7scKexmNEoWrv^DJV~AoLSV6o(BwQInW>l}2=CEj)Z?ks5ft?xCJlwom)8~PN z_ri$?^rS1MTOG;P5{X4HKEbP&VFrV4S38a^XtShS6m$xzxET5n^$GTC=a>Zjz^#IQ9h0R0<5!aY zkJAPHZeQ_@v2w+~a?U{b##qowwrK<=Mtirg%OjLjkD*(z8VyL6ITSR{GWyHO=q!Awo3KvC(`Norz5z`+%gq2Z z7YH8dk^t3~XG|j=fn^E``D`J}$oYf=Nngw^ysxzCZeA=1U2&kkUgH9>2DE4KwBoFb zHsg6bOJc&doK(OS$`ZqxhWx}LHer;~ti!!U0(l2Qj{OR%0oq9tc^n~^lN%zI224o% zn`7R=sXr1S%Q#goD8nW#8?B5qHjo&zZ;M{EbUrC!nwW0z&_vEmwrDig!YgJTAr$m~nODc2ly<||~HGpIm zq0JIRVGZLrm5DU!QU3wJqUla5bPplPGF@iL`QIoTR$-EF*a=l?f_Fw>r4(D{gs{u? ze4OGrbQOW>)Slqm=Y;UtT;YE2(eu77C-ZMf9~_m^>Eq@)PXGBd$r2hvTJeqfASj7{ zH;xU@R4RuCfEZz)2r3}TYXjj}Ni1V7`yx}R+i@jDhiUeXIEM_Fb|C_km21SpfYXfo zH_ck02?04?N&5L%R%5&pWa>lgKo39Q8{+`sNRa$?j_Al=;c3g+LWHH3f1c{p@_b2g zr_7RC-i&bp{BRbD8U)K63o3|%NbY&_K)}DPLxkYXh$+`aKK(j9cTwl5;sB(j{5;M)lB2KuE-e@u7b)n8cRrq$4_A=Cn%{sr_B>} z&R-LCF3u)tZ&9RBH1c)nz8_DPLgyL%2?yw0ky%pZXDmP^rCmRoO`iy9J%An@8mR_! z-5*qt`JWtkR^Ee22Y!LxHx)B0};mt;G-XK-g}Tf zASLGEA;i(;Ex;wMN^boY&P5iA`T{+X=}#!LjJzf&CAwc_2PY}bn->%1`Td}s{7iE6 zw1bvvsE`o8(i4k#1XFn_)-CE)GdD+ zm4@I8xl#eI{$^fNu%taVleL(FC}i$TmNo^8{N*#*R6GYxoymKPqmoU!9I2H-$cLsi z$J9+EHEW6e8)_X(GytRdw`d*4(UH@Kz(F(F^C>ut@?wTY$LX+n16@HraALQZzICLMG+n?{ff4Ls^It#P9?|TJ6~a8P)c+z+5JXv}QehFR`ztDiOus)W>|< z|9y60DpntxRmHJnYCjz`>`cwGq1SK zdQL;nIFTt}B!hbaMm)IV$v5G3Y?-KMl|%^plA<*OXNxY@L4fg@CxMMD3idb)e2nJ{ zlPZ8@kESVg%AAuMmIPlulSNNg8kCDAPQdsl7r3d}S4?M#@})0HYFZ5oAE z(OSRhI5b0!$7?Zc*z%0I(r<;KfO|K6s96b@NiK#4VTl3ClUnFJOUSbQJa1Qy21@x7 zRtv10TpCzifwVS2?HkKMd6<-10ikyy4gt=74rE3B#iN-*wobrLGIt@wX4gsFn6d0v zlhVNSiG+NPrgDz{wza1=%*UtNKcS4-!>M@^S_!f%RBCd3)xHy5MUYP$A0f zjjcOB99%6rLq9MEXfll^4Ns25^TfpQ_(5k{L^vIIv`Y;5dlqrdZ6s~38{(YoBf2G* zCOA{VTZ+dR_F?J?vhiWA)ULQ zkpwPh?Cjn|+V}Iy+C@Pax#vyQexJz3%*6XddnYo>Or=ufiqU*}AHlm+uF+FA=4@nB zlcNo^LDB6h`)7_482T+#LrqlvPi_gk1~gv=3=n~0Q&^cwCjQWvoj}0S?Dvb%n=p-?Fe9MaYAw5OR(t}>eBkcZ_?Z z8G`LZ_QgaNI9sXGiZ3w4oI|VnV1$lI?~doEa79d}%S>rYRfEo+$Y##Q3n8D4U~6Y% z6*V8VW#f2~h-i%Bmw4j@YRnpSBgDCRvJf_{SePS!pY zM0mB<&qriR^*tW$BsW8n8+DPBi#AGfv#>7!e7pwmO~bXnq=E5x0&5-3W|t0U+dfnh zYHgb=xGaro1m^{~45eRwJWcG2YRWjAh0IZg1O!nPfKL8Z*BmH~AJ10LL0g(L*#0?K zy${1|L#hS=H?ErN=LN4He;|lHJHs(xJ?UlvhKE!Gh;QQwUWGqLx?~1xGFM438D+Iu zs77#EfXk;fwJnF6n&>3lWT5wD!vLkbr8$!@!NbBiQSy{5c^Xv|EDd111L|#Fvp=6- zCYO+GmdRwrEK1Ybr^ktIPyLkqZ=TUp;=DB$f{^miWo6dDzu0Jt;uD#^T8KXNG#8!M zfanu}i!+w%>?%vr*>;QK-(b_Hs39lfvYQ@;MpiM`tdUxmL4=k0E|aE>go>R#RS%Vo)T;-35TFfjq{A_2^fS@;9#_&OLC}JeMfTh z-YG89aybX-2PN3D1U*Rju1IpVBN<030vj=Sy0o=o?=h6!nWw}gO`jlSyl_&;cxg-# zC;Jn!#lCLz(?pPQqgDXk?*y3Eoi>eOBdqWn=96rWRf!tWg|NjM9rYaa^&dVbh(i{i z2zvufu0+!SXq=fEvJlE7tK^Q+L!h!^JmW@4`NRly959l9f`!gkdPFQZ0ra>W1x1>F z{%|z#h%60y+-SCTKDH)fPOvlcl?cBwR7;g8HH|8xSy`J>(f{Icu9Eys(6pnnCdc99 ztd&iv;s5z4t|;mT`C(*zJm@|9IGb%#sADEpdFimynn62>P-u@w~!0gHKBnz z>$nDd4Fu!d<0}Ix7WVE!n9HC^Y{o*Ra$P!F&k5%lajynPxo7~4L^yD7sln-^(WSUG zB#dCE7AkcOal@IqNXhVAKOBt&Q5GM?KJaLNwUR04)n8&xOWCW^fQ!6qmT{0YZ!5C2 zBuR{8gESz)@W+e-72yvz$uTN66fbh$nS5iVD*7+e81q#MgytoWNwP!ZCRM~X;MjkpH&U=k*03@!IbiFw9! zsh5Ttm0V*4WdTJMElVftEeK;q%fnNo+FWChgn!hpps+QerBB{LbJs_L6+FZ7g!DKn zEMwkO$y-+1i%Oi8ETd){TSl_w*-ApWKD6_kJ&JZvyJ9OY+wnX5CtIl&T}xK6(xe3V zD*-=Lj-9Rc>Z2@XwXUoBB8moJMc4c^gD zMDyU_U|Cys*R$->5+$foco%?@zOszT(&+xCs6Vhj`ic21RZ>mo`Z!w-r`@^!4#+Hx z;5W2dmB&A!IjTLaGe@k&=w8d-VFx4?CyISrju3*z4;78r7*8M-6DTxl&prhvGFi=_ zL1e1rVI+mDwIE=gkrP0Txst%mgWO8)OS)HvfB@NZt}#g>h!hA&^b~3`u(6c(A;8^c zR3@8Ri>FB=kMhNYR9Kc3O@z0>&@}b)hvG=QEr%b4me&4RZ>P?9Uk1*FT9$5e(=tF# zSQ;i-T(e1?gjAryWkvw`m&J-l#C8G&mNJ3^juZ@*fLJd4y&Q~d6O>A(;S&1jk6a1d zBEkN_!5o@fHImBgMxgp8 zkU#8(x4GR8#i?#y-C6(TidWD^3dsr|YcoHg{S7gm+04xkv3bjt8m5nWLQrf&0|hrL z(6nN$U;!uNfZZCS6(FPTAZ#`ls$R1{q~TojBwh(+iG+u;oF}90^<oJers;d=zy$qCt{f{+ynx=3nGTIoIZ>|-Uh zWH+jTnmPMe_fM4I&`3(d$mZ?i-1Bxs?b!ptJ;0_7Wb6~AahdBha*!th=#cL0(kDs_ z<7^q-zqS_)A^*kzvKDQFigJ|hEdEo)$MR8|+`WYPOP;s<{i##_KE6CRTJ{TK9l+?(88>>_Jg|dM0?qNY;)nGy4^&U=v*MNl2 zs0M1@!&7e)$|=n$@Hhu3%pi2geb(P817A#l!dO9}Zxu;lrl7!UfWlNsA(K;x()I&^ zYjHQuie_X8c*hZmm9Qjj6*3j)-$CN(Ariue-Cv;;Z~x^WAxR0MBagTjmqZG|9`wgi zg7(eboPsu0_+2EmVeiOp)^a6YLtn9*y}wd18~k>&M=O;&&F}Sd+Dty~sB_EznS__K zi6eP(avnmo9sL|b@+~gKoAcO!RX9I5FOSW@v+HmjTyNGi5a1JhvQ*79+f$|=roluA zYKTTn$nLmF87?vf{2j=5c!{xiQ(rb>H6pWCz1%|0hGag5JvW?zl^pda)LpeyCrS;Xl;d43uNmc0 z_&vnY&e7E|Rm-nR`5p6jxF{-!@NbqG5HCO*b5+5IHbOq>!-Cf!{(7npXJ7MS`;m02 zQ1e0Se&Efm_1=}D%2c=_zG)ERppA2`+*wpTR7+)`o)ej-&~5@*eK7``?1>_+4O;O6 zxi)Ck6-jN-sv?qnt_NlMAZf*Zj-2?u`o4%+-VsU7Ea^=O=Za=IWQWvACF ze*V2u;7{<@iMhEtzAWxv6PFTQ>bq>6;#;;B3dwOv_AB>i;p=d!`S;eW{W>MU)SR%x zVpr_sCzbII2febv9S~$+*b5D(d%T&HEV9?S`dxwDrpG7d%PdK7T0hP{4Oo0R3|dL8 zk%eg%Ftgu3Q@p!vBN!Bv1{0vpofD{gfE;-cH%`{Mk&T?n|0Y|iDB0J2S<+`p_<;I^ z8Z{Pw2h@22HIlZT!gbE3Cw9qyr2`Dmk_BYfb`&yEwWahMBb5~9!@g1&dCsnDLLoc( znc^S1iwYn?0Flup@FDa-k z;-EG;ENX8}5$PyEQfvO6NLt0^C-zpr=rlO8CHfNFuu)J1-#nzn0vS6U34`8Sw*c$$b~U zscOek?&54zD|fJgL)bzkq(&;Pi5U`>D*eURY>~@{VH1`U2oJQiY2Rq#xx+fMzc(nj zfFhMF!(oWt$I>1cDi{v568D638_U{lRAP&puwF4A3}K;WHsVh2Ssnp(wbWuJ!UgQSBLaN8&uJZvVchie1UU zTRK@rI>2hn6|Vq7wAEc<8fIGjX=3eetDEoFJ@{geifnmC73M()_ zOaO)+?ARuyeWgNFC;d6ThE)OxcR zEZIE{XV{%r8PB}K1OLe;W0DrUng70v-+oTY?26k4#$umJ>R(Lh^27`45Xr5LP!3Uk z+)ZzaOq?n})|C|StV6HsgrwQo4gg5PB&&W2;sO~!3D6i2VPX8_$RmU;fd_eFO{H1HDmF*)-Y;K$-@gPO=z-%@N2c=z8|o&(U1&;O^$NLlkXt&n#ihGP2g&lsV;MzXT@m zSszcwP+N8eB0k#`qen5MZP_23WhJ*O;U0f{L8;2GSG%hn)ia)r48H1aLbAb|eM zwR&im0J2tJE3HiP+jASxY-SpgcvqC{u$b5Eo-j4g4bl3i%eQjY8Og0f|mkPYJUi#nM8z^rMHwX;genSR)azo`;FqC z(UCHNe9I;%A6%1tAi1%fu#eSv+H&~8C1GFo-7O@oO!NS7_m!5`34MZ~0a&?AxQHI0 z27}%n(5w0jm1(Ra`blJEUkW9fpdHYTz4`{HC9mL}mi*5#6}OqgT)fKs4m2oxWwnHY zsYT({@bx}@j3mVqnhVXrs0cBE3z2rsp-Td3u+=;Jm#82SQb|*&BShj_ zq~k&^HJW`oQ2xs@oQ8ox*UymAn7zzVI(6z!)S-lL@vaT%air)^+mnR6oA3l(obpBJ z1{akIr9py~_26i6hdx@Mj!Q47lgw7+Dj}v1n~9bnVJ9bp1aRiH=kApzfm{#Bstxq; zvi@#fS&3wfxXi*H+!QO^lvfmzaq+pl!BC?X5Zla?wbN=qMJfv(;3 zTV-NW>gQkrvUS9hh)T$|ZG>#`caLg zA)@`-$pDW&GM!EYRx`t)UpajIh2cXpwd+j<4lA9~hH5fMHQ;bXBAc{BX>V%19%hyG zf@Jq`VdOrhKV(+hpd*{v{YRJwxdzeNgr|+b>rb{}m0h$Rc;jHYx(n)X<0l&-s#jX` z#wDk1Gmpc0Pm{*y^Cnzl98mVk8*Sl%=~4iQT?M~+TubL*8E{E~|Dk&!|EulR5mxh2 z?FA6MM_W)pZO8V1rwlS&TgR&HR9aUUsJ(cjyTBhC7qD47m6%9-5`=@`iR(lYCnb>9 z5nqG5(FY&#vski@wRSob(WfGPsBkZI9<_0>OfPZN%b@4qARL zl}e$K%glhx0v7zF1tig3{f;=E)O5Fzl6;Id@s6?_X^;^erI+~HhI1U+!3;B|B?+XdPEK==WVJ4@6}d=a|;s&8@yWx>zOhmKs~-oNRHflsHy) zx8hqN$OVVDWT0~^7Q0)iYWf;-qFd7a6c6F7!3u9S7o>aZ^O1#GgvMx1g`1G=Y8=ZU z5!W@p{{yR%G-}jY5{hJ>00?VRNX?|6jQag8M?QXrF3m3QR*KQP%J$vLU{g230mz&c zFiknIe%-uCL##tG|Eb{A#~Me+)>S4Rwh&Uy9WVSaG&_B%zUP zg%BIWCTd@A25HRNjY5=TkdV;$kTulb!SFpWj2d{iP`eh$rd!0Bx&k#SXz+Up{=e*e z!@ps(G*^bTd+?V82L2?3Lv-FClCV-QkL-Oj#)Rbh-mJZ6HP6s z1|U~{j2bx5{S;(uIoy?N)4DoRC3@{Iv@Bgqti}H^>7jEK-q!iFe3|V90*FQI&o4=o zOy=qOMjE$%h?orYR&D;~Y$WOLYZGlUD2Q1FMA2t$IdkP(KBS;!n33UiUd-Y!XtzE= z?h5MTO@Y$;wOuAEGjN6ccS;lX=>a7op!IU0vu1d@RETN9E*wzCnYuI=s{NYrVvW}= zjm30kJ)Yn>hBvolbzhXg1VMSWuE4VcfJ~dz%h|}oW`aNp5s>|}BVm7GZ(GmJL^eP| zZ};QRh@{26z{9x|822_1KJq zN>Ip%Wn3)HAp43W@n(U7d&IE3gGzlvSPXl3P)SKRv{XjZeKeu=G(xy-q+_UKuwz<& zD>19(BkrdFC0oqK)1?JIYQ#SLNvTq^KVhQ5hELu)5iksPvP6IiToGU)t`R%?6XHGP zm$GL+;aLB*C9K*ZyiB>aAscr{$?$E^5DbLpQ*2Yi=D&nJJcNso3mUKrhjDW8Og4)- zj8mlRv)PctN@&HI*_aw$BoRU0h19TYw)U_R<=+_PWRcN$iZlP*KC{`a!%7{)gT*Z1 z2yWjwiwkCt;I^He^^0`=%_6ym_yPM17qiJn5KtdqpRGQkR0!#^ST`dSCy1mbY>WEr z+z}S}V`K#IZ=d20ReD8ELV=5p$JHys(I867cR_m8V|hoF z0FO7faBZ}IsQ74)?-zJ!+!h~4{FaoI4U3q^G3ajmyR61B1(&-uC}1Ow;VT1{=4|&d z?5y=|&hn2bsfMaeSp3gQvv@7W2tEc$*}o14Tjl}U8KzwEIwusn90lCC^%p?PFK2sy zR)YHo z=%uA3!cvg}v)U;bov{XzNcMa|WN8#Bv7QX$6TX}(93Qt18b{^S{1_b~13nYyK2Jyr z@Edgn*R6mM<~x<7j|WmdZxI)~W+9v+cOohglw=lwWkgc5#6l}C)!u`-FOu`g+W`0q zPnI(7lj$>77IPAjiS?8(C_Bo^?@>YlHe{1L3u?jhsOX$@JXBNWXcRi=#xj1EbReZT z2vz9!UlrQAW^!GFqZ&lnQ}0QER(9_sg5$Wvy2L4LL0_H6BJlM4ah`@BENFdYXC&)$ zN(t)yNhJ6yNvz=F9l@ohfbpn@8kz!zh@>WecO;!ra1YG=_@)sL;1|0BzY$uI{d!8N z(qSWZWA&XBo7riunYg3{ii!+{qF~xqT!vS4J;91lueq0#}LPsR!=$F=*bqWWiYbsd4DYV;GOHe2+DD0FJJR}7- zPJyp6WMft46g(w`EP{s&H*qgvv$INIOgqAdj7=Yk4*3O0<5mo@z~JkgBbA6n5zCf0 zk7lFxLe%c{3=49q-3_&Ey3$gJe=;I@lf^28hOLOJSzcHk+8;<3La9zR_rfpiQ{gs% zfZBo-_RfdwopVYx(}mgSo8$1-Vya^pB;Y%ZM<}nIBf-&~=fGliP!4$rTAh+c9F-hZ z9W?XgQB3AqtToB}YSN0Rj@H-{T{FQ;JZGi{>N`!0Oh@1UEsmoz_ApY5IHs<>O(3aZT%@X8t!J{L~&WWQZeWxemT2rlIXIt&ja@wAAEXX9llmp zyA>P#n^J9k0g@ZMO8HIr`I$IDa zJtUm_l0Nj?Cw$rON=O5{*{N9xbh)ZiZ<2!(&K#0$hq-{Y_{`v2JpC`QZ!XWq{H|1L z>DAKN`|yn+7cVDqEU74^kOq@QY3gD)_)1b3=Cf13<0!@V)dkyr;7eoM7xam8X*``e zOdp@99Yz<&cy7#sB=lZ^l;dwBV}V8X&~5W@0@q8)!}h+x-VjI|>9{-W7xZ$r2g{xnA~z#u1Pg z%`v4Kk10gB;Qpry4=qHvd1X1!d8{t4xF{M~DXWFF1_HZKMLWc1;*9b)Lr`+YUot9d z8~{DYf)@b!o)SrgcQt8fM`L_Wz%XTy}4)m(tg?APiz<35w9w43XsAA~}YVc+FBa$v`B*xbp?XS$;(& z_aKdfk0yY_))ciQwx&|?GO#U&AI>AI#MO_)F0i-qD`-ZR8o{j<=K!S`krFLHxiJ7V zARMD6-W4TAs24($*KyZki}Q;A(Do>!47!N}RX7$@SsyA)dj+1hUHq*B=|X;}AlP=n zzp*Nx8Q83R&p;mZUsg$k#z~~qP`2m1QX#^*_SKuTH=!ekt+Sg{mAyW%7#qnTc8KOV z%ITCfD=joqn-YniLd46bOP;gt7qD6kd(CEFP^wl~?km~NHI63J2IzaZ{Bhp}#iz#! zs*Q}u>41R_qJYDevx1KMLf4d&Otl4f8p*~~2^yMGMal=TC&AE`tP+MXst$;|OBqgG3&q4#K#5;;E=nFon;_gs+nJ2<}2b z0EoDPslR6;bOQu2Kmeuk7Xqx(g{6iS_T+-*0+kE#ZIwWrPB_%J8=hl7j$St^vh$*8 zWJfvFGrtj^AtQ&$4Ib21mMdVJ{#J&iJ)6uiYkkKqk{k?DUJC*tfS<=Re=9mv5h@zg z-Lgbwq!v!oeazXi1#HY^WwNP~K&vUQj3g@ib_q$vov8eTOq*FwtaxW|VcQFoxC79; z&+B05jr6G7!Qo*Cb(r7b*f__Pjq?^Q*Xs;hGo6 zvX79GR5-9G@o#(w_2f zG^T3Vd@J{beaYiCTywk@n!geX^Dj{Eb=}tE4573!v8p$FmY|J-5U&DO^_nuX+rWuj zm>I+b^1Fy6XA#Mc0iwGm;t5vwNvK)^O0&qyBB}W!uZir{HKkg+n-eh2sHO=_s)Y_t zQzp$%`L%Ax{pAcQNK*ueZY7Xmj`uX6RTJ2V>zIH|MLxhZR!54Y#%j7NDoy?_{%rqs zd_XT~0{iE>QmxXX@zB;{Xe<9?`iDJ3YC_J+ALCiw8;C<~8PEFNP%1Q80#H!X`onCI z)YLx14~$3T(|79#fs1a2__3`wl-6~8QNc0QF@fWU;O|HTG~_|ZrxrrC` z_ElhAZz@&Geq2G=hJ>Dx$>!ZunuoL#*_sNPilo*okrkNzrV^4+QeDLM`TK ze9q3ND{GEnR<}#RNk<`s)}lvzS@JEM6^O3uoZexLE6*O0&Ew5`YRw%b(Lv-e{6zqt zog|6lg#0`bzI(YJ-@W9=k;bct8y_`4S2Fnz#EogY5I9=;x>L*_+cX3K@ck32;pNK2 zn1^1>aSNXlW$&;zx0I;BTRtw+Qn@h5J_-T08d#zoH?zb zL#*q%a|7G3@3m)vEdkto&;0auRDv!Yb=PiU*@vz-=5(`(-p|AlVV^XzXYw z<}5prhn2u#V$2cX2t}-z&t=wV`Qp>_q)`U>IH<1VEIo@e2&kc`=v*(NhssxOD;~xt z;O!0E#97`WQFN9!&3Tr$Ymu|Oluue;fQ7VpefEaD{>_#{kfhw-uwU_ioaNn8Xy7QO zBO;)kFK`~o)7S0VJTyh-(+4tRs zL)Jz^8sjvN#EQwb)5E)2-qI-W$~^fVh*dZd^IUCJDhCI$N;DWjK!@9X#qd#Pl(0sb zU81ZIz#UKhl`|447=$%z%r*8Pc;uGQX%CXLv*5VRcUb2;n6NdFRI=X(*8pD%a9f@b z25f#vNi%R*Gyw z$Z$d;MpOE_E!BGPl11NDf`)aYBBXOh>b8#>Td`S4jBdcwwu>L0l%D9I3UV|@79Xo3 zpsy(lYSqZCE$<|^U6LCi$PGC~MIaYdlw5U5E|inw$1^3l7XKy}`4+h#jhu`Q-hRPi z{=t=G9VM+TBZ`Q&u}l%&FGrGlDj6}qi7+(|TX+6S2dMWAXYKAOfz>`kkz;_PJ%8Vamn=dK_`<$kEC&YZ>BHIldpLsq-f*_@9zN;R zv@~ey{U=f+HLB%-KzAkRhI(}Kz16(Z+^a##yKJ`+G|cjW7hi>W!uSr#o;QeBcD@vv zXH1d(Zwldn6IwYuZKos0@ z(?z%pW{9aUJUtK^$H5m*_wmhaI8X09SCu8X%$4=5vPZ6$b#Imt0uj-)QmN2`PODQX zQj1&(_)z~PsNpUg^amChqqpG`E<_9bw8j2DlA3HKORf>aVCbV0;qOo&>-W)|NWZyI3xV7m%8BqAknBncLF7+7p-G_=ka$r5Iiv!Fo68~^ zDES*}XX&l@s|3K=Yc!km2p6oDk~D^a27wL-QmBCIhPb1o9-l_e&Pe(nMbJ-efR4 z1>TD1?}9&3pRoH+aD|gvoOwT0Dw@Vsae5HUj*85M`HQE|U%?>dkZ`Bu|KD6Vs~C?N z(cHI(xhoxsiNGuw--%B)vdvGG(uNC9+0LgpJnjcTXNZ=rN{4Vi{s68oJt{JrsY45h z6PgnofrD4hnM?$a70_u|=tEp4riUtTy_CX8oA|v142o<-+~Q@jK=JGDbK~NR5s;t# z4q2mIbte%pF}0cyiGi1|I2I5heu&W7qwO@~0%)cLC8J6g^!R%#k%U-htrC)^w~jiZ zMkC3wv1zf0m849R)oi3fd%)|(eXR+pN$J$OwE)ui)dfZE9G$}NXV zDbAy*$u93+q)}9A>T|aAId*&N5e|3&E4>p$s?$R|Lx`eK3V%f+6`&|4MQHn(&_|q7 zL~eI5fU~6u;K`b4OvVYsK%8Nk4Is?6_`z3TBu+iJJYLSmB2_#o&fa~2+tKGMZ0-xC zav4|nh0j^;3neY)qvCv&&!y%-l^bcIf8R2Iu0&nx`M*^4yckPOhvrL|n@k0vF(xzu*mc$fl?*rq|rE=pCWD=aFmP zDZh<~cFL4ImUzaRzQS7Ox*Nh$8-W02+?>Gw8h1TlzvURhnHmk0NIo<$J;Qn5WG1 zwc=lV3*0$eFKhNjso1+O#f(60S3mBtG}s-G$fn;Qvk^(F%eKbhCvOUo4&k~+n-5dD zu~9I}jdX*oSq`@5wGw2!NkvE}fB+FnB+UBJOXLiC!Y;p7d=onWscTCJtG6@6I66ez9wT{j4H zErHHO`evvnwd^moJU3j%s$beK{)S3GQW}-eRhiPVx7Y26CMKhu~+$>yB6M|p|>r)3M!ETv{v2-NF+He6o1rf=~Ok@KMv?1 zc>bqodmats=Ot?NT6$RxGI;h{TA=!ud)O1Rh_?8o6-~9k-qoHg!d*2sIP|JWLw$!N zpKQ?aJgvFb2^ftjOHVe_U9A_@k6_<(^mp{7s0iRSfYwxy&a-l*|B2|yuDYvXhBB{M zF@qWwbsJx;bP?oq50@nijkg%6q1vo%7^qj<4Q%FL?!KnFeiZ%4bVfhYi$p&tpX$88 zBv(W~>S>)IhagGlIKTfh`cVODCKPrA3bg2lg`!iadV6aWpD(1EufOKA1YCKxu7X0h zrp9|%-4U0YM=us4kaq-;xp^4d{1r8{=xt~x_7?;rU^fr9p`|ElSgo3hAz_P5FhZ8r$?_&CNt=OZbUIC;Wdq?SN zV;%k0ab!PWGfS!d)jvQs#jk*N5NbLX{iGP7alZ}Fc-_C*gBogp;XrA2v6Px(=>M42 z_Ee3{I$_~#K3pI6cEeHEN@vA{H|DD=u=v$^_!anmP`)g=9}*;d?BtGYp{LrU>;?pB zQLHWMYIkJkJ=O54)D_S(I^YO&*Zr8YkVPSOEdtz`(@>NRHymCX?GSXCC6!jI8PF-l zlvexKF+KuO;zNF*IPNbVqciUd;=_tyMRJ-uoie>GyBM;cME+3c@$o$b2klv|7YAj~hR_%R;@>Xw!*5 zs7W3>2M*D=O$ZLwx4b=-#yO7Ia`?q0WSIJG6uDPHfU@*}%37I4G(m6i1ED5BoRR~0 zUl1f}Hhu>OUKIk<(xiSOXi%*JsxCMy-xUU20Z(U0gU_eygPP0i0ae3_(l4*mUnuEc z`rVa&3s?GylK%R3Md+`-Bj__cZ8`iC52Q}C{I^%w0&msVwCajbgp_&#mS5bWa*cf? z)m}xYx)MD=z~DTDi0TX8KuNSbC(6I{Ac;mxV!DP*_R2*W@X{HGkPQ6wo2%Ha478LC ztik(|E)0C?5K?F3X)`-N4*{vaz6@y#M7!};Hm$h_Bi)~CEWC@$@6kv{K&_6R7EEa7cLzds1%LEMye%S^bm%m-h5 z>y0QCSBNZu2bJW;NhGHeix|`|a9Jex4~Zz zc+^hkig;97HfSF8io*8zs?9r}5tkGOHAM(Gvm==UabN!$EqgK>+uCS{Ra0aSdwd$Y zlk;ydoJHAay#5ZM(%lIKtYZZj*ZK2BtnioHDCaSd#W%@lwHrc-*mfrX)YwhZ+g|}Eof3<=k&cTNGs}X@SHC^i5to;*XP@eHQi?67LvSa>g z$z~_)*nJ_-_MbeYpaS=Px+0pPf?z|r&dLU;6-owD4%E>17K;v00}TsrvX032h=a~y zeq-s1-^#xK!OrJ@u+;%-RMfd!KmdvB#e_HVF)F(H% zKch3vnvImc${WvLW78`OlPXp*Q1v$X6C&Y^xq-oC-_f#k6+Q$`ZeMa1x9=CE={T`$ zDIk#SM@aTR#61__Kr`BzSJ3Xj{Q;g*SNWKS6tc~Ms*lpXMFHCvs0LJMjABQ%{CPAi zkP$(}K`6Tyh_$Bs6;?h-ZP4i0WuVY8?-EH()GbIl>hN30{kae0Nai;$V5T57pzi4A zoGso~(A5AWozuddXh;26xA#&wvYIEvYD(Gj+Q8m7s8xE-e(EOIqtE0QQt+ZB);1*E zFR%Fmrl2`eH6hRVOTA{VJ&e{^73;ShaaNgVmeB6WKXiP)YUe zyXvfHEYizjxJu}VyXe%v35uJEa4~VHMnEH}0=G#%mFOqxs6?^OF|G*?2~Cv$o4Hq3 zQ%pY+2#UAG78Kftp@pc~<%oHXzLf-6KRl_MScyE+#YK9c?q1Qv8VhTFMZ^wYmjM@q zcM;(rl(O!%>(W|9jq=2G^GniPGke;yx7=peDyz}T|3K333|vYZ_B=Oj%5X_-Hkl@CVCgbFnp4< zSdFQBx(QT<>s2MxFBhQo99q#60b=L&=_2Yrf0+#nQDYhprF!~1RReiFEfVd5@Pne& zGcFU^AoeswEoUfsft3tZI~huzWPL-`=$8B-Fg3Q0ckL;fuk$OusQ@?E5~I+}TolMY zene&|EeqJGP_?3I=ij2eD>UXj@+xT3vgd^+O5h3A@mUHN!@3$O1k39)=7q#r?M8L?&OW`TGGjfxomJtXsQy`s;kJNj##>Mvx1 zV@GQT-7moV*O|+bEDMzIguxrZu;?K_L;aVZ zgJ?C554spaIdvR<5~IfNySN}DuZmi&Mr|O`bOoFh2)wDIfuo+Rpmpcsf3ng>HON2z z4-lod)`-7MDgCjA1uWjE`WOGe1|PQs7sndaN`{ap3@-#k#kyG53TjJ`nRT2jtG#w7 zNhZGL4YL}7Ty9oV@$GT&ej83U->3$5TXjLS_3H-EvV6PaiK<0ss^aX;j)aHpkXo#{BY0afhx}NVH30=!Unsn(A#eZMHpttBi1-v?c3P-R*wFS z>5qRF{s6&`Nu(i*md0#>REsRNSphp4u2wdEi@*qFl&{Z~Hia0^Pkgc(MFvXh zTTRFbA%x_+rXoI$^gsK6M2yQji2xPp;hfHr#P)iCg66+D$2+&DwT>;Ti3s{o8_0tl zkKWJ(M1*MooJPTJkjO-37o3CZ6|fD}z<&brajz}cbPW9t(={JKY4M^Bmn#f}rRF)C z5Y$)f(!wTW_BWL4MwEVA1sqzJ`AHS$uUkWaq3?+krkJnwY5m3=Ysu z_yT0XubB6@cq9gBD%>gxeQf3hB3#PH+vP6R=L-maEGY%mZRUCMd<{leb1F^rZm)OD@s!{1$r+|G| zLk$kBTgTawI8H12ko`l{RrZNKl>HC$tf|&9Y`Dmp*Hnl1bNV1`f0G?UyblkFR+FxC z;yJ!rD*8!_+nDZPf0*x=grDY<2(00U>c@o$QL{s=c%&NJtUoZ2+`FUjME+i!bg_w5 zzRh`IJr(@+lWc)!7@D~5A3kR@A`!4HDN&>Y1^NVM6$bGhFj2)$$aa*mWryBm`y*9f zrEXLK`!iCl{%$cU2y+BEXxE94ERSosVsMn;M>n_}*H5Ca@UcWnepG;Jv5FsR6|hdV z)QZYV{CK~X>R%!`3z{9e8?CZ`3=HdqgC!@Z0c>wAwX&hxF7|gVwUXx$&CPYL8E8MtW1XVZ@`lD(vPG#a4Nq>fFQQbVVaHr{Dhey9 zHb1btQEFYUZF3PUn7}7R6+nuO>8=C?Jw@i*STkn<>w;YdcB&e94ZF>z)mE1pynkdq zb@22%%D$|lCK~U-Hq8fvXbS}jOToWEDfTGLMa&23GxI?y_QIc;Z?sz7P~s;R7p-=P z><|R|;DyO4_BdyvM~XdwSMx@-KIS`~DfZq!v+twTsDwv>RKpv2C_<%cu4&Z!9@7+* zJL|nVhBYm|damNs>|xaEZvQxgJxEt8v$l2BGM!fA_1P5K@xbml!P$F_Ft|k*MnBER z+6!v7w?o=d96#dm!>N|^@g;yO)gFt}x%Tcm4cJivkNKd@uG~c*yKfiKT8t&)CKeInJ*>q@U)Du`v)T33W~I;HK(0H_x_*Y8tf#gzSZ^?& z`f8HlgA zjWSeXV;f+La{3Imuz?y9*k^`IbIW(o%TTrI-wGqzdyQRgp!PHjy2hF|MDPE77aQ47 zZSFbr5NS;9Zm&GWz!ohs_$sHb;>QhxFS}mSP*y#T7GyS0gTLXO)2w_WHL6?#%$%WP zSR8MN4X59*PKynp$}If&I!f{NNW_gO_5nEtc7L~f1;e8&Y)d1xp`q7tcD<3>E^HLu z#>ZU08C*@sxU%~%E9BPiZ8u<#?RD?IKic2_nWe-aP|@fLOOH|C4-0IF-h*ur>g07W zT)`$ns0xjtI1J_=z^xbBje`wt+7?Vc?))QD@@*r%ZzAmA}T? z6O_I_!Y(z&-qD7?*^9>N?)Gya37v-PYD~6v@UVyCo;-dEK81i=9N?lw(C>QUcYXR@ zP5h3d-+}l|B9}kF+?%Sk`dr@+k&8iOe8~#p@w%sq=5ZW(Me{hWO)hzab2-wa;P~bc0UrSDQ^%d?;TYtFP%_U z*(Veeh$j@mh4vD^xv+}(olLOL_HvjW^xLtQRd1%&NZ*S*O_8LGZ7yjI-={_MINmu$ z^Em!-$U_~De<*&FQoZ`SC^dEA6Jc>%yDx)qn7R1hxhssCm;T2uiuGmyH7tz@HBs%kf0b+T!J@!T_lj6`Ne2R z;PZu$VB>ya*hP2e*Z#o@;?$0Y)IYxK7>{9Ac~+u;-E5`S4*98si_eZ2UlROTUfDN} z1h!Z9eH-LlwaYo0QuJ54<0ZF7Y`#$Ori?By4{jm3*|B~kXuL#l| zbPrQIupB zw`TGEUc6)*VJ&HG%U8}8_M(mIWinc)(`kk})q$@X8n-JixsXPu1dSq~Q#h-3m{^8cY&CE&(Nlr|dm2Bsn!O zU(>*Rt^p^HOC*mb>k=a|>Etd~<4#`PLU$!~MK??~dV&spnvI{5z$qD!akKY@ZMdjn zPYzfXdayt<+mJLL_RQae37p1d9~U_aPnoRHy<>n@C`DlJKrQ>7LcG0`CD;<)M`q=`-$N6zNeep&SGvj zD=o&XrovdgW_y4Y?ck7&+bYo4p(@EoDX{I8)rwA{n&)9F#x`G^Zj66zGk3$`D>Pmn zbZar#%;|I&SxePw-boIrB~5WgqZR3Uhv*a1 zEduEb7o;nkNYj9HkP~T|KssC?ea?}dqpNQO(wtn>%kb?9jq{#!_|fO!s|V=61}HG~ zDXy{Ct26y%G@)Gb-|M4mt7m1t*n;|NRxmx*{O#l zfpjn-HTS#8n?DkzmiX6J^Hjnk`)*6(asKKt0r z4yvE&AQ})U?rrDu(`TqjkwA)H$5elg%ErukR{WP8^MHLaWU)^7pgfe)GX_t-%ssl& z;HF@bYMJgK(U6rd2R8d$s)ci;=%(<^Q_Wz?JHM+5U1vMNkO*_*J?&QkX33$k0+}1Y-6q5I~7`{QrxdrjblUua@8dp5!{9(H&HibO8& z-OI3~%I}Bu1HO9I!g45jpCgT}>WFX?XAna!(IiIfNyIGFZ{eesnW1Ftx)>rD`zlD9zftBiVc|R+xLGe_Uy`b#Y^7v%(>7f zHhjuh&D+`iARMg-JScYX>?gqSQ#bd_cdT(94)-{Vc{@O9Dp~UZ6VlcH8NoH@!Gq^L25wx6<5DQer|)3H3UfBXsCo1*#}Y8_?2rQjfCCy`ce95Jxa zEAGCmekavmDfx-uEn(#mgWJrPsolEyjtjP&82*wkB`Yn5jdFUAMz*%s%%(gK}h9XEj3k^RR(+xMT=s?K&d@ z^zmVq(OHdAm%t*}>5*!Xsl{Q^(-EmBn>mjxaPZ@P{jv15?V@~AO0oUg#^>`ha5Xe% z$RS8lPKU#ME}FFzd(cfS&xUtV z%Nj~tW7E5+{_gh}>!KPPE=&cIpjc;$`~|E6k%Ud3x=2R$hV)4;;C83Bk7VCR5(5oc^CA&Orv+<_&VKF?MK+2uGq8c zy##U|j6{T{JH?G=-l5vwmP0(Gk%6g{na8vIQ|x`631f;q#hIv+VsGV4#HQFA@`OBK z+ms@&CGin1*|PTM*x;7POB3J##Ig|c0X0YfA}{b>3Fzy2pmpQzJdiy7b{;727J0yx zY9G)B3r)nodbVXJyQ!guvIp7PVTh7>r>gG+jlRs^#-oq((lm$mE96=^^)ic2RsDlv zH3-^+6cF+Xny|}kaH`tK6tUcCAJlkf@m{)U^8FjQaqy+(x8ipM8OLVvn=i>%ir;aR zzX-pb>%ksHl$E+fv!f9Jl6J%q_es(-IQC>c%_+p{X-*{)Y0hVB7}-fE2SzpzZrQ<3 zS3`hr-T^kXhdRKc{T>X#=9Nd;jUEVV_PoNpd#Vi#TaL0eJ(1pcmW}PH*7CH_!Bp74 z&D!Q9`;s7ne`QyD;<&`G|FB}c5LD~+gvInyqYc|`vf;hd8io(9FxCr8Hp_8#sFxaL z7wS87w|VSU*8E!hJc3XnQm0t!-fF|rzyATYaJ2&tu~%8n=Jr-A zxu0bldaH4s#4t6HZC9_K*~8vyRnODnnxi1wu73`(Dt*B21)4W<7<{g>Pan00XQUs| zi?@S92wU7ot?8b}_ViKxiVsSKdQ1!0g+6L{Wy2oyKIiAg#0J|u>nSj3GjIHnh4fWh z28I9iFH@3+;`tYw-d7E+*leXR6!?vkYtRS<*y`fji~HI4ebslv#vqe=FWJIi0s!D= ztNC^uZ%MYA)##^I9NEAHuDXO93OGkS@Q8U3*)l(N;)y~Y|Km9t>ZhyU%H_zz34yb= zl`w#f$t~E|{nUWKf^&!sl(U(~UJ$;Q4CprU?1}O0Mn5&Alrdh01OnrkcYoD4(Wfi) zR~s9=gyz8dBJr)uZW!qCM=ywfx2vdX|3J2jYKQk%;|;N|+1CDu8t(s{9qo?@?|UoQ zt^R7e_@q@_VSI)WOTYE|TgO4y5SXt6#VQ8_G$onLXB0d z)_lBl&KKLutwC}(*P{nTde|FhIKz71OO3|ip4XkcaJ;v@*hU`Wr_f4&Oh##-#nPZ~Je{S0Gg=IWG5%Vo`9nPz zm_1T4{^G77jG3wSrmJ{e)S;0z)xM3R25=C7y9(e^s|g0cX}BT@_^lee@)o>7gO30_tzHED^i?Lw&aarEgB>Sfcp?0YxM zR-*|?N{an3o1LyUkJ_I_pO+MaGG&G`s^IL&z{*}d46+t(KMe14YPl^gkqi&r(@Nz+{F;IC%${BW5tiBk=j(b#{UA-a4&kY%0b z8+=Tu*lC$(_J?KAVhoE^{L-ePwq2A@(pJJG91EGtHuFp|Q@|pFAju^S+6Hq#uQw+n zB14miqKk|sL=q@Gzko(oiwWRY_)S&Iv|+VIK;3({vNj{s?uM7w*qRZlkEa#0r_P;H zGK$&T&tm&Vs8zj#x578M+pL=rr?ut0y3U@AP^*PZy@uFYH;<NtLrcg2ysnuE55O z#-h_3|9qZj>&5MO@pW0;j*9oV6npbxJ1-9R$#N|dRA47ZtHJNov6}DmpJ9f_ z5?8S?YWWfd)F2h~U}0m_>OqpG?Mn%V|Skg;{vf5~g36^9N?U zg*j*OzY|`gT|Pz)D|P`1dp)*qjOv?Cb9lQyCR*@ywl@B7c9sW-d3mN3=3J+uH<;P* zBBN`OorR8JF{thx>xSpwni`F}fqInTyYBpA_VtP#VY@*Ow%xgynk4}X- z&ym?ZwQ!-R1p1bjh2uR7b7(PvGh}XVJ$i~f@4_56*s(p?1%VF`sL0e2cyq-5$oD9k zZ+XuC9;;R~l-k5zja38G-2FIAzUUwVEw#p}Wei6*vS#DdDu#%IY~VOG%9D@JOdOP$zJXaX)ux8{4eU^+ zTHSp(yPv6cE*)dxSi9TrHN$C}0UidQrt7fzg|X0yKrUU(`TzR*68M^q_x*FuJu^2Ul90rjNCdIP+E`016j)hooshR5M|vRgubw&Ce8j5?fu0@TJ@#sU#0XS%UsT?RSurD zP5L*_6MCcJOR8T(@ooGK-U_vZ=v!dE-iJu9^OPb72#4A)i}`Z{)t#o+sL}YiK6-;i zaml6k13(#RQVb7iA}*3VEY)!T;;CT(F`@fOu}lqG9v z>Q`7e`S&ob{|ctS#lv)1yl*;8_rFs6C_{Xx)l9WgNO^qo2cM-#*iOObIhpzmdDg+oby_zBIHluBW3RzV%&CYqdRGPmgTj_B7+*B}x)p1tqCb zRWC^#swUfV3heLIRDBkfpo0(5kXfovO`k*dHnA>xv_5V;R04ry{qGVgF?;`6@0+4kF)MQqFn0=Of)zxJ9TCLiA_`yO^gbkqEoi$Dt>5w0$ z+C;M^(nO8w+Q*lMe63de;I24Np!bbe&?#V`@NC2b>${LXlRp@khYG*~*?y9zQPvm-u*nNP+2Wno@6!Du{!Mff=DLS4Kd}OyW8BJ}<;}_6= zp>8p1OZO*V>r4fULf`vZ?<38B#7<+jJ3boHRooH8uvU#OeLEZw>+me9s8eNd_;CPb z#h`x_tkhg)s|#f%ZY-^sqsA%jW2y2tYP_;EO56608Xzk@zo1`Y)gFrH7vvkKW+($j zkunzx6PK4$$XxYf?}b>A)h8&4m#h<%6Qe0$f$B$F=VDCjv7EZ#Mf-iO>MJYFKc{E& z)CA@5D4H{0^)noaw2T5u*izEwV*zm3D7tOJ7x^WYlANGc)dId%8_3Fx;nXW$ji|W? z`x)ZIQ_)ip9hYDP3Dr%cVI%Zo7c{Jq;!`HT?%&11-}}vCE5~baot8eO3LYUiuBjYd zESTM`)Q_aM3)F7|ejYBYU(YNfWGN!kKTCw zq=EO(WM$M48evw4D2an9&8(U$?@0io-8@Zw+{DUB*;<$4yQ?SO_{Vp5G0&bcnIq2#jvc*J07pW17_aHj32%X2rL{AstTiCP()ONAjUTOR(&0nmJ zRLU=)$BWhZYQ_Kz>PLGT%DYV#N6uS=Q~AsC`ksmMNjx1{0$cy?0LosXMkzmiOZ~r7 zCo4Or(fRMxXG;6|bZV(OSjm`2RhOwPTz?QP8j*Q_fHrcO+EGz<_Mu&gP)n`j=u9Gb z?B9nBq;^pb#A-cAt&Mh?tbMgYT_gLpAsCAtu`be0f57y0gm^IG7l(-&uT-xqM|+aT z52{b4cbII2jq%KO#ScJ#FCGI-ILeQ`iMruh>mSsmO67s@?ui(sOrOHKH_g&t17PMg z3(K6@Q_Eeg9+Z_T-Dvw-b$z9M2<=rEdFgfiHK1o$ChI|?)~WISHw7Q<+)P51dzwN6 z;u~Z|=VPLTv@^SZVl}hwPN$&tYNE2H3msdJ)&HRB+THbPX+wYqmLy?Wbc!!)UK)t! z_z2a!^yDV-;9_3dhN#RYb-iIr2g?airA4&%>n62^>??5b<*b;#HcVd&#&e6>OW8P? zBDbi^z4VywW|N+JchzhC!GWRCzpx$|tK$UH9RaRMEoEKhpXotKPEm zs0EGN4TELYXj-saov%FqoV@m^ca$=p(~CXoHRWA1?fhPKt*opVp^g6;GF~OVagkib zVh}b|Yw9^;q1Go-d%9meWl%OXw4@v|lrA4q$0%opQ0v3$F(o{o3J$A@hST+}#p*X$ z+jT^pD=U{ir6$MJkCcddH1(Josnq$DZXCmT-(Lr6Esm@6WMyR?I+>z=ul(4b2A#mM z?vedz{Rvnk5p}4_Nwp3gKP9^=C9R%yf`w;@lH8B_o>cwZ+lgg<>u*ggs7>FTRF~EY zt>sL;{Mi@1R_s)I#a5Ao>U~#>K02jV4NO8n!xWf31u@O99urkvDcWUH1u^G|cI(wM z^GzL!J*Czz(GT&2HT-)W(oU(tet{yvS#Awq&MlZySy!Dmv38*=BDY$JsW^Q2M+DVN z#fR@xx6!~BH(2f*^2CSJf|&>#BWEj9>wL9c&3PDBg=X*OVv0Qn znTSnsiI?NO@e?(VflP}{DJ5j*#Y5Vb4;htm>3qIgp~PH2^cNTc-S*Ryd^MovOFw%m zSRA&e(#|oJ5!O^DJhr6r!q<|@(VuC~Th%vk3{o-2zRE#~k>?Xn$#U0jn2qNyesugT zl+H_E@_GmT^cg*VrcmEE60JeuUqVNp;gV)W!R2_Le5TQ+=Dv@CA#ZF5(bE zNgP5DIjpLrPbmiuI(1I}v$d9+EyE7Jbm|=h`loEleWzA!u}>(? zHngR!AsK0v=;H$QC*SS=3YI+MPv}Q21F6MQ5B&%qAEPgQ$2;%uH>%hWhqQKSg#5c zCb2wCR#-ym)en&3$?Q_l45mT3nF}9~r-5}-hGfwY1M^i*l%-h)7F_$Ngf6b?QKqew zrOe5za4*nv1IL3Bpn%&I5>{7`@LYh6WoLQ92Z z`obH2dKuhNSBRTA&4 zW4?Z~-{p%&bZEyyDd0Y2;H;H$vXS$!qZnpP0nhRUoI;7J*kL)OSd@- zEX}<|7lr90zIKVo{PZ4`F(Q#PFZ$TXCirDxF-S;8j+pnFLUVOnx?84DypJ;IqLEdv zyG4&8W~fEOcVz$?opTK5@v%^tE1J=_3KmFv?xOtT-YQftu%e?%GxT; z{-JrU3|j=H>9Q+}P)_|#bxN=%o|`>I=kONx9a4FFmnN2A;Yy9aDZK=1QJRZTeB)wW zu=(^Zl_`nxpY@>DC6Rc92kkA%sw(&I(Djn6X4zG@tZnJgUI*?_SvOWUpz3Q|H9ORF zp?2KtPQ%?;Bc;Y2A~)8*){dJfp%7mo5|#=o6ycQHLNN4FS1+XtZ~dyToFrb@jGIdp zDMkJ*npBF__Z+Ev!=}XC{|l{Qt6za1-q>?uK&_D%x!kilpCnDQbE!zQuB96>ILnolX{oeL#exhql3@ zo~?UZIw89EOA7R414^EI2MzhO(z0JJzN7h`?6}uEj2EWp+>!D8#J^=cw7A~y-ctY4 ztkMS}U?dJXjXvpFLy~Hxk52yzpH-a5^zzUWKDGpQ=U=2m)=Kx#@GlO2w52p#P&f3M zLzyg!#y)ho>Jl0zrBRhAlBnnIN-UnahC^C`5J>L?47CE`T{tI|J|)_4wR} zRS$f}bO~GF(J&?M|2*dI0n8kmic_WW&?=$W-wC4+%d*yTIDJ)?O;M81(37&vEAY^9 z%Q!oMi}(w2EpMOU4Vzbx&3_(JP&rn;)Hzj8KFuhb_l8lwa;$DlxY!gyl<|Lxs}rLe z*#=x(OnL#yU>VgMn~X20vTHi}*fKoGM27a5m&9e0NNqj*g4V=^?RgO6WY;{cSuvRV_S3=Qzs0=!k+F z`@-c211eqA?7{M^a$!}jwxR=UXxr%NPjAYzKm`|@_*G!7OKs22FR%seqR|ytwU!GM zMJnin8Rv3wxEQr?3oEu@HRuT(Tt1Cr%-(p30(@C{`8GB8W&SS5bx$RohWfGqnP`qL>mhffOTI|O zNTvPorqM7z*1&7tJ6Sru6_RZ@d<4TCuI7G0Nq#KcCkcxoW27-sSmxQwV%R}(PhX`{ zm01J%Px`1b`#|1IlPa@B_oJv+v#DG<{$Kk0aVqQ2YRT8NHvVjwB2T3aRoEi=zSbxZ zS;~p@O;vV5PNQDc*e^=nOY*PIHp#uU)79DU3bxgMsL8%j1|K8;T5P*gFGo99i|v=o zTCes817X%nGVpVg$7w|!Cbr@;>aeGBTe=p^x*MXTJgsJ3mLsLnE3K4$VmXk895u@mTI=`Y zT9>A*oGkCB&ziAWat_^T#@fmlIhwN&!)xT+zd7q^G~AK%w4H6(E`wWSmf*nyJkT-v zygh4O+U_HvcC(r>niInHlV*pq`VR1$*xCqXtsQ*WGnyI7K5#&edJJTJ z9qEwGL+FaECk8zm2l(t`)VxEH1j}5bxS~E!kJAPCIArkhDHRbNnE&<|d2}w~Gbe`z6!nSDp-n}7 z8sF4%J3}&E+C35C`r|RG@(J6fe3ee;K4E>7+)GroD;uR`{6h&{S%qfZ&cpZhZWc#0v9?)GIFN_0A<_hX0TaP6D^OqKDu+57>l zi`;>J8^Ct+Wht=5c2kuvxEHM&$a={M^mrf(mH*Kif65xkbwo!rn?#ooJsleD^K}?X zvnz>ei4}du9!TE}Vhu4crVe6j<$Q`9%*M;@wJU>JfvmPaEK9U|9IXGGp{$2PSH1O+ zIu2tk)n$il5mpT=5~1==NaQ!;O)SS2u;$}X)N=qIM4JSv?$uHPnVnm68CP({6v5za1!f6nE?$X{x zd=c{&XIJp`lS^y|wLDEU^ClEImYL-sdODVoQtcj@#^E)RDvW2X73mKeFrM}2kvr^l za&9~%D3bgquy#UcPGGxA@$Cr4?POSin&v{uk-QOwO=PLEfqW*h(^heAY7yuAlh`=< zl-6f5h6H(vc0HOY26+elHI1#{NmzWb32MT0RDA~BozB|GFSWoKtgkFbYBRoKt}+hw z#?54p6zwEUnZ;JioXUL7esPO@WE&gKT&1k9SwHzIwTnTo2{7bo3uDmu@=Wc&*{q~2 zm)4Bmuyk2oMi*jPI#*xgY|&)${{phxGLE^?(Kyy!KBu|OWea5-C;MR@hNKkj!94US z`93xJmQ6zqZ2y)umYdSuZ_x+Rsb@T#zH~x3xVdiu#zl#l*~wRGa{x znH^nb!M^_(9$QS5JyxZ?Op~Lp#lLQz8-2amvS%WS$J|k9UXT58&lue`v5K+_<(ps# zaPmoDgDXTC@(SeZ1$RuLXW~OMO`+%FLvMKOKl02-2?=bu9HIr9*#rY@f^JJ$CHiSG z`v}hu7qdEWDlB0e;T&DUI>Rx3$7Z-1kt3$mres>ug?rPQ@7NHzE4}*;wP4hcL`NC! z@@1?!T)MEFT}D%EOl0_Z2_x0{o}IBcm8r~1b|24gRISj!g3-q;afQEL0IY`!_`*eE%Uu5Ms8Y36!XPK}#k z3)-EjO@=>WS&Lpz#~nNcp)4>ZU%QX7klE@3aw_2h;A2thek%EQx(+SO?Yo zaT0r=V2ljj!~&GDm#MpOe|(`$*u;L6WjCs{g^f{$Jf`_uQ1m zM+LS)G0)T%{m3>ca(imLlhtqY3O|z7mjzo%4FbVhvT_+LEsC%oaba1Ts07uvjs zMZ@vk%Th21-Q3GQbQjX)Fg^wCgN(xv-N!D;sZ{M}b^y-JpD{M((~AA<6E$Rnt?Baj zLy?704-KYb94*t>KXMdJJHQsIrH9+%_#b2g9Tdy;`!w$$>n4W0gAf!sNo#o+3po(H zp+}Lgx0Y~}1od9l_&LeNH7&;dQP`fS$p+4eiqEqLt37OG7O>R zr`bomJ$!9CHs>_538t25tcARuzD#4MP_hrxVNTV|fJzjGwy94B9MAan?%rnAT`YEo zX5fbnarFZ9jyX0%OE|-}$&jrkXHoJD8h#c%E>e4R7K>)kku82@oz-Rd#@nH*Zv7R# zC7(*4hf>_HeRiHbQPtE=wkT1T(HTOldLaKY^AVzU1=fZI z8~$Vkn2cx}Zi@E~+HZH5zaj@|Pya@IM5#oA02s$aRKA$Q})Vk$;SH=Wm+Y7b^CY#pzB|BztFKT^}PagAk_dj1m zsN3bS_J%nn@+m%#wcz2fPi-xDBM({bpy2-?DEk6zbvW}sw08#m{vT^8YA>Jp8^o|x z!1}uQA4ST0w_l?r1sGUSWd*Pk6kMchl=(_gl`{WNRw6FrCm{F+`Ks1Vj{9LQ%!rd@PY7JdE6N6>b5AA`R*o0% zRHJCk3A?oi?AD&WGW)w?M@7FaDJ=7PE;aP#0dktw%bPcp`7-=Sm#y|z`S2ccOUm)# zjfIU-miJJMoAKLCLTb*>MG;q*=i$a6s}JNTfFAqu3UrsV0AreBi3sm-+EIZwHa4;P ztRBmn>v4nuQjxDUHo-MZR!M9?dzl4#vuH-iAdp)5$yT}@+8-YH@c5a$a4cx zxpq$KXCs`>rm(fT^+e zS$+OkHm3cnC!KhoRo7-UM1zWQe83;O-hWUe&!HiFjx0CP{%*`KC^CL~t{Ko+GiVM6 zX|~|#wQyT;5AGaGTyFt;GK;xujqMOY}vsb`69VCJ?e-=P?eo{H@m@=WEo`v*Sxki!b(h$s=vwaI+4`BHsyA)o<*l%8%kVVhJ z_{`!eYF1Ak5;O8F_=CaU&CN8?<)BE`yj0`>ZkjO|r?-%b$l1bU!F{~yk#siVo0+=h zW_LYU%FaZ2>x<4p$%F1z24IYM#&=R<-|$JbkAF67^5_p*cxaQsP2v2U7<>Bg)^drFrx6oJhdX#v6@Tte;{rLSI}tol zU7w0im-SijqP~0pG~d5{c}Jmr`|-!dmnU@?K|=&k%mwB_5D`vonj?vs{du%8$QnUR z%(Qv~AoP4+3NY5LJ98iphr+rvkhhdeko%{6yu6aW77k=yI9O2}#D~ZO=olO&?*nHHPn0lJY2bAj2f$3!VVOs7@3gDLQ);kC0&k zWsT+G%6IA1dK|wgch&sH^T|+Vv}6MBrG{*`RbBoB-VgRqpNae<9`~cY{5vK>VLzw* ziM%P#*kxsD-_ij2laNXz^_h&?nn&MF=2!7HdJ6R273v(#Ps8z; zit2%-I+ce8e16B$7jm$o4`DupMM=>Ya$tPp^}kDWZ7Tmpo=F3~oJSHS7Hlhg&9M0wGEL{r z)bI^9=#BRyxuwvDGk6mrhBGi&30q|*_lK&bzi06n*Zue`QI|?fBQE}$KT(W{D|Jty zA49YwbGVOe?11mQtiw)-<`&CK%UF3L|2W#`0eI7Jw zqV~-^G=NxFm=E;~F23cv6n$pP*Yj{33bG064HM$6qTmEH)INL+Ve_Av00F*2mlAjz zq2$fz6J^B*3zjjk34OGX-{a2{?0}Yw0C1xvi_nH$==>sZ0j3tC(ALgB;WG4~SfH-I z1bOXVV28#m;e%nA-de&x7Nh%j5Pc!^OCkFx$TE&~fCaR0If{wuTh4=&v3Il*iCoiH zQC9G(c&7&|_`kwR`kwcdU6Qa@V>WHRKn;K3>xAzQys0d^Yb93mAldzuzFuxyMWc__ z@I7KJe+~cG_wtDUtb66y8SIVIFgb;rtY;`}Eg$XE-4a9Wo7hip(D}8zQiaO)pdv_& z1M5&JEvfZ7UPZ>T|2p2zKQi(^ecR(xxP^xY3NwSnZ&zS z5ec-Kjr`*;ME_z*&(tlm)`=5Y%E)++_`^fVbrY{qT12yYiUYi+q11L052&(v$b0oI z+BeEp;gHcy{J6oeu3VnhejBfA2;4kg!o3_Y8Ko(8;xESD@rZrx<}v>f-c8L-ar2@u zNG;vL-w9o}lTQ#pVn6YfeW#5@j40f@HOpmgL3F4&HenewkG|1iV=ydzubUfoI2f-HD&2f1~iQErMew(956rUU>rjxQm~xy!{KDa6T;BUXJ!b zpf%lth?*7~MGKO7V6`t0M?VL54*BCJf)EG4L{||}&~n&>a}zNyCiBYPwGh*UFVplZ z*vfT^=SWdgcJoHEShU{5-NhPU`@MX-`%f6#%_dj;+<|#%xfFW47o*KSirmLPabG32 zu1uZ8zJLfix{r6jNTdD?YqKAv{0uEuK5;*9CAPix^ZG*b2?v(9aG-18_*5JLMquKE zV)3#iY=L-B^U~Q=MuYfb)X<>h(5E#1gBW-Z00xC39E`sQkbXsacK`|tga1L^Aka(f z4K={xhH08=p5TV2xMYqkeNNvVLG8!Z`$LO62!2G8hj^H>;)&*cn5(jqa+)e0;e8BO z(4do!@agU{E;%uqPU~F;C3|y(w-=>2%F7uRm(QbqM=^DHiY+1>FU9dkz4YH7LP_sfF#isH`1{XXWNadHTg)3y7PV-vD z3w+**A4@}{T&B=8zSq#HLZ0?t8b9Y+ey7-Cdx2hbU@QJJ#OnK{rb932_C;QySsH30 zY>YgnLsktmU6ClR;`b5}6q@B$Jm~%@YH*2HDAgCzmvt4%nqv*GDdG~Z9Wx45mo>k5 zb|-|jF{McIW5Jh5zIFEWBK|GzS^PU@4=du|9VV@a-#fc=5r21Fn<@M|XE%hu2daNi zMqw$_$^AE8R;h4}f_~#4lq$eBR<^6h{u5@?4_P$wH(t58uzmL%4=(O^&WRtt{C>PP zmwDSNiJibfA8%8O9hVjgX{%sU#Y;UVWTZ{@yCA9WX8 zvkF|(EAO}UxGVhQDkD3J>07ine!<788S!0!epIuCDK55a#XRk|E8Imk%tpdDe@71~ z){81%MZ({pZq24H`1D(s?mohAhv;W^zXahoK(J%?J0<+;q!jVX6MiejEX^LT;kEbE z`}`VjE*4&{!F+fBNMHCVDK_MU&hq~Q@yiM2W-9cH_=A5W$I|jYcygT;6>Zx9*JD$X zV_zFR=C^?LYD$Qm=7*3!;$Iis#pZxX!c9RZZeWtJ=uaMJsOgudmHmrXk_{4`LT>Qh zis6oL9xb@V_ZhUu9jn75a4-ei5QUOoe`Ph2KTJSqlA*+`moi{x?x3K19KWxs?YYN2bTxdR&+#pb#&9@E5jIAO$i~;JZf4WK^EBiE)=~g? zAeKomVrTI>vM`?i<>hOy(3_y(?g1BwxHxHZ00(sS2Xkz`J~mwzqAl7v_g^r2UYC_Z zzZ%*6d$FOE&3j@*^UC41g^tg`c!H59htGxQ>l|KP$*ZUNKjdv$%({(Y;$rzbhLgb; z@v-}BQ2ts;3WROGDqfP7Vlp*yw~5_~lDQGr1UgZ*4*6RZGP zl?LH1gHcdaiCmR#%#@^IvnAzRb!;HKUiLRS5l=O z>m;c@Ec;!4s&pN|Na)sK{;D(sYbMusNmA*Hw=;+5{&|W zSG#C}wasL>k?75P3W-GX;a@ind#NrSeCJ>)p#q$!B z3Ui|GUmBzt@aqR(#k~kuV6L3BRCN;ENZ`a@k`uh-Zo|je6A%pKI{41~|2)Xws1Zt;AY?ddic&^_k{LbC zpp-_5qEMoVKfy)#?$vN7EAHD+qA0}kMfljxO5kfGIJT=2_%&85#*S9p>LbIkQA!EH z(AcrE^2ZwV^-3CQ68zJeQt<6`iiFc!D9qb4Rykd@ldh!ZADs_s8UH5h)Dq>0h40ozdG zN!^sdSt!6H6r?$7auRCn0jhq|Sf#{qEH_O;fsVx>gUJYJjD#jnRy@Z*i%mvbxuFUt zqm6_+WrUmZ5*be!?Pd_J_?xoreIZ*s-X_&Wh4Z{sRs?QGF;$rlEEc&mI>Q5bj;ZA@TzbXV4!7X*bB{;)WD$QOsU7Y}jt}6m8 z#I2OQhLM*@ZtvNz$AwZpF6?fpoY^7Z#dwBcUo)4*8ZaH zCv0^N^u}tIO-LhcKx_L8-0Yv7<2pFtRyo0iX-tZ7Ry8vmfLELV*Wqk=z@hgCrGpMQ zx1Zi```N&F9xj55(fj=~2Vi?AzzG0(9w`FUam~)yYi6c19554(zK@G8#G(K1a{>%I zhHeQeKJ4x-1WHnl6P$G1c~d-ez*XDjP&1d3at^HWfA$i7>Ik&ra{mV|%mKH| z2`)L!l3z^m63%u2o^t|RobH^_Jq|cE*`b71MpMo^#l=Xs9DpsI02g0$3Y03Gwb#rP zC%D5^!{&C!F?TosZM|?f7yXTZ`g2V2VA~0+%4z0W52-uvuU=F zJ;ka9CA@goIWX5D!zd>>&wrfbYM!&#Op=a+{cmf3(GA=D58wa?;0-4k;tBy>=Lck2 zTwBe|cffh?eZPQ1V;(x^^q>Q0eVS>pg~?*tg|pC!ZMxC;)rnND!dgfvE&LM|8VRkQE^11w%MO&xGKz_odc zrUC`LW71+!E-0+v{ZTa1j*F41?SH>&k^ypNm?YYP(x*;vvn8(MiVJDF18!Ln9NJ&B z;r~(?(nWjCoGSvf;$WCKW3;&gPSxHopr>qMG&!c2uzl$OZ0Q7e#|A8h+v@}0&1h=k|b6f`pobLe+`ybrdNN}3# z=N$N@127!F1XH|(p8i}~3@Tp2WCvUVaJIZGx&`f@9Oyj5yAHtA_kaw`TF!A^zu9Xh zAGomUTv`XZBM1d-5CrCHSQ!=l|01eZbi>XLz>tH*IR&EtITN;M2V9gBoK(v>ZX0kh zHl3g31i0>h0RMEz@P-pySg`X9U2z?UEkEx=dI9b2FRG?ZJ?Fr74#2J!U|~DzRa)OU zZmI(=4mcq*Hn|ZvsUhsY1`XdAnoSPCBLIpvv(tLMlg zZLcIf#s(l4lw{9`uJ_KWEotkwe$qP)lfbt3o z#wVe@%HcT~-^(d*aR;|#fE#|4Q`3^hR$loieUkg|7nnf*ODXPAsNR0A-%%QU++p6)ZI;S<=abE0(N} zfYc+XAM0P@LN09v?OzBTmxhO{p!=YgAiju8WkErpCZG8(2fYOG?|=sdftr9ifFeL6K~q8VK#8Eup#3rUFAa1RbRYB* z#FrugP!OmIr~@bhG!irwG!K*rO76g=0jSa)*rpQAWh1SIDm?)`ucb=OYpYV%U{#t2 zdR$I^F{gt5UV0Xzzmw7Qs+$4J6!aXfHv3afuS#jTN;=rHmz1-0=OT zw9%glK}#mTGRCSUntdcmf;?MNmomo6jlyQ&6bk6vP9ga}&_r63E@l7|3Tsf@UwICU|xg z+jr|wPvJDo%joY4k(Zuhwa$g^dK&TFrkBypD7r=dc22vzj8%+6MAaRfuHnTs2QN8T z!TOwJZ==5v9Z3q`$*G1n!jg`0Dd{IH$gxbd;p?mY~lqnIw1{-AZ^~ f;F8-e@K};IcpC!^c&2o3V|BygWKNI0jXwVmKUXui diff --git a/android/lib/x86_64/librnpushy.so b/android/lib/x86_64/librnpushy.so index aadb987404de7508c89d5086c0c25ff54ecebe0a..ab06e44d60c214a769f1d464e37e09f92787f620 100755 GIT binary patch delta 156884 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≫!O}*o4WTUUlE7 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 legacyItems = new HashMap<>(legacyCache.getAll()); + legacyItems.putAll(legacy.getAll()); + String json = planner.plan( + StoreSchema.LEGACY_LAYOUT, flatten(legacyItems), flatten(state.getAll())); + if (json == null || "null".equals(json)) { + throw new IllegalStateException("no migration plan"); + } + JSONObject plan = new JSONObject(json); + JSONArray puts = plan.getJSONArray("puts"); + if (puts.length() > 0) { + SharedPreferences.Editor editor = state.edit(); + for (int i = 0; i < puts.length(); i++) { + JSONArray put = puts.getJSONArray(i); + editor.putString(put.getString(0), put.getString(1)); + } + // One commit, so the schema never lands without the items. + if (!editor.commit()) { + Log.e(TAG, "Failed to persist the migrated state store"); + return Result.RETRY; + } + } + JSONArray removes = plan.getJSONArray("removes"); + if (removes.length() > 0) { + SharedPreferences.Editor legacyEditor = legacy.edit(); + SharedPreferences.Editor legacyCacheEditor = legacyCache.edit(); + for (int i = 0; i < removes.length(); i++) { + legacyEditor.remove(removes.getString(i)); + legacyCacheEditor.remove(removes.getString(i)); + } + // A failure only leaves keys nothing reads: the next launch + // removes them again. + boolean removed = legacyEditor.commit(); + if (!legacyCacheEditor.commit() || !removed) { + Log.w(TAG, "Failed to remove the legacy state keys"); + } + } + return plan.optBoolean("migrated") ? Result.MIGRATED : Result.CURRENT; + } catch (Throwable e) { + Log.e(TAG, "State store migration failed", e); + carryUuid(state, legacy); + return Result.FALLBACK; + } + } + + /** + * The migration could not run: start like a fresh install, but keep the + * install's identity (a new uuid would re-bucket every gray release). No + * schema is written, so the next launch runs the whole migration again. + */ + private static void carryUuid(SharedPreferences state, SharedPreferences legacy) { + try { + if (StoreSchema.readString(state, StoreSchema.KEY_UUID) != null) { + return; + } + Object uuid = legacy.getAll().get(StoreSchema.LEGACY_KEY_UUID); + if (uuid instanceof String && !((String) uuid).isEmpty() + && !state.edit().putString(StoreSchema.KEY_UUID, (String) uuid).commit()) { + Log.e(TAG, "Failed to persist the carried uuid"); + } + } catch (Throwable e) { + Log.e(TAG, "Failed to carry the uuid", e); + } + } + + /** + * [key, value, key, value, ...] with every value as text: a legacy + * boolean is "1" / "0" like the new layout's, anything without a text + * form (a string set) is "" — still a key to delete, never a value. + */ + static String[] flatten(Map items) { + String[] flat = new String[items.size() * 2]; + int i = 0; + for (Map.Entry entry : items.entrySet()) { + Object value = entry.getValue(); + flat[i++] = entry.getKey() == null ? "" : entry.getKey(); + if (value instanceof Boolean) { + flat[i++] = (Boolean) value ? StoreSchema.BOOLEAN_TRUE : StoreSchema.BOOLEAN_FALSE; + } else if (value instanceof String || value instanceof Number) { + flat[i++] = value.toString(); + } else { + flat[i++] = ""; + } + } + return flat; + } +} diff --git a/android/src/main/java/cn/reactnative/modules/update/StoreSchema.java b/android/src/main/java/cn/reactnative/modules/update/StoreSchema.java new file mode 100644 index 00000000..3254a117 --- /dev/null +++ b/android/src/main/java/cn/reactnative/modules/update/StoreSchema.java @@ -0,0 +1,129 @@ +package cn.reactnative.modules.update; + +import android.content.SharedPreferences; +import androidx.annotation.Nullable; + +/** + * The persisted layout every platform shares (scripts/contract.ts + * storeSchema): the keys, the two stores, and the State mapping, generated. + * Every value is a string; an empty one is never stored, a boolean is + * BOOLEAN_TRUE / BOOLEAN_FALSE, a marker is BOOLEAN_TRUE while set. The + * state store is written by StoreMigration's one-time move out of the + * legacy layout before anything reads it. + */ +final class StoreSchema { + // (scripts/contract.ts; bun scripts/generate-contract.ts) + static final int VERSION = 1; + static final String KEY_SCHEMA_VERSION = "schemaVersion"; + static final String STATE_STORE = "pushy_state"; + static final String CACHE_STORE = "pushy_cache"; + // A boolean is stored as one of these; anything else (absent) reads as the + // field's fallback. + static final String BOOLEAN_TRUE = "1"; + static final String BOOLEAN_FALSE = "0"; + static final int LEGACY_LAYOUT = 1; + // Carried by hand when the migration itself cannot run. + static final String LEGACY_KEY_UUID = "uuid"; + // The state fields (pushy::state::State). + static final String KEY_PACKAGE_VERSION = "packageVersion"; + static final String KEY_BUILD_TIME = "buildTime"; + static final String KEY_CURRENT_VERSION = "currentVersion"; + static final String KEY_LAST_VERSION = "lastVersion"; + static final String KEY_FIRST_TIME = "firstTime"; + static final String KEY_FIRST_TIME_OK = "firstTimeOk"; + static final String KEY_ROLLED_BACK_VERSION = "rolledBackVersion"; + // Per-version info: name, description, metaInfo and the rescue flags. + static final String KEY_HASH_INFO = "hash_"; + // Set when a launch consumes first_time; getConstants reports and clears + // it. + static final String KEY_FIRST_LOAD_MARKER = "firstLoadMarked"; + // The native round's raw response for the JS side to reuse (§10.3), scoped + // to the exact logical request and native config that produced it. It + // describes versions a reset or an upgrade removes. + static final String KEY_CHECK_CACHE = "nativeCheckResp"; + // Set when a round starts, cleared when it ends (§11.4). Residue on the + // next launch means the previous process died mid-round: that launch + // resumes immediately instead of waiting 5s. + static final String KEY_ROUND_BREADCRUMB = "nativeCheckIncomplete"; + // Identifies the install for gray-release bucketing: must never change. + static final String KEY_UUID = "uuid"; + // The persisted native check config (JS syncNativeConfig or the host) the + // cold-start round and the crash hold run from. + static final String KEY_NATIVE_CONFIG = "nativeConfig"; + // "|" of the embedded bundle: keyed by the binary, + // so it invalidates itself on upgrade. + static final String KEY_BUNDLE_HASH_CACHE = "bundleHashCache"; + // + + private StoreSchema() { + } + + static StateCoreResult readState(SharedPreferences store) { + StateCoreResult state = new StateCoreResult(); + // (scripts/contract.ts; bun scripts/generate-contract.ts) + state.packageVersion = readString(store, KEY_PACKAGE_VERSION); + state.buildTime = readString(store, KEY_BUILD_TIME); + state.currentVersion = readString(store, KEY_CURRENT_VERSION); + state.lastVersion = readString(store, KEY_LAST_VERSION); + state.firstTime = readBoolean(store, KEY_FIRST_TIME, false); + state.firstTimeOk = readBoolean(store, KEY_FIRST_TIME_OK, true); + state.rolledBackVersion = readString(store, KEY_ROLLED_BACK_VERSION); + // + return state; + } + + static void writeState(SharedPreferences.Editor editor, StateCoreResult state) { + // (scripts/contract.ts; bun scripts/generate-contract.ts) + writeString(editor, KEY_PACKAGE_VERSION, state.packageVersion); + writeString(editor, KEY_BUILD_TIME, state.buildTime); + writeString(editor, KEY_CURRENT_VERSION, state.currentVersion); + writeString(editor, KEY_LAST_VERSION, state.lastVersion); + writeBoolean(editor, KEY_FIRST_TIME, state.firstTime); + writeBoolean(editor, KEY_FIRST_TIME_OK, state.firstTimeOk); + writeString(editor, KEY_ROLLED_BACK_VERSION, state.rolledBackVersion); + // + } + + /** The value, or null when absent or empty (the two read the same). */ + @Nullable + static String readString(SharedPreferences store, String key) { + String value = store.getString(key, null); + return value == null || value.isEmpty() ? null : value; + } + + static boolean readBoolean(SharedPreferences store, String key, boolean fallback) { + String value = store.getString(key, null); + if (BOOLEAN_TRUE.equals(value)) { + return true; + } + if (BOOLEAN_FALSE.equals(value)) { + return false; + } + return fallback; + } + + static boolean readMarker(SharedPreferences store, String key) { + return readBoolean(store, key, false); + } + + /** Removes the key for a null or empty value. */ + static void writeString(SharedPreferences.Editor editor, String key, @Nullable String value) { + if (value == null || value.isEmpty()) { + editor.remove(key); + } else { + editor.putString(key, value); + } + } + + static void writeBoolean(SharedPreferences.Editor editor, String key, boolean value) { + editor.putString(key, value ? BOOLEAN_TRUE : BOOLEAN_FALSE); + } + + static void writeMarker(SharedPreferences.Editor editor, String key, boolean set) { + if (set) { + editor.putString(key, BOOLEAN_TRUE); + } else { + editor.remove(key); + } + } +} diff --git a/android/src/main/java/cn/reactnative/modules/update/SyncCoordinator.java b/android/src/main/java/cn/reactnative/modules/update/SyncCoordinator.java index 62025033..c90d291f 100644 --- a/android/src/main/java/cn/reactnative/modules/update/SyncCoordinator.java +++ b/android/src/main/java/cn/reactnative/modules/update/SyncCoordinator.java @@ -34,19 +34,6 @@ final class SyncCoordinator { // Version-info flag read by JS (metadata.ts), stored encoded. private static final String INFO_CRASH_HOLD = Texts.INFO_CRASH_HOLD; - // Shared with Harmony. The response cache lives in its own - // SharedPreferences file (UpdateContext.getNativeCheckCache). - // (scripts/contract.ts; bun scripts/generate-contract.ts) - // The persisted native check config (JS syncNativeConfig or the host). - static final String KEY_CONFIG = "nativeConfig"; - // Raw response cache for the JS side to reuse (§10.3), scoped to the exact - // logical request and native config that produced it. - static final String KEY_RESP_CACHE = "nativeCheckResp"; - // Set when a round starts, cleared when it ends (§11.4). Residue on the - // next launch means the previous process died mid-round: that launch - // resumes immediately instead of waiting 5s. - static final String KEY_ROUND_INCOMPLETE = "nativeCheckIncomplete"; - // // The check response (and a remote queryUrls list) is a small JSON // document; anything bigger is a broken or hijacked endpoint. private static final long MAX_QUERY_RESPONSE_BYTES = 1024 * 1024; @@ -104,7 +91,7 @@ static BundlePreparationResult prepareBundle(UpdateContext context, long timeout if (!nativeReady || sContext != context || !context.getIsUsingBundleUrl()) { return BundlePreparationResult.of(BundlePreparationResult.SKIPPED, "not_initialized"); } - String configJson = context.getKv(KEY_CONFIG); + String configJson = context.getKv(StoreSchema.KEY_NATIVE_CONFIG); BundlePreparationResult rejection = configRejection(configJson); if (rejection != null) { return rejection; @@ -122,7 +109,7 @@ static BundlePreparationResult prepareBundle(UpdateContext context, long timeout } if (roundConfigGeneration != UpdateContext.getNativeConfigGeneration() || !FlowBridge.configsEquivalent(configJson, roundConfigJson) - || !FlowBridge.configsEquivalent(configJson, context.getKv(KEY_CONFIG))) { + || !FlowBridge.configsEquivalent(configJson, context.getKv(StoreSchema.KEY_NATIVE_CONFIG))) { return BundlePreparationResult.of(BundlePreparationResult.CANCELLED, "config_changed"); } if (roundGeneration != UpdateContext.getResetGeneration()) { @@ -148,7 +135,7 @@ static void recordJsRound(String config) { private static boolean hasJsRound(UpdateContext context) { String jsConfig = sJsCompletedConfig; return jsConfig != null - && FlowBridge.configsEquivalent(jsConfig, context.getKv(KEY_CONFIG)); + && FlowBridge.configsEquivalent(jsConfig, context.getKv(StoreSchema.KEY_NATIVE_CONFIG)); } /** @@ -190,7 +177,7 @@ static void schedule(final UpdateContext context, final String launchRolledBackV nativeReady = true; // The crash-hold rescue shares the orchestrator's rollout gate: no // persisted config, no handler (§11.3). - if (context.getKv(KEY_CONFIG) != null) { + if (context.getKv(StoreSchema.KEY_NATIVE_CONFIG) != null) { CrashHold.install(); } Threads.startDaemon("pushy-native-sync", Thread.MIN_PRIORITY + 1, () -> { @@ -198,7 +185,7 @@ static void schedule(final UpdateContext context, final String launchRolledBackV // Keep the check away from the cold-start critical path // (§7 R5) — unless the previous process died mid-round, // in which case every launch second counts (§11.4). - if (context.getKv(KEY_ROUND_INCOMPLETE) == null) { + if (context.getKv(StoreSchema.KEY_ROUND_BREADCRUMB) == null) { Thread.sleep(5000); } if (hasJsRound(context)) { @@ -221,7 +208,7 @@ static boolean isRoundInFlight() { } private static boolean hasRunnableConfig(UpdateContext context) { - return context != null && configRejection(context.getKv(KEY_CONFIG)) == null; + return context != null && configRejection(context.getKv(StoreSchema.KEY_NATIVE_CONFIG)) == null; } static void onConfigured(UpdateContext context) { @@ -298,7 +285,7 @@ private static void activatePendingVersion(UpdateContext context) { return; } String hashInfoJson = null; - String existingInfo = context.getKv("hash_" + hash); + String existingInfo = context.getKv(StoreSchema.KEY_HASH_INFO + hash); if (existingInfo != null) { try { JSONObject info = new JSONObject(existingInfo); @@ -488,7 +475,7 @@ static void runOnce(RoundHost host, long deadlineNanos) throws JSONException { roundGeneration = resetGeneration; roundConfigGeneration = configGeneration; roundResult = BundlePreparationResult.of(BundlePreparationResult.FAILED, "check_failed"); - String configJson = host.getKv(KEY_CONFIG); + String configJson = host.getKv(StoreSchema.KEY_NATIVE_CONFIG); roundConfigJson = configJson; JSONObject event = new JSONObject() @@ -520,7 +507,7 @@ static void runOnce(RoundHost host, long deadlineNanos) throws JSONException { if ("markIncomplete".equals(type)) { marked = true; try { - host.setKv(KEY_ROUND_INCOMPLETE, "1"); + host.setKv(StoreSchema.KEY_ROUND_BREADCRUMB, StoreSchema.BOOLEAN_TRUE); } catch (IllegalStateException ignored) { } } else if ("finish".equals(type)) { @@ -537,8 +524,8 @@ static void runOnce(RoundHost host, long deadlineNanos) throws JSONException { // without committing need the extra write. if (marked) { try { - if (host.getKv(KEY_ROUND_INCOMPLETE) != null) { - host.removeKv(KEY_ROUND_INCOMPLETE); + if (host.getKv(StoreSchema.KEY_ROUND_BREADCRUMB) != null) { + host.removeKv(StoreSchema.KEY_ROUND_BREADCRUMB); } } catch (IllegalStateException ignored) { } @@ -591,7 +578,7 @@ private static JSONObject launchEnv(UpdateContext context, String launchRolledBa env.put("packageVersion", context.getPackageVersion()); // The JS constant's form, so JS can reuse the response cache. env.put("currentVersion", currentVersion == null ? JSONObject.NULL : currentVersion); - env.put("uuid", context.getKv("uuid")); + env.put("uuid", context.getKv(StoreSchema.KEY_UUID)); // Snapshot captured on the launch path before getConstants consumes // the one-shot rollback marker. Reading SharedPreferences here, five // seconds later, would lose the guard and could forceBoot the version diff --git a/android/src/main/java/cn/reactnative/modules/update/UpdateContext.java b/android/src/main/java/cn/reactnative/modules/update/UpdateContext.java index eb7ed521..14a3c2c4 100644 --- a/android/src/main/java/cn/reactnative/modules/update/UpdateContext.java +++ b/android/src/main/java/cn/reactnative/modules/update/UpdateContext.java @@ -23,10 +23,10 @@ public class UpdateContext { private final Context context; private final File rootDir; private final Executor executor; + // The state store and the cache store (StoreSchema): the response cache + // is a whole server response, and keeping it in sp would make every small + // state commit rewrite it. private final SharedPreferences sp; - // The native check's raw response cache (SyncCoordinator.KEY_RESP_CACHE) - // lives in its own file: it is a whole server response, and keeping it in - // sp made every small state commit rewrite it. private final SharedPreferences checkCacheSp; // Our own PackageInfo, looked up once: every getPackageInfo call is a // Binder IPC, and the constructor, the bundle-hash cache and the native @@ -65,7 +65,6 @@ public class UpdateContext { private static final int STATE_OP_CLEAR_ROLLBACK_MARK = 5; private static final int STATE_OP_RESOLVE_LAUNCH = 6; // - static final String KEY_FIRST_LOAD_MARKED = "firstLoadMarked"; // Bumped by resetToPackagedBundle. The cold-start check runs for minutes // and may already hold a decision when the app resets to the packaged // bundle; the orchestrator samples this counter and abandons activation @@ -118,9 +117,19 @@ private UpdateContext(Context context) { throw new IllegalStateException("Failed to create storage root dir: " + rootDir); } - this.sp = this.context.getSharedPreferences(Texts.PREFERENCES_NAME, Context.MODE_PRIVATE); + this.sp = this.context.getSharedPreferences(StoreSchema.STATE_STORE, Context.MODE_PRIVATE); this.checkCacheSp = this.context.getSharedPreferences( - Texts.PREFERENCES_NAME + "_check", Context.MODE_PRIVATE); + StoreSchema.CACHE_STORE, Context.MODE_PRIVATE); + // Before anything reads the state store (the one-time move out of the + // legacy files; a no-op once done). + StoreMigration.Result migration = StoreMigration.run( + sp, + this.context.getSharedPreferences(Texts.PREFERENCES_NAME, Context.MODE_PRIVATE), + this.context.getSharedPreferences(Texts.PREFERENCES_NAME + "_check", Context.MODE_PRIVATE), + StoreMigration.NATIVE); + if (migration != StoreMigration.Result.CURRENT) { + Log.i(TAG, "State store migration: " + migration); + } this.packageInfo = lookupPackageInfo(this.context); this.reactInstanceManager = pendingReactInstanceManager; @@ -140,25 +149,10 @@ private UpdateContext(Context context) { applyState(editor, nextState); persistEditor(editor, "sync state with binary version"); clearNativeCheckCache(); - } else { - migrateNativeCheckCache(); } startBundleHashComputation(); } - // One-time move of the response cache out of the main state file. - private void migrateNativeCheckCache() { - String legacy = sp.getString(SyncCoordinator.KEY_RESP_CACHE, null); - if (legacy == null) { - return; - } - if (checkCacheSp.edit().putString(SyncCoordinator.KEY_RESP_CACHE, legacy).commit()) { - SharedPreferences.Editor editor = sp.edit(); - editor.remove(SyncCoordinator.KEY_RESP_CACHE); - persistEditor(editor, "migrate check cache"); - } - } - public String getRootDir() { return rootDir.toString(); } @@ -190,8 +184,6 @@ public boolean getIsUsingBundleUrl() { // bundleHash cache: "||". The // key identifies the installed binary; every (re)install changes // lastUpdateTime, so the hash is recomputed once per install. - private static final String KEY_BUNDLE_HASH_CACHE = "bundleHashCache"; - public interface BundleHashListener { void onBundleHash(String hash); } @@ -283,14 +275,14 @@ private void publishBundleHash(String hash) { private String loadOrHashBundledAsset() { String cachePrefix = getPackageVersion() + "|" + getPackageLastUpdateTime() + "|"; - String cached = sp.getString(KEY_BUNDLE_HASH_CACHE, null); + String cached = StoreSchema.readString(sp, StoreSchema.KEY_BUNDLE_HASH_CACHE); if (cached != null && cached.startsWith(cachePrefix)) { return cached.substring(cachePrefix.length()); } String hash = sha256OfBundledAsset("index.android.bundle"); if (!hash.isEmpty()) { SharedPreferences.Editor editor = sp.edit(); - editor.putString(KEY_BUNDLE_HASH_CACHE, cachePrefix + hash); + editor.putString(StoreSchema.KEY_BUNDLE_HASH_CACHE, cachePrefix + hash); persistEditor(editor, "cache bundle hash"); } return hash; @@ -415,27 +407,7 @@ DownloadTaskParams downloadPatchFromPpk( } private StateCoreResult getStateSnapshot() { - StateCoreResult state = new StateCoreResult(); - state.packageVersion = sp.getString("packageVersion", null); - state.buildTime = sp.getString("buildTime", null); - state.currentVersion = sp.getString("currentVersion", null); - state.lastVersion = sp.getString("lastVersion", null); - state.firstTime = sp.getBoolean("firstTime", false); - state.firstTimeOk = sp.getBoolean("firstTimeOk", true); - state.rolledBackVersion = sp.getString("rolledBackVersion", null); - return state; - } - - private static void putNullableString( - SharedPreferences.Editor editor, - String key, - String value - ) { - if (value == null) { - editor.remove(key); - } else { - editor.putString(key, value); - } + return StoreSchema.readState(sp); } // Not editor.clear(): that also wiped the uuid (re-bucketing every gray @@ -448,13 +420,7 @@ private void removeKeys(SharedPreferences.Editor editor, java.util.List } private void applyState(SharedPreferences.Editor editor, StateCoreResult state) { - putNullableString(editor, "packageVersion", state.packageVersion); - putNullableString(editor, "buildTime", state.buildTime); - putNullableString(editor, "currentVersion", state.currentVersion); - putNullableString(editor, "lastVersion", state.lastVersion); - editor.putBoolean("firstTime", state.firstTime); - editor.putBoolean("firstTimeOk", state.firstTimeOk); - putNullableString(editor, "rolledBackVersion", state.rolledBackVersion); + StoreSchema.writeState(editor, state); } /** @@ -543,8 +509,9 @@ public void setKv(String key, String value) { persistEditorOrThrow(editor, "set key " + key); } + @Nullable public String getKv(String key) { - return sp.getString(key, null); + return StoreSchema.readString(sp, key); } void removeKv(String key) { @@ -554,7 +521,7 @@ void removeKv(String key) { } public String getCurrentVersion() { - return sp.getString("currentVersion", null); + return StoreSchema.readString(sp, StoreSchema.KEY_CURRENT_VERSION); } /** The one-shot launch markers getConstants reports, consumed together. */ @@ -578,13 +545,13 @@ static final class LaunchMarkers { LaunchMarkers consumeLaunchMarkers() { LaunchMarkers markers; synchronized (commitLock) { - boolean isFirstLoadMarked = sp.getBoolean(KEY_FIRST_LOAD_MARKED, false); + boolean isFirstLoadMarked = StoreSchema.readMarker(sp, StoreSchema.KEY_FIRST_LOAD_MARKER); String rolledBackVersion = rolledBackVersion(); markers = new LaunchMarkers(isFirstLoadMarked, rolledBackVersion); if (isFirstLoadMarked || rolledBackVersion != null) { SharedPreferences.Editor editor = sp.edit(); if (isFirstLoadMarked) { - editor.remove(KEY_FIRST_LOAD_MARKED); + StoreSchema.writeMarker(editor, StoreSchema.KEY_FIRST_LOAD_MARKER, false); } if (rolledBackVersion != null) { applyState(editor, runStateOp(STATE_OP_CLEAR_ROLLBACK_MARK, null)); @@ -604,7 +571,7 @@ LaunchMarkers consumeLaunchMarkers() { } public String rolledBackVersion() { - return sp.getString("rolledBackVersion", null); + return StoreSchema.readString(sp, StoreSchema.KEY_ROLLED_BACK_VERSION); } public void markSuccess() { @@ -616,7 +583,7 @@ public void markSuccess() { SharedPreferences.Editor editor = sp.edit(); applyState(editor, nextState); if (nextState.staleVersionToDelete != null) { - editor.remove("hash_" + nextState.staleVersionToDelete); + editor.remove(StoreSchema.KEY_HASH_INFO + nextState.staleVersionToDelete); } persistEditorOrThrow(editor, "mark success"); } @@ -731,7 +698,7 @@ public String getBundleUrl(String defaultAssetsUrl) { SharedPreferences.Editor editor = sp.edit(); applyState(editor, launchState); if (launchState.consumedFirstTime) { - editor.putBoolean(KEY_FIRST_LOAD_MARKED, true); + StoreSchema.writeMarker(editor, StoreSchema.KEY_FIRST_LOAD_MARKER, true); } persistEditor(editor, "resolve launch"); } @@ -789,7 +756,7 @@ void setNativeConfig(String config) { // re-sending the same config with another key order or trailing // slashes must not cancel an in-flight round or drop its cache. boolean changed = !FlowBridge.configsEquivalent( - config, sp.getString(SyncCoordinator.KEY_CONFIG, null)); + config, StoreSchema.readString(sp, StoreSchema.KEY_NATIVE_CONFIG)); SharedPreferences.Editor editor = sp.edit(); if (changed) { // Also invalidate on a failed persistence attempt: an older @@ -804,11 +771,10 @@ void setNativeConfig(String config) { } // A native-only first launch needs a stable gray-release identity // before JS initializes. Never replace an existing installation ID. - String uuid = sp.getString("uuid", null); - if (uuid == null || uuid.isEmpty()) { - editor.putString("uuid", java.util.UUID.randomUUID().toString()); + if (StoreSchema.readString(sp, StoreSchema.KEY_UUID) == null) { + editor.putString(StoreSchema.KEY_UUID, java.util.UUID.randomUUID().toString()); } - editor.putString(SyncCoordinator.KEY_CONFIG, config); + editor.putString(StoreSchema.KEY_NATIVE_CONFIG, config); // Persist even an equal value: a previous commit may have updated // SharedPreferences memory but failed to write its file. persistEditorOrThrow(editor, "persist configuration"); @@ -864,14 +830,14 @@ private boolean commitSyncResultState( } SharedPreferences.Editor editor = sp.edit(); if (hash != null && hashInfoJson != null) { - editor.putString("hash_" + hash, hashInfoJson); + editor.putString(StoreSchema.KEY_HASH_INFO + hash, hashInfoJson); } if (switching) { applyState(editor, computeSwitchState(hash)); } // The round is over once its result lands: clear the // interrupted-round breadcrumb in the same commit. - editor.remove(SyncCoordinator.KEY_ROUND_INCOMPLETE); + editor.remove(StoreSchema.KEY_ROUND_BREADCRUMB); persistEditorOrThrow(editor, "commit sync result"); if (switching) { ignoreRollback = false; @@ -880,7 +846,7 @@ private boolean commitSyncResultState( // describes, still under commitLock so a reset cannot interleave. if (responseCacheJson != null && !checkCacheSp.edit() - .putString(SyncCoordinator.KEY_RESP_CACHE, responseCacheJson).commit()) { + .putString(StoreSchema.KEY_CHECK_CACHE, responseCacheJson).commit()) { Log.w(TAG, "Failed to persist native sync response cache"); } return true; @@ -910,14 +876,14 @@ private String readBundleSha256(String hash) { /** Raw native check response for JS (§10.3); null when absent. */ @Nullable String getNativeCheckCache() { - return checkCacheSp.getString(SyncCoordinator.KEY_RESP_CACHE, null); + return StoreSchema.readString(checkCacheSp, StoreSchema.KEY_CHECK_CACHE); } private boolean clearNativeCheckCache() { - if (!checkCacheSp.contains(SyncCoordinator.KEY_RESP_CACHE)) { + if (!checkCacheSp.contains(StoreSchema.KEY_CHECK_CACHE)) { return true; } - if (!checkCacheSp.edit().remove(SyncCoordinator.KEY_RESP_CACHE).commit()) { + if (!checkCacheSp.edit().remove(StoreSchema.KEY_CHECK_CACHE).commit()) { Log.e(TAG, "Failed to clear native sync response cache"); return false; } @@ -970,8 +936,8 @@ void runCleanupWithLatestState(CleanupAction action) { final String[] keepNames; synchronized (commitLock) { keepNames = CleanupKeepNames.select( - sp.getString("currentVersion", null), - sp.getString("lastVersion", null), + StoreSchema.readString(sp, StoreSchema.KEY_CURRENT_VERSION), + StoreSchema.readString(sp, StoreSchema.KEY_LAST_VERSION), launchVersion ); } diff --git a/android/src/main/java/cn/reactnative/modules/update/UpdateModule.java b/android/src/main/java/cn/reactnative/modules/update/UpdateModule.java index c0f98055..79294aab 100644 --- a/android/src/main/java/cn/reactnative/modules/update/UpdateModule.java +++ b/android/src/main/java/cn/reactnative/modules/update/UpdateModule.java @@ -49,7 +49,7 @@ protected Map getTypedExportedConstants() { String currentVersion = updateContext.getCurrentVersion(); constants.put("currentVersion", currentVersion); - constants.put("currentVersionInfo", updateContext.getKv("hash_" + currentVersion)); + constants.put("currentVersionInfo", updateContext.getKv(StoreSchema.KEY_HASH_INFO + currentVersion)); // Served from the value cached at launch resolution (no file read on // the JS thread) when currentVersion is the launched version. constants.put("currentBundleSha256", updateContext.currentBundleSha256(currentVersion)); @@ -62,7 +62,7 @@ protected Map getTypedExportedConstants() { constants.put("isFirstTime", markers.isFirstTime); constants.put("rolledBackVersion", markers.rolledBackVersion); - constants.put("uuid", updateContext.getKv("uuid")); + constants.put("uuid", updateContext.getKv(StoreSchema.KEY_UUID)); int supportedDiffVersion = 0; try { supportedDiffVersion = NativeCore.supportedDiffVersion(); @@ -363,7 +363,7 @@ public void setUuid(final String uuid, final Promise promise) { return; } StateSerialRunner.run(STATE_SERIAL, promise, ErrorCodes.FILE_OPERATION_FAILED, "setUuid", () -> { - updateContext.setKv("uuid", uuid); + updateContext.setKv(StoreSchema.KEY_UUID, uuid); promise.resolve(true); }); } @@ -381,7 +381,7 @@ public void setLocalHashInfo(final String hash, final String info, final Promise // A state write that did not reach disk (SharedPreferences commit // false) is FILE_OPERATION_FAILED, distinct from malformed input. StateSerialRunner.run(STATE_SERIAL, promise, ErrorCodes.FILE_OPERATION_FAILED, "setLocalHashInfo", () -> { - updateContext.setKv("hash_" + hash, info); + updateContext.setKv(StoreSchema.KEY_HASH_INFO + hash, info); promise.resolve(true); }); } @@ -392,7 +392,7 @@ public void getLocalHashInfo(final String hash, final Promise promise) { if (requireNonEmpty(hash, "hash", promise) == null) { return; } - String value = updateContext.getKv("hash_" + hash); + String value = updateContext.getKv(StoreSchema.KEY_HASH_INFO + hash); if (value == null || value.isEmpty()) { // No record (iOS resolves nil the same way): JS treats it as {}. // Only a record that exists and is not a JSON object is invalid. diff --git a/android/src/main/java/cn/reactnative/modules/update/VersionScopedKeys.java b/android/src/main/java/cn/reactnative/modules/update/VersionScopedKeys.java index 95d34c69..002390a8 100644 --- a/android/src/main/java/cn/reactnative/modules/update/VersionScopedKeys.java +++ b/android/src/main/java/cn/reactnative/modules/update/VersionScopedKeys.java @@ -14,17 +14,15 @@ * round breadcrumb, the bundle hash cache keyed by package version — survive. */ final class VersionScopedKeys { - static final String HASH_INFO_PREFIX = "hash_"; - // (scripts/contract.ts; bun scripts/generate-contract.ts) - // What a reset to the packaged bundle and a binary upgrade delete besides - // the state fields (scripts/contract.ts storedItems; every other item survives - // both: the uuid, the native config, the round breadcrumb, the bundle hash - // cache). - static final String[] RESET_KEYS = {UpdateContext.KEY_FIRST_LOAD_MARKED, SyncCoordinator.KEY_RESP_CACHE}; - static final String[] RESET_PREFIXES = {HASH_INFO_PREFIX}; - static final String[] UPGRADE_KEYS = {UpdateContext.KEY_FIRST_LOAD_MARKED, SyncCoordinator.KEY_RESP_CACHE}; - static final String[] UPGRADE_PREFIXES = {HASH_INFO_PREFIX}; + // What a reset to the packaged bundle and a binary upgrade delete from the + // state store besides the state fields (scripts/contract.ts storedItems; + // the cache store is cleared on both, every other item survives both: the + // uuid, the native config, the round breadcrumb, the bundle hash cache). + static final String[] RESET_KEYS = {StoreSchema.KEY_FIRST_LOAD_MARKER}; + static final String[] RESET_PREFIXES = {StoreSchema.KEY_HASH_INFO}; + static final String[] UPGRADE_KEYS = {StoreSchema.KEY_FIRST_LOAD_MARKER}; + static final String[] UPGRADE_PREFIXES = {StoreSchema.KEY_HASH_INFO}; // private VersionScopedKeys() { diff --git a/android/src/test/java/cn/reactnative/modules/update/StoreMigrationTest.java b/android/src/test/java/cn/reactnative/modules/update/StoreMigrationTest.java new file mode 100644 index 00000000..b9817861 --- /dev/null +++ b/android/src/test/java/cn/reactnative/modules/update/StoreMigrationTest.java @@ -0,0 +1,358 @@ +package cn.reactnative.modules.update; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import android.content.SharedPreferences; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.Test; + +// The Android side of the persisted layout: StoreSchema's State mapping and +// StoreMigration's IO around the shared core's plan, against +// cpp/patch_core/tests/stored-items-vectors.json. The vectors' plans stand in +// for the core (the .so does not load on the JVM); the legacy values are +// typed as SharedPreferences returns them. +public class StoreMigrationTest { + /** An in-memory SharedPreferences whose commit can be made to fail. */ + static final class FakePrefs implements SharedPreferences { + final Map values = new HashMap<>(); + boolean failCommit; + int commits; + + FakePrefs(Map initial) { + values.putAll(initial); + } + + @Override + public Map getAll() { + return new HashMap<>(values); + } + + @Override + public String getString(String key, String fallback) { + // ClassCastException like the platform for a non-string value. + return values.containsKey(key) ? (String) values.get(key) : fallback; + } + + @Override + public Set getStringSet(String key, Set fallback) { + throw new UnsupportedOperationException(); + } + + @Override + public int getInt(String key, int fallback) { + throw new UnsupportedOperationException(); + } + + @Override + public long getLong(String key, long fallback) { + throw new UnsupportedOperationException(); + } + + @Override + public float getFloat(String key, float fallback) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean getBoolean(String key, boolean fallback) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean contains(String key) { + return values.containsKey(key); + } + + @Override + public Editor edit() { + return new FakeEditor(); + } + + @Override + public void registerOnSharedPreferenceChangeListener( + OnSharedPreferenceChangeListener listener) { + } + + @Override + public void unregisterOnSharedPreferenceChangeListener( + OnSharedPreferenceChangeListener listener) { + } + + final class FakeEditor implements Editor { + private final Map puts = new HashMap<>(); + private final Set removes = new HashSet<>(); + + @Override + public Editor putString(String key, String value) { + puts.put(key, value); + return this; + } + + @Override + public Editor putStringSet(String key, Set value) { + throw new UnsupportedOperationException(); + } + + @Override + public Editor putInt(String key, int value) { + throw new UnsupportedOperationException(); + } + + @Override + public Editor putLong(String key, long value) { + throw new UnsupportedOperationException(); + } + + @Override + public Editor putFloat(String key, float value) { + throw new UnsupportedOperationException(); + } + + @Override + public Editor putBoolean(String key, boolean value) { + throw new UnsupportedOperationException("the layout stores text only"); + } + + @Override + public Editor remove(String key) { + removes.add(key); + return this; + } + + @Override + public Editor clear() { + throw new UnsupportedOperationException("never clear a whole store"); + } + + // Like the platform: memory changes even when the disk write + // fails, and removes apply before puts. + @Override + public boolean commit() { + apply(); + commits++; + return !failCommit; + } + + @Override + public void apply() { + for (String key : removes) { + values.remove(key); + } + values.putAll(puts); + } + } + } + + private static JSONArray vectors() throws IOException, JSONException { + String path = "cpp/patch_core/tests/stored-items-vectors.json"; + File dir = new File(System.getProperty("user.dir")).getAbsoluteFile(); + while (dir != null && !new File(dir, path).isFile()) { + dir = dir.getParentFile(); + } + if (dir == null) { + throw new IOException(path + " not found above " + System.getProperty("user.dir")); + } + return new JSONObject(new String( + Files.readAllBytes(new File(dir, path).toPath()), StandardCharsets.UTF_8)) + .getJSONArray("cases"); + } + + // A vector's legacy values as SharedPreferences holds them. + private static Map typed(JSONObject object) throws JSONException { + Map values = new HashMap<>(); + for (Iterator keys = object.keys(); keys.hasNext(); ) { + String key = keys.next(); + Object value = object.get(key); + if (value instanceof JSONObject || value instanceof JSONArray) { + Set set = new HashSet<>(); + set.add(value.toString()); + value = set; + } + values.put(key, value); + } + return values; + } + + // How the core reads a legacy value (see the vectors' doc). + private static Map text(Map values) { + Map text = new HashMap<>(); + for (Map.Entry entry : values.entrySet()) { + Object value = entry.getValue(); + text.put(entry.getKey(), value instanceof Boolean + ? ((Boolean) value ? "1" : "0") + : value instanceof String || value instanceof Number ? value.toString() : ""); + } + return text; + } + + private static Map pairs(String[] flat) { + Map pairs = new HashMap<>(); + for (int i = 0; i + 1 < flat.length; i += 2) { + pairs.put(flat[i], flat[i + 1]); + } + return pairs; + } + + @Test + public void replaysTheSharedVectors() throws Exception { + JSONArray cases = vectors(); + int replayed = 0; + for (int i = 0; i < cases.length(); i++) { + JSONObject vector = cases.getJSONObject(i); + if (vector.isNull("plan")) { + continue; + } + String name = vector.getString("name"); + Map legacyValues = typed(vector.getJSONObject("legacy")); + // The response cache is the legacy "_check" file's. + Map cacheValues = new HashMap<>(); + Object cache = legacyValues.remove(StoreSchema.KEY_CHECK_CACHE); + if (cache != null) { + cacheValues.put(StoreSchema.KEY_CHECK_CACHE, cache); + } + FakePrefs legacy = new FakePrefs(legacyValues); + FakePrefs legacyCache = new FakePrefs(cacheValues); + FakePrefs state = new FakePrefs(typed(vector.getJSONObject("current"))); + JSONObject plan = vector.getJSONObject("plan"); + final Map wantLegacy = text(typed(vector.getJSONObject("legacy"))); + final Map wantCurrent = text(typed(vector.getJSONObject("current"))); + + StoreMigration.Result result = StoreMigration.run( + state, legacy, legacyCache, (layout, legacyFlat, currentFlat) -> { + assertEquals(name, StoreSchema.LEGACY_LAYOUT, layout); + assertEquals(name, wantLegacy, pairs(legacyFlat)); + assertEquals(name, wantCurrent, pairs(currentFlat)); + return plan.toString(); + }); + + assertEquals(name, plan.getBoolean("migrated") + ? StoreMigration.Result.MIGRATED : StoreMigration.Result.CURRENT, result); + JSONObject after = vector.getJSONObject("after"); + assertEquals(name, typed(after.getJSONObject("current")), state.values); + Map legacyAfter = new HashMap<>(legacy.values); + legacyAfter.putAll(legacyCache.values); + assertEquals(name, text(typed(after.getJSONObject("legacy"))), text(legacyAfter)); + // The puts land in one commit. + assertTrue(name, state.commits <= 1); + replayed++; + } + assertTrue(replayed >= 10); + } + + private static JSONObject firstVector() throws Exception { + return vectors().getJSONObject(0); + } + + @Test + public void theLegacyKeysStayUntilTheStateStoreIsOnDisk() throws Exception { + JSONObject vector = firstVector(); + FakePrefs legacy = new FakePrefs(typed(vector.getJSONObject("legacy"))); + FakePrefs legacyCache = new FakePrefs(new HashMap<>()); + FakePrefs state = new FakePrefs(new HashMap<>()); + state.failCommit = true; + String plan = vector.getJSONObject("plan").toString(); + + assertEquals(StoreMigration.Result.RETRY, + StoreMigration.run(state, legacy, legacyCache, (l, a, b) -> plan)); + assertEquals(typed(vector.getJSONObject("legacy")), legacy.values); + // In memory already: this launch reads the migrated items. + assertEquals("install-uuid", StoreSchema.readString(state, StoreSchema.KEY_UUID)); + } + + @Test + public void aFailedCoreKeepsTheUuidAndRetriesNextLaunch() throws Exception { + JSONObject vector = firstVector(); + FakePrefs legacy = new FakePrefs(typed(vector.getJSONObject("legacy"))); + FakePrefs legacyCache = new FakePrefs(new HashMap<>()); + FakePrefs state = new FakePrefs(new HashMap<>()); + List failures = new ArrayList<>(); + failures.add((l, a, b) -> null); + failures.add((l, a, b) -> "null"); + failures.add((l, a, b) -> { + throw new UnsatisfiedLinkError("no native"); + }); + failures.add((l, a, b) -> "{not json"); + for (StoreMigration.Planner planner : failures) { + state.values.clear(); + assertEquals(StoreMigration.Result.FALLBACK, + StoreMigration.run(state, legacy, legacyCache, planner)); + Map uuidOnly = new HashMap<>(); + uuidOnly.put(StoreSchema.KEY_UUID, "install-uuid"); + assertEquals(uuidOnly, state.values); + assertEquals(typed(vector.getJSONObject("legacy")), legacy.values); + } + String plan = vector.getJSONObject("plan").toString(); + // The core's plan never overwrites what the store holds, so the + // carried uuid is simply kept (the vector's plan is for an empty store). + state.values.clear(); + assertEquals(StoreMigration.Result.MIGRATED, + StoreMigration.run(state, legacy, legacyCache, (l, a, b) -> plan)); + assertEquals(typed(vector.getJSONObject("after").getJSONObject("current")), state.values); + } + + @Test + public void flattenReadsLegacyValuesAsText() { + Map values = new HashMap<>(); + values.put("on", true); + values.put("off", false); + values.put("count", 3); + values.put("text", "x"); + values.put("set", new HashSet()); + Map want = new HashMap<>(); + want.put("on", "1"); + want.put("off", "0"); + want.put("count", "3"); + want.put("text", "x"); + want.put("set", ""); + assertEquals(want, pairs(StoreMigration.flatten(values))); + } + + @Test + public void theStateMappingWritesTextAndReadsItBack() { + FakePrefs store = new FakePrefs(new HashMap<>()); + StateCoreResult empty = StoreSchema.readState(store); + assertNull(empty.currentVersion); + assertFalse(empty.firstTime); + assertTrue(empty.firstTimeOk); + + StateCoreResult state = new StateCoreResult(); + state.packageVersion = "1.0"; + state.buildTime = "28000000"; + state.currentVersion = "b"; + state.lastVersion = ""; + state.firstTime = true; + state.firstTimeOk = false; + SharedPreferences.Editor editor = store.edit(); + StoreSchema.writeState(editor, state); + editor.commit(); + Map want = new HashMap<>(); + want.put("packageVersion", "1.0"); + want.put("buildTime", "28000000"); + want.put("currentVersion", "b"); + want.put("firstTime", "1"); + want.put("firstTimeOk", "0"); + assertEquals(want, store.values); + + StateCoreResult read = StoreSchema.readState(store); + assertEquals("b", read.currentVersion); + assertNull(read.lastVersion); + assertTrue(read.firstTime); + assertFalse(read.firstTimeOk); + } +} diff --git a/android/src/test/java/cn/reactnative/modules/update/SyncRoundReplayTest.java b/android/src/test/java/cn/reactnative/modules/update/SyncRoundReplayTest.java index 4b672fd7..9101c1c5 100644 --- a/android/src/test/java/cn/reactnative/modules/update/SyncRoundReplayTest.java +++ b/android/src/test/java/cn/reactnative/modules/update/SyncRoundReplayTest.java @@ -340,7 +340,7 @@ public void replaysTheRound() throws Exception { JSONObject start = round.start(); String config = start.getString("config"); if (!config.isEmpty()) { - round.kv.put(SyncCoordinator.KEY_CONFIG, config); + round.kv.put(StoreSchema.KEY_NATIVE_CONFIG, config); } double deadline = start.getDouble("deadline"); @@ -407,7 +407,7 @@ public void replaysTheRound() throws Exception { assertFalse(result.isActivated()); } // However the round ends, the breadcrumb does not survive it. - assertFalse(round.kv.containsKey(SyncCoordinator.KEY_ROUND_INCOMPLETE)); + assertFalse(round.kv.containsKey(StoreSchema.KEY_ROUND_BREADCRUMB)); } @Test diff --git a/android/src/test/java/cn/reactnative/modules/update/VersionScopedKeysTest.java b/android/src/test/java/cn/reactnative/modules/update/VersionScopedKeysTest.java index a3f781ef..aa2337da 100644 --- a/android/src/test/java/cn/reactnative/modules/update/VersionScopedKeysTest.java +++ b/android/src/test/java/cn/reactnative/modules/update/VersionScopedKeysTest.java @@ -9,6 +9,7 @@ public class VersionScopedKeysTest { private static final List STORED = Arrays.asList( + "schemaVersion", "uuid", "nativeConfig", "bundleHashCache", @@ -18,14 +19,14 @@ public class VersionScopedKeysTest { "hash_def", "firstLoadMarked", "nativeCheckIncomplete", - "nativeCheckResp", null ); // The round breadcrumb survives both: it only decides whether the next - // launch resumes the round without the start delay. + // launch resumes the round without the start delay. The response cache + // lives in the cache store, which both events clear as a whole. private static final HashSet VERSION_KEYS = new HashSet<>(Arrays.asList( - "hash_abc", "hash_def", "firstLoadMarked", "nativeCheckResp")); + "hash_abc", "hash_def", "firstLoadMarked")); @Test public void resetDropsVersionKeysAndKeepsInstallKeys() { @@ -39,9 +40,9 @@ public void upgradeDropsVersionKeysAndKeepsInstallKeys() { @Test public void keyNamesMatchTheirOwners() { - assertEquals("firstLoadMarked", UpdateContext.KEY_FIRST_LOAD_MARKED); - assertEquals("nativeCheckIncomplete", SyncCoordinator.KEY_ROUND_INCOMPLETE); - assertEquals("nativeCheckResp", SyncCoordinator.KEY_RESP_CACHE); - assertEquals("nativeConfig", SyncCoordinator.KEY_CONFIG); + assertEquals("firstLoadMarked", StoreSchema.KEY_FIRST_LOAD_MARKER); + assertEquals("nativeCheckIncomplete", StoreSchema.KEY_ROUND_BREADCRUMB); + assertEquals("nativeCheckResp", StoreSchema.KEY_CHECK_CACHE); + assertEquals("nativeConfig", StoreSchema.KEY_NATIVE_CONFIG); } } diff --git a/cpp/android_jni/jni_natives.h b/cpp/android_jni/jni_natives.h index 809ae508..f0ae9d31 100644 --- a/cpp/android_jni/jni_natives.h +++ b/cpp/android_jni/jni_natives.h @@ -38,6 +38,7 @@ jlongArray ArchivePlanFreeSpaceProbe(JNIEnv* env, jclass, jlong known_total, jlo jstring ResumePlanRequest(JNIEnv* env, jclass, jstring sidecar, jstring url, jlong partial_size); jstring ResumeClassifyResponse(JNIEnv* env, jclass, jint status, jlong resume_offset, jstring content_range, jstring content_encoding, jlong content_length, jstring sidecar, jstring url, jlong partial_size); jstring ResumeSidecar(JNIEnv* env, jclass, jstring url, jstring etag, jstring last_modified, jstring previous_sidecar, jlong total); +jstring StoredItemsMigrate(JNIEnv* env, jclass, jint legacy_layout, jobjectArray legacy, jobjectArray current); // } // namespace jni_natives diff --git a/cpp/android_jni/jni_registration.cpp b/cpp/android_jni/jni_registration.cpp index e16ec399..ecef9e7d 100644 --- a/cpp/android_jni/jni_registration.cpp +++ b/cpp/android_jni/jni_registration.cpp @@ -94,6 +94,11 @@ const std::vector& NativeClasses() { {"291ef0d4ad8a7a", "723bfed0b88a274923311bb6e5a7826444205fcdf4daae943d432d07e18c93a9887e5a3655c7c2a4949e3355371df78299937648503c43d9d8ae9a68092f0113fd9887857c422602b9d595959c72462c45ebc5afb9d44b412006e2cefd", reinterpret_cast(&pushy::jni_natives::ResumeSidecar)}, }}, + {"3919bbc3ab8a6b512c3e08f0c0b6df60452311edfbc8f780624b2d1de38c93a99565511c07ecdaa496967357", // StoreMigration + { + {"371ef3c3af9f6d7636300efcd29a84684734", "723ecffda48a7e446d331df7d1fca379582e0ae6a5e0949f73592d46eac2aebad544402307e5cffecbb376582012bfc1ab89630e6d2f0afcdca8d7", + reinterpret_cast(&pushy::jni_natives::StoredItemsMigrate)}, + }}, // }; return classes; diff --git a/cpp/android_jni/stored_items_jni.cpp b/cpp/android_jni/stored_items_jni.cpp new file mode 100644 index 00000000..526737a7 --- /dev/null +++ b/cpp/android_jni/stored_items_jni.cpp @@ -0,0 +1,28 @@ +// JNI surface of the persisted-layout migration (cpp/patch_core/ +// stored_items.h) for StoreMigration.java. Flat key/value arrays in, JSON +// text out; a null return means the core threw (memory ran out) and the +// caller falls back to carrying the uuid alone — a C++ exception must never +// unwind through the JNI boundary. +#include + +#include "jni_natives.h" + +#include +#include + +#include "jni_util.h" +#include "../patch_core/stored_items.h" + +using pushy::jni_util::JArrayToVector; +using pushy::jni_util::ToJString; + +jstring pushy::jni_natives::StoredItemsMigrate(JNIEnv* env, jclass, jint legacy_layout, + jobjectArray legacy, jobjectArray current) { + try { + return ToJString(env, pushy::stored::MigrateStoredItemsJson( + static_cast(legacy_layout), JArrayToVector(env, legacy), + JArrayToVector(env, current))); + } catch (...) { + return nullptr; + } +} diff --git a/cpp/patch_core/native_texts.h b/cpp/patch_core/native_texts.h index f8912392..89930549 100644 --- a/cpp/patch_core/native_texts.h +++ b/cpp/patch_core/native_texts.h @@ -63,10 +63,6 @@ inline const std::string& PackageDeltaSuffix() { static const std::string value = text::Reveal("741ee4d0e09b69512137"); return value; } -inline const std::string& PackageUpdatedMarkedKey() { - static const std::string value = text::Reveal("0832d5f29aa549710b0939daf88ca058790f3dded7e888b451640d2ec3f69099bb43711523cafa8ea7bb4372132a"); - return value; -} inline const std::string& LogTag() { static const std::string value = text::Reveal("2812f5d2bac6664436360afc9ba680694b3301"); return value; diff --git a/cpp/patch_core/stored_items.cpp b/cpp/patch_core/stored_items.cpp new file mode 100644 index 00000000..a859d20a --- /dev/null +++ b/cpp/patch_core/stored_items.cpp @@ -0,0 +1,253 @@ +#include "stored_items.h" + +#include + +#include "../update_flow_core/flow_json.h" +#include "obscured_text.h" + +namespace pushy { +namespace stored { +namespace { + +struct Carried { + std::string to; + std::string from; + // A flag: any legacy value means set, stored as "1". + bool marker; +}; + +struct LegacyLayout { + int id; + std::vector carried; + std::vector dropped; + std::vector dropped_prefixes; +}; + +// Built on first use: the keys with update wording are encoded (see +// scripts/encode-native-text.ts) and revealed at run time. +const std::vector& LegacyLayouts() { + static const std::vector* layouts = new std::vector{ + // (scripts/contract.ts; bun scripts/generate-contract.ts) + // Android: SharedPreferences Texts.PREFERENCES_NAME, and its "_check" + // file for the response cache; native booleans. + {kLegacyAndroid, + // Carried: {key, legacy key, marker}. + { + {"uuid", "uuid", false}, + {"nativeConfig", "nativeConfig", false}, + {"nativeCheckIncomplete", "nativeCheckIncomplete", true}, + {"bundleHashCache", "bundleHashCache", false}, + {"packageVersion", "packageVersion", false}, + {"buildTime", "buildTime", false}, + }, + // Dropped. + { + "currentVersion", + "lastVersion", + "firstTime", + "firstTimeOk", + "rolledBackVersion", + "firstLoadMarked", + "nativeCheckResp", + "rolledBack", + "shouldRollback", + "blockUntil", + "blockReason", + }, + {"hash_"}}, + // iOS: standardUserDefaults, shared with the host app: only these keys + // are ours (the unprefixed packageVersion/buildTime that SDKs before + // 10.5x wrote are left alone, they may be the host's). + {kLegacyIos, + // Carried: {key, legacy key, marker}. + { + {"uuid", "REACTNATIVECN_PUSHY_UUID", false}, + {"nativeConfig", "REACTNATIVECN_PUSHY_NATIVE_CONFIG_KEY", false}, + {"nativeCheckIncomplete", "REACTNATIVECN_PUSHY_NATIVE_CHECK_INCOMPLETE_KEY", true}, + {"bundleHashCache", "REACTNATIVECN_PUSHY_BUNDLEHASH_KEY", false}, + {"packageVersion", "REACTNATIVECN_PUSHY_PACKAGEVERSION", false}, + {"buildTime", "REACTNATIVECN_PUSHY_BUILDTIME", false}, + }, + // Dropped. + { + "REACTNATIVECN_PUSHY_INFO_KEY", + "REACTNATIVECN_PUSHY_FIRSTLOADMARKED_KEY", + "REACTNATIVECN_PUSHY_ROLLEDBACKMARKED_KEY", + text::Reveal("0832d5f29aa549710b0939daf88ca058790f3dded7e888b451640d2ec3f69099bb43711523cafa8ea7bb4372132a"), + "REACTNATIVECN_PUSHY_NATIVE_CHECK_RESP_KEY", + text::Reveal("0832d5f29aa549710b0939daf88ca058790f3ddedcf797b6597a1c2dc7f785"), + "REACTNATIVECN_PUSHY_BUNDLEHASH_IDENTITY", + "REACTNATIVECN_PUSHY_BUNDLEHASH_VALUE", + }, + {"REACTNATIVECN_PUSHY_HASH_"}}, + // Harmony: preferences Texts.PREFERENCES_NAME; booleans native or "true". + {kLegacyHarmony, + // Carried: {key, legacy key, marker}. + { + {"uuid", "uuid", false}, + {"nativeConfig", "nativeConfig", false}, + {"nativeCheckIncomplete", "nativeCheckIncomplete", true}, + {"bundleHashCache", "bundleHashCache", false}, + {"packageVersion", "packageVersion", false}, + {"buildTime", "buildTime", false}, + }, + // Dropped. + { + "currentVersion", + "lastVersion", + "firstTime", + "firstTimeOk", + "rolledBackVersion", + "firstLoadMarked", + "nativeCheckResp", + "rolledBack", + "shouldRollback", + "blockUntil", + "blockReason", + }, + {"hash_"}}, + // + }; + return *layouts; +} + +const LegacyLayout* FindLayout(int id) { + for (const LegacyLayout& layout : LegacyLayouts()) { + if (layout.id == id) { + return &layout; + } + } + return nullptr; +} + +bool Owns(const LegacyLayout& layout, const std::string& key) { + for (const Carried& item : layout.carried) { + if (item.from == key) { + return true; + } + } + if (std::find(layout.dropped.begin(), layout.dropped.end(), key) != + layout.dropped.end()) { + return true; + } + for (const std::string& prefix : layout.dropped_prefixes) { + if (key.compare(0, prefix.size(), prefix) == 0) { + return true; + } + } + return false; +} + +// The value of `key`, or "" when absent. +const std::string& Lookup(const Entries& entries, const std::string& key) { + static const std::string* const empty = new std::string(); + for (const auto& entry : entries) { + if (entry.first == key) { + return entry.second; + } + } + return *empty; +} + +Entries Pairs(const std::vector& flat) { + Entries entries; + for (size_t i = 0; i + 1 < flat.size(); i += 2) { + entries.emplace_back(flat[i], flat[i + 1]); + } + return entries; +} + +} // namespace + +int ParseSchemaVersion(const std::string& value) { + // Nine digits at most: no overflow, and no schema will ever get there. + if (value.empty() || value.size() > 9 || value[0] == '0') { + return 0; + } + int version = 0; + for (char c : value) { + if (c < '0' || c > '9') { + return 0; + } + version = version * 10 + (c - '0'); + } + return version; +} + +MigrationPlan MigrateStoredItems(int legacy_layout, const Entries& legacy, + const Entries& current) { + MigrationPlan plan; + const LegacyLayout* layout = FindLayout(legacy_layout); + if (layout == nullptr) { + plan.valid = false; + return plan; + } + const int stored = ParseSchemaVersion(Lookup(current, kSchemaVersionKey)); + if (stored > kSchemaVersion) { + // A later SDK owns the store (the user went back to an older binary): + // read what this one knows, write nothing, delete nothing. + plan.schema_version = stored; + return plan; + } + + // Every legacy key goes, whether this run migrates or an earlier one did: + // a migration killed before its removes, or an older binary the user went + // back to in between, leaves keys that must never be read again. + for (const auto& entry : legacy) { + if (Owns(*layout, entry.first)) { + plan.removes.push_back(entry.first); + } + } + std::sort(plan.removes.begin(), plan.removes.end()); + plan.removes.erase(std::unique(plan.removes.begin(), plan.removes.end()), + plan.removes.end()); + + plan.schema_version = kSchemaVersion; + if (stored == kSchemaVersion) { + return plan; + } + + plan.migrated = true; + for (const Carried& item : layout->carried) { + const std::string& value = Lookup(legacy, item.from); + // The store wins: a value it holds without a schema was written by this + // SDK after an earlier migration attempt that did not reach its schema + // write (or is that attempt's own copy). + if (value.empty() || !Lookup(current, item.to).empty()) { + continue; + } + plan.puts.emplace_back(item.to, item.marker ? std::string("1") : value); + } + plan.puts.emplace_back(kSchemaVersionKey, std::to_string(kSchemaVersion)); + return plan; +} + +std::string MigrateStoredItemsJson(int legacy_layout, + const std::vector& legacy, + const std::vector& current) { + const MigrationPlan plan = + MigrateStoredItems(legacy_layout, Pairs(legacy), Pairs(current)); + if (!plan.valid) { + return "null"; + } + flowjson::Value puts = flowjson::Value::Array(); + for (const auto& put : plan.puts) { + flowjson::Value pair = flowjson::Value::Array(); + pair.Push(flowjson::Value::String(put.first)); + pair.Push(flowjson::Value::String(put.second)); + puts.Push(pair); + } + flowjson::Value removes = flowjson::Value::Array(); + for (const std::string& key : plan.removes) { + removes.Push(flowjson::Value::String(key)); + } + flowjson::Value out = flowjson::Value::Object(); + out.Set("schemaVersion", flowjson::Value::Number(plan.schema_version)); + out.Set("migrated", flowjson::Value::Bool(plan.migrated)); + out.Set("puts", puts); + out.Set("removes", removes); + return flowjson::Stringify(out); +} + +} // namespace stored +} // namespace pushy diff --git a/cpp/patch_core/stored_items.h b/cpp/patch_core/stored_items.h new file mode 100644 index 00000000..135784e9 --- /dev/null +++ b/cpp/patch_core/stored_items.h @@ -0,0 +1,80 @@ +#pragma once + +#include +#include +#include + +// The persisted layout every platform shares (scripts/contract.ts +// storeSchema, stateFields, storedItems) and the one-time move out of the +// layouts SDKs up to 10.61 wrote (legacyLayouts). The hosts keep the IO: +// they snapshot both stores as strings, write the plan's puts, and only once +// those are durable delete the plan's removes from the legacy store. +// tests/stored-items-vectors.json pins this layer and the hosts' adapters. +// +// What is carried over is what a binary upgrade keeps (the uuid, the native +// config, the round breadcrumb, the bundle hash cache) plus the binary +// identity the upgrade is detected from. The new layout only ships in a new +// binary, whose first launch resets every other state field anyway +// (state::SyncBinaryVersion), so the installed version, its info and the +// launch markers are dropped instead of translated. +// +// Keep the core internal to whichever binary links it (see podspec Core). +#pragma GCC visibility push(hidden) + +namespace pushy { +namespace stored { + +// (scripts/contract.ts; bun scripts/generate-contract.ts) +constexpr int kSchemaVersion = 1; +constexpr const char* kSchemaVersionKey = "schemaVersion"; +// The legacy layouts, by the id the hosts pass. +constexpr int kLegacyAndroid = 1; +constexpr int kLegacyIos = 2; +constexpr int kLegacyHarmony = 3; +// + +// Key/value pairs in store order (the hosts' snapshots are unordered maps; +// keys are unique). A value the host cannot read as text (an iOS dictionary) +// is passed as "": it is still a key to delete, never a value to carry. +using Entries = std::vector>; + +struct MigrationPlan { + // False only for an unknown legacy layout id: the host then migrates + // nothing (see the hosts' uuid-only fallback). + bool valid = true; + // The schema the store holds once the plan is applied: kSchemaVersion, or + // a newer one a later SDK wrote, which this SDK leaves alone. + int schema_version = 0; + // The plan carries the one-time migration (the store had no schema). + bool migrated = false; + // Into the state store, in order; schemaVersion is always the last, so a + // host whose writes are not atomic (iOS) never marks a partial migration + // as done. A key the store already holds is never overwritten. + Entries puts; + // From the legacy store, sorted: only keys the legacy layout owns (iOS + // shares its legacy store with the host app). + std::vector removes; +}; + +// The store's own schemaVersion value as a number; 0 when absent or not a +// plain positive decimal. +int ParseSchemaVersion(const std::string& value); + +// Idempotent: re-running it after any prefix of its plan was applied yields +// the rest of that plan. legacy: the legacy store; current: the state store. +MigrationPlan MigrateStoredItems(int legacy_layout, const Entries& legacy, + const Entries& current); + +// For the bindings: flat [key, value, key, value, ...] arrays in (an odd +// trailing key is ignored), JSON out: +// {"schemaVersion":1,"migrated":true,"puts":[["uuid","..."],...], +// "removes":["..."]} +// or "null" for an unknown layout. +std::string MigrateStoredItemsJson(int legacy_layout, + const std::vector& legacy, + const std::vector& current); + +} // namespace stored +} // namespace pushy + +#pragma GCC visibility pop diff --git a/cpp/patch_core/tests/stored-items-vectors.json b/cpp/patch_core/tests/stored-items-vectors.json new file mode 100644 index 00000000..4bd9ef7f --- /dev/null +++ b/cpp/patch_core/tests/stored-items-vectors.json @@ -0,0 +1,653 @@ +{ + "doc": [ + "cpp/patch_core/stored_items.h MigrateStoredItems, and the hosts that apply its plan.", + "layout: the legacy layout (android 1, ios 2, harmony 3; a number is passed as is).", + "legacy values are typed as the legacy store held them: a boolean reads as \"1\"/\"0\",", + "a number as its text, anything else (a dictionary, an array) as \"\" (a key to delete,", + "never a value to carry). plan null: no plan (unknown layout). after: both stores once", + "the puts and then the removes are applied; re-planning there is a no-op." + ], + "cases": [ + { + "name": "android: an installed SDK moves its install items and drops its version state", + "layout": "android", + "legacy": { + "uuid": "install-uuid", + "nativeConfig": "{\"appKey\":\"k\",\"endpoints\":[\"https://a.example/\"]}", + "bundleHashCache": "1.0|1700|abc", + "packageVersion": "1.0", + "buildTime": "28000000", + "currentVersion": "v2", + "lastVersion": "v1", + "firstTime": false, + "firstTimeOk": true, + "rolledBackVersion": "v0", + "firstLoadMarked": true, + "nativeCheckIncomplete": "1", + "nativeCheckResp": "{\"ts\":1,\"body\":\"{}\"}", + "hash_v1": "{\"name\":\"v1\"}", + "hash_v2": "{\"name\":\"v2\"}", + "blockUntil": 0, + "blockReason": "x" + }, + "current": {}, + "plan": { + "schemaVersion": 1, + "migrated": true, + "puts": [ + [ + "uuid", + "install-uuid" + ], + [ + "nativeConfig", + "{\"appKey\":\"k\",\"endpoints\":[\"https://a.example/\"]}" + ], + [ + "nativeCheckIncomplete", + "1" + ], + [ + "bundleHashCache", + "1.0|1700|abc" + ], + [ + "packageVersion", + "1.0" + ], + [ + "buildTime", + "28000000" + ], + [ + "schemaVersion", + "1" + ] + ], + "removes": [ + "blockReason", + "blockUntil", + "buildTime", + "bundleHashCache", + "currentVersion", + "firstLoadMarked", + "firstTime", + "firstTimeOk", + "hash_v1", + "hash_v2", + "lastVersion", + "nativeCheckIncomplete", + "nativeCheckResp", + "nativeConfig", + "packageVersion", + "rolledBackVersion", + "uuid" + ] + }, + "after": { + "legacy": {}, + "current": { + "uuid": "install-uuid", + "nativeConfig": "{\"appKey\":\"k\",\"endpoints\":[\"https://a.example/\"]}", + "nativeCheckIncomplete": "1", + "bundleHashCache": "1.0|1700|abc", + "packageVersion": "1.0", + "buildTime": "28000000", + "schemaVersion": "1" + } + } + }, + { + "name": "android: a fresh install only writes the schema", + "layout": "android", + "legacy": {}, + "current": {}, + "plan": { + "schemaVersion": 1, + "migrated": true, + "puts": [ + [ + "schemaVersion", + "1" + ] + ], + "removes": [] + }, + "after": { + "legacy": {}, + "current": { + "schemaVersion": "1" + } + } + }, + { + "name": "android: keys the legacy layout never wrote are not ours to delete", + "layout": "android", + "legacy": { + "uuid": "install-uuid", + "hostSetting": "kept", + "hash": "not a prefix match" + }, + "current": {}, + "plan": { + "schemaVersion": 1, + "migrated": true, + "puts": [ + [ + "uuid", + "install-uuid" + ], + [ + "schemaVersion", + "1" + ] + ], + "removes": [ + "uuid" + ] + }, + "after": { + "legacy": { + "hostSetting": "kept", + "hash": "not a prefix match" + }, + "current": { + "uuid": "install-uuid", + "schemaVersion": "1" + } + } + }, + { + "name": "android: empty legacy values are deleted, never carried", + "layout": "android", + "legacy": { + "uuid": "", + "nativeConfig": "", + "nativeCheckIncomplete": "", + "packageVersion": "1.0" + }, + "current": {}, + "plan": { + "schemaVersion": 1, + "migrated": true, + "puts": [ + [ + "packageVersion", + "1.0" + ], + [ + "schemaVersion", + "1" + ] + ], + "removes": [ + "nativeCheckIncomplete", + "nativeConfig", + "packageVersion", + "uuid" + ] + }, + "after": { + "legacy": {}, + "current": { + "packageVersion": "1.0", + "schemaVersion": "1" + } + } + }, + { + "name": "android: killed after the puts, the next launch only removes the legacy keys", + "layout": "android", + "legacy": { + "uuid": "install-uuid", + "nativeConfig": "{\"appKey\":\"k\",\"endpoints\":[\"https://a.example/\"]}", + "bundleHashCache": "1.0|1700|abc", + "packageVersion": "1.0", + "buildTime": "28000000", + "currentVersion": "v2", + "lastVersion": "v1", + "firstTime": false, + "firstTimeOk": true, + "rolledBackVersion": "v0", + "firstLoadMarked": true, + "nativeCheckIncomplete": "1", + "nativeCheckResp": "{\"ts\":1,\"body\":\"{}\"}", + "hash_v1": "{\"name\":\"v1\"}", + "hash_v2": "{\"name\":\"v2\"}", + "blockUntil": 0, + "blockReason": "x" + }, + "current": { + "uuid": "install-uuid", + "nativeConfig": "{\"appKey\":\"k\",\"endpoints\":[\"https://a.example/\"]}", + "nativeCheckIncomplete": "1", + "bundleHashCache": "1.0|1700|abc", + "packageVersion": "1.0", + "buildTime": "28000000", + "schemaVersion": "1" + }, + "plan": { + "schemaVersion": 1, + "migrated": false, + "puts": [], + "removes": [ + "blockReason", + "blockUntil", + "buildTime", + "bundleHashCache", + "currentVersion", + "firstLoadMarked", + "firstTime", + "firstTimeOk", + "hash_v1", + "hash_v2", + "lastVersion", + "nativeCheckIncomplete", + "nativeCheckResp", + "nativeConfig", + "packageVersion", + "rolledBackVersion", + "uuid" + ] + }, + "after": { + "legacy": {}, + "current": { + "uuid": "install-uuid", + "nativeConfig": "{\"appKey\":\"k\",\"endpoints\":[\"https://a.example/\"]}", + "nativeCheckIncomplete": "1", + "bundleHashCache": "1.0|1700|abc", + "packageVersion": "1.0", + "buildTime": "28000000", + "schemaVersion": "1" + } + } + }, + { + "name": "android: what an older binary wrote after a downgrade is dropped, the store keeps its uuid", + "layout": "android", + "legacy": { + "uuid": "downgraded-uuid", + "nativeConfig": "{\"appKey\":\"old\"}", + "packageVersion": "0.9", + "buildTime": "27000000", + "currentVersion": "v9", + "firstTime": true, + "firstTimeOk": false, + "hash_v9": "{}" + }, + "current": { + "schemaVersion": "1", + "uuid": "install-uuid", + "nativeConfig": "{\"appKey\":\"k\",\"endpoints\":[\"https://a.example/\"]}", + "packageVersion": "1.0", + "buildTime": "28000000", + "currentVersion": "v2" + }, + "plan": { + "schemaVersion": 1, + "migrated": false, + "puts": [], + "removes": [ + "buildTime", + "currentVersion", + "firstTime", + "firstTimeOk", + "hash_v9", + "nativeConfig", + "packageVersion", + "uuid" + ] + }, + "after": { + "legacy": {}, + "current": { + "schemaVersion": "1", + "uuid": "install-uuid", + "nativeConfig": "{\"appKey\":\"k\",\"endpoints\":[\"https://a.example/\"]}", + "packageVersion": "1.0", + "buildTime": "28000000", + "currentVersion": "v2" + } + } + }, + { + "name": "android: a store a later SDK wrote is left alone, and so is the legacy store", + "layout": "android", + "legacy": { + "uuid": "install-uuid", + "currentVersion": "v2" + }, + "current": { + "schemaVersion": "2", + "uuid": "install-uuid" + }, + "plan": { + "schemaVersion": 2, + "migrated": false, + "puts": [], + "removes": [] + }, + "after": { + "legacy": { + "uuid": "install-uuid", + "currentVersion": "v2" + }, + "current": { + "schemaVersion": "2", + "uuid": "install-uuid" + } + } + }, + { + "name": "ios: the shared defaults lose only the keys an SDK wrote", + "layout": "ios", + "legacy": { + "REACTNATIVECN_PUSHY_UUID": "install-uuid", + "REACTNATIVECN_PUSHY_NATIVE_CONFIG_KEY": "{\"appKey\":\"k\",\"endpoints\":[\"https://a.example/\"]}", + "REACTNATIVECN_PUSHY_NATIVE_CHECK_INCOMPLETE_KEY": true, + "REACTNATIVECN_PUSHY_BUNDLEHASH_KEY": "1.0|9|1700|abc", + "REACTNATIVECN_PUSHY_PACKAGEVERSION": "1.0", + "REACTNATIVECN_PUSHY_BUILDTIME": "1700000000", + "REACTNATIVECN_PUSHY_INFO_KEY": { + "currentVersion": "v2", + "isFirstTime": false, + "isFirstLoadOK": true + }, + "REACTNATIVECN_PUSHY_ROLLEDBACKMARKED_KEY": "v0", + "REACTNATIVECN_PUSHY_FIRSTLOADMARKED_KEY": true, + "REACTNATIVECN_PUSHY_ISPACKAGEUPDATEDMARKED_KEY": true, + "REACTNATIVECN_PUSHY_NATIVE_CHECK_RESP_KEY": "{\"ts\":1,\"body\":\"{}\"}", + "REACTNATIVECN_PUSHY_HASH_v1": "{\"name\":\"v1\"}", + "REACTNATIVECN_PUSHY_HASH_v2": "{\"name\":\"v2\"}", + "packageVersion": "host-owned", + "buildTime": "host-owned", + "AppleLanguages": [ + "en" + ], + "REACTNATIVECN_PUSHY_SOMETHING_ELSE": "not a key any SDK wrote" + }, + "current": {}, + "plan": { + "schemaVersion": 1, + "migrated": true, + "puts": [ + [ + "uuid", + "install-uuid" + ], + [ + "nativeConfig", + "{\"appKey\":\"k\",\"endpoints\":[\"https://a.example/\"]}" + ], + [ + "nativeCheckIncomplete", + "1" + ], + [ + "bundleHashCache", + "1.0|9|1700|abc" + ], + [ + "packageVersion", + "1.0" + ], + [ + "buildTime", + "1700000000" + ], + [ + "schemaVersion", + "1" + ] + ], + "removes": [ + "REACTNATIVECN_PUSHY_BUILDTIME", + "REACTNATIVECN_PUSHY_BUNDLEHASH_KEY", + "REACTNATIVECN_PUSHY_FIRSTLOADMARKED_KEY", + "REACTNATIVECN_PUSHY_HASH_v1", + "REACTNATIVECN_PUSHY_HASH_v2", + "REACTNATIVECN_PUSHY_INFO_KEY", + "REACTNATIVECN_PUSHY_ISPACKAGEUPDATEDMARKED_KEY", + "REACTNATIVECN_PUSHY_NATIVE_CHECK_INCOMPLETE_KEY", + "REACTNATIVECN_PUSHY_NATIVE_CHECK_RESP_KEY", + "REACTNATIVECN_PUSHY_NATIVE_CONFIG_KEY", + "REACTNATIVECN_PUSHY_PACKAGEVERSION", + "REACTNATIVECN_PUSHY_ROLLEDBACKMARKED_KEY", + "REACTNATIVECN_PUSHY_UUID" + ] + }, + "after": { + "legacy": { + "packageVersion": "host-owned", + "buildTime": "host-owned", + "AppleLanguages": [ + "en" + ], + "REACTNATIVECN_PUSHY_SOMETHING_ELSE": "not a key any SDK wrote" + }, + "current": { + "uuid": "install-uuid", + "nativeConfig": "{\"appKey\":\"k\",\"endpoints\":[\"https://a.example/\"]}", + "nativeCheckIncomplete": "1", + "bundleHashCache": "1.0|9|1700|abc", + "packageVersion": "1.0", + "buildTime": "1700000000", + "schemaVersion": "1" + } + } + }, + { + "name": "ios: killed between two puts, the next launch keeps what landed and writes the rest", + "layout": "ios", + "legacy": { + "REACTNATIVECN_PUSHY_UUID": "install-uuid", + "REACTNATIVECN_PUSHY_NATIVE_CONFIG_KEY": "{\"appKey\":\"k\",\"endpoints\":[\"https://a.example/\"]}", + "REACTNATIVECN_PUSHY_NATIVE_CHECK_INCOMPLETE_KEY": true, + "REACTNATIVECN_PUSHY_BUNDLEHASH_KEY": "1.0|9|1700|abc", + "REACTNATIVECN_PUSHY_PACKAGEVERSION": "1.0", + "REACTNATIVECN_PUSHY_BUILDTIME": "1700000000", + "REACTNATIVECN_PUSHY_INFO_KEY": { + "currentVersion": "v2", + "isFirstTime": false, + "isFirstLoadOK": true + }, + "REACTNATIVECN_PUSHY_ROLLEDBACKMARKED_KEY": "v0", + "REACTNATIVECN_PUSHY_FIRSTLOADMARKED_KEY": true, + "REACTNATIVECN_PUSHY_ISPACKAGEUPDATEDMARKED_KEY": true, + "REACTNATIVECN_PUSHY_NATIVE_CHECK_RESP_KEY": "{\"ts\":1,\"body\":\"{}\"}", + "REACTNATIVECN_PUSHY_HASH_v1": "{\"name\":\"v1\"}", + "REACTNATIVECN_PUSHY_HASH_v2": "{\"name\":\"v2\"}" + }, + "current": { + "uuid": "install-uuid", + "nativeConfig": "{\"appKey\":\"k\",\"endpoints\":[\"https://a.example/\"]}" + }, + "plan": { + "schemaVersion": 1, + "migrated": true, + "puts": [ + [ + "nativeCheckIncomplete", + "1" + ], + [ + "bundleHashCache", + "1.0|9|1700|abc" + ], + [ + "packageVersion", + "1.0" + ], + [ + "buildTime", + "1700000000" + ], + [ + "schemaVersion", + "1" + ] + ], + "removes": [ + "REACTNATIVECN_PUSHY_BUILDTIME", + "REACTNATIVECN_PUSHY_BUNDLEHASH_KEY", + "REACTNATIVECN_PUSHY_FIRSTLOADMARKED_KEY", + "REACTNATIVECN_PUSHY_HASH_v1", + "REACTNATIVECN_PUSHY_HASH_v2", + "REACTNATIVECN_PUSHY_INFO_KEY", + "REACTNATIVECN_PUSHY_ISPACKAGEUPDATEDMARKED_KEY", + "REACTNATIVECN_PUSHY_NATIVE_CHECK_INCOMPLETE_KEY", + "REACTNATIVECN_PUSHY_NATIVE_CHECK_RESP_KEY", + "REACTNATIVECN_PUSHY_NATIVE_CONFIG_KEY", + "REACTNATIVECN_PUSHY_PACKAGEVERSION", + "REACTNATIVECN_PUSHY_ROLLEDBACKMARKED_KEY", + "REACTNATIVECN_PUSHY_UUID" + ] + }, + "after": { + "legacy": {}, + "current": { + "uuid": "install-uuid", + "nativeConfig": "{\"appKey\":\"k\",\"endpoints\":[\"https://a.example/\"]}", + "nativeCheckIncomplete": "1", + "bundleHashCache": "1.0|9|1700|abc", + "packageVersion": "1.0", + "buildTime": "1700000000", + "schemaVersion": "1" + } + } + }, + { + "name": "ios: a value this SDK wrote without a schema is newer than the legacy one", + "layout": "ios", + "legacy": { + "REACTNATIVECN_PUSHY_UUID": "install-uuid", + "REACTNATIVECN_PUSHY_NATIVE_CONFIG_KEY": "{\"appKey\":\"old\"}" + }, + "current": { + "schemaVersion": "garbage", + "nativeConfig": "{\"appKey\":\"k\",\"endpoints\":[\"https://a.example/\"]}" + }, + "plan": { + "schemaVersion": 1, + "migrated": true, + "puts": [ + [ + "uuid", + "install-uuid" + ], + [ + "schemaVersion", + "1" + ] + ], + "removes": [ + "REACTNATIVECN_PUSHY_NATIVE_CONFIG_KEY", + "REACTNATIVECN_PUSHY_UUID" + ] + }, + "after": { + "legacy": {}, + "current": { + "schemaVersion": "1", + "nativeConfig": "{\"appKey\":\"k\",\"endpoints\":[\"https://a.example/\"]}", + "uuid": "install-uuid" + } + } + }, + { + "name": "harmony: native and \"true\" booleans are dropped, the install items carried", + "layout": "harmony", + "legacy": { + "uuid": "install-uuid", + "nativeConfig": "{\"appKey\":\"k\",\"endpoints\":[\"https://a.example/\"]}", + "bundleHashCache": "1.0|1700|abc", + "packageVersion": "1.0.0", + "buildTime": "1700000000000", + "currentVersion": "v2", + "firstTime": true, + "firstTimeOk": false, + "firstLoadMarked": "true", + "nativeCheckIncomplete": "1", + "nativeCheckResp": "{}", + "hash_v2": "{\"name\":\"v2\"}" + }, + "current": {}, + "plan": { + "schemaVersion": 1, + "migrated": true, + "puts": [ + [ + "uuid", + "install-uuid" + ], + [ + "nativeConfig", + "{\"appKey\":\"k\",\"endpoints\":[\"https://a.example/\"]}" + ], + [ + "nativeCheckIncomplete", + "1" + ], + [ + "bundleHashCache", + "1.0|1700|abc" + ], + [ + "packageVersion", + "1.0.0" + ], + [ + "buildTime", + "1700000000000" + ], + [ + "schemaVersion", + "1" + ] + ], + "removes": [ + "buildTime", + "bundleHashCache", + "currentVersion", + "firstLoadMarked", + "firstTime", + "firstTimeOk", + "hash_v2", + "nativeCheckIncomplete", + "nativeCheckResp", + "nativeConfig", + "packageVersion", + "uuid" + ] + }, + "after": { + "legacy": {}, + "current": { + "uuid": "install-uuid", + "nativeConfig": "{\"appKey\":\"k\",\"endpoints\":[\"https://a.example/\"]}", + "nativeCheckIncomplete": "1", + "bundleHashCache": "1.0|1700|abc", + "packageVersion": "1.0.0", + "buildTime": "1700000000000", + "schemaVersion": "1" + } + } + }, + { + "name": "an unknown legacy layout has no plan", + "layout": 9, + "legacy": { + "uuid": "install-uuid" + }, + "current": {}, + "plan": null, + "after": { + "legacy": { + "uuid": "install-uuid" + }, + "current": {} + } + } + ] +} diff --git a/cpp/patch_core/tests/stored_items_test.cpp b/cpp/patch_core/tests/stored_items_test.cpp new file mode 100644 index 00000000..c0c56af6 --- /dev/null +++ b/cpp/patch_core/tests/stored_items_test.cpp @@ -0,0 +1,216 @@ +// Replays tests/stored-items-vectors.json through cpp/patch_core/ +// stored_items.h: the plan, the stores once it is applied, and the +// re-entry property every host relies on (a process killed after any prefix +// of the plan finishes the same migration on its next launch). +#include +#include +#include +#include +#include +#include +#include + +#include "../../update_flow_core/flow_json.h" +#include "../stored_items.h" + +namespace { + +using pushy::stored::Entries; +using pushy::stored::MigrationPlan; +using Store = std::map; + +int failures = 0; + +void Check(bool ok, const std::string& what) { + if (!ok) { + std::fprintf(stderr, "[FAIL] %s\n", what.c_str()); + ++failures; + } +} + +int Layout(const flowjson::Value& value) { + if (value.IsNumber()) { + return static_cast(value.AsNumber()); + } + if (value.AsString() == "android") { + return pushy::stored::kLegacyAndroid; + } + if (value.AsString() == "ios") { + return pushy::stored::kLegacyIos; + } + return pushy::stored::kLegacyHarmony; +} + +// A legacy value as the hosts pass it (see the vectors' doc). +std::string Text(const flowjson::Value& value) { + if (value.IsString()) { + return value.AsString(); + } + if (value.IsBool()) { + return value.AsBool() ? "1" : "0"; + } + if (value.IsNumber()) { + return flowjson::Stringify(value); + } + return ""; +} + +Store ToStore(const flowjson::Value& object) { + Store store; + for (const auto& member : object.members()) { + store[member.first] = Text(member.second); + } + return store; +} + +Entries ToEntries(const Store& store) { + return Entries(store.begin(), store.end()); +} + +std::string Describe(const Store& store) { + flowjson::Value object = flowjson::Value::Object(); + for (const auto& entry : store) { + object.Set(entry.first, flowjson::Value::String(entry.second)); + } + return flowjson::Stringify(object); +} + +flowjson::Value PlanJson(const MigrationPlan& plan) { + flowjson::Value puts = flowjson::Value::Array(); + for (const auto& put : plan.puts) { + flowjson::Value pair = flowjson::Value::Array(); + pair.Push(flowjson::Value::String(put.first)); + pair.Push(flowjson::Value::String(put.second)); + puts.Push(pair); + } + flowjson::Value removes = flowjson::Value::Array(); + for (const auto& key : plan.removes) { + removes.Push(flowjson::Value::String(key)); + } + flowjson::Value out = flowjson::Value::Object(); + out.Set("schemaVersion", flowjson::Value::Number(plan.schema_version)); + out.Set("migrated", flowjson::Value::Bool(plan.migrated)); + out.Set("puts", puts); + out.Set("removes", removes); + return out; +} + +// Applies the first `puts` puts and the first `removes` removes. +void Apply(const MigrationPlan& plan, size_t puts, size_t removes, Store* legacy, + Store* current) { + for (size_t i = 0; i < puts && i < plan.puts.size(); ++i) { + (*current)[plan.puts[i].first] = plan.puts[i].second; + } + for (size_t i = 0; i < removes && i < plan.removes.size(); ++i) { + legacy->erase(plan.removes[i]); + } +} + +// Runs the migration to completion from (legacy, current), the way a host +// does across launches. +void Finish(int layout, Store* legacy, Store* current) { + const MigrationPlan plan = + pushy::stored::MigrateStoredItems(layout, ToEntries(*legacy), ToEntries(*current)); + Apply(plan, plan.puts.size(), plan.removes.size(), legacy, current); +} + +std::vector Flat(const Store& store) { + std::vector flat; + for (const auto& entry : store) { + flat.push_back(entry.first); + flat.push_back(entry.second); + } + return flat; +} + +} // namespace + +int main(int argc, char** argv) { + if (argc < 2) { + std::fprintf(stderr, "usage: stored_items_test \n"); + return 2; + } + std::ifstream in(argv[1]); + std::stringstream buffer; + buffer << in.rdbuf(); + bool ok = false; + const flowjson::Value file = flowjson::Parse(buffer.str(), &ok); + if (!ok || !file.IsObject()) { + std::fprintf(stderr, "cannot read %s\n", argv[1]); + return 2; + } + + Check(pushy::stored::ParseSchemaVersion("1") == 1, "schema \"1\""); + Check(pushy::stored::ParseSchemaVersion("12") == 12, "schema \"12\""); + for (const char* bad : {"", "0", "01", "-1", "1.0", " 1", "x", "1234567890"}) { + Check(pushy::stored::ParseSchemaVersion(bad) == 0, + std::string("schema \"") + bad + "\" is not a schema"); + } + + int cases = 0; + for (const auto& c : file.Get("cases").elements()) { + const std::string name = c.Get("name").AsString(); + const int layout = Layout(c.Get("layout")); + const Store legacy = ToStore(c.Get("legacy")); + const Store current = ToStore(c.Get("current")); + const MigrationPlan plan = + pushy::stored::MigrateStoredItems(layout, ToEntries(legacy), ToEntries(current)); + const std::string json = + pushy::stored::MigrateStoredItemsJson(layout, Flat(legacy), Flat(current)); + ++cases; + + if (c.Get("plan").kind() == flowjson::Value::Kind::Null) { + Check(!plan.valid, name + ": expected no plan"); + Check(json == "null", name + ": binding returns " + json); + continue; + } + Check(plan.valid, name + ": expected a plan"); + const std::string got = flowjson::Stringify(PlanJson(plan)); + Check(flowjson::Value::DeepEquals(PlanJson(plan), c.Get("plan")), + name + ": plan " + got); + bool parsed = false; + Check(flowjson::Value::DeepEquals(flowjson::Parse(json, &parsed), c.Get("plan")) && + parsed, + name + ": binding " + json); + if (!plan.puts.empty()) { + Check(plan.puts.back().first == pushy::stored::kSchemaVersionKey, + name + ": the schema is the last put"); + } + + Store after_legacy = legacy; + Store after_current = current; + Apply(plan, plan.puts.size(), plan.removes.size(), &after_legacy, &after_current); + const Store want_legacy = ToStore(c.Get("after").Get("legacy")); + const Store want_current = ToStore(c.Get("after").Get("current")); + Check(after_legacy == want_legacy, name + ": legacy after " + Describe(after_legacy)); + Check(after_current == want_current, + name + ": current after " + Describe(after_current)); + + // Done means done: planning again changes nothing. + const MigrationPlan again = pushy::stored::MigrateStoredItems( + layout, ToEntries(after_legacy), ToEntries(after_current)); + Check(again.puts.empty() && again.removes.empty() && !again.migrated, + name + ": planning again after the plan is not a no-op"); + + // Killed after any prefix of the plan (puts in order, then removes): + // the next launch reaches the same stores. + const size_t steps = plan.puts.size() + plan.removes.size(); + for (size_t step = 0; step < steps; ++step) { + Store l = legacy; + Store s = current; + const size_t puts = std::min(step, plan.puts.size()); + Apply(plan, puts, step - puts, &l, &s); + Finish(layout, &l, &s); + Check(l == want_legacy && s == want_current, + name + ": killed after step " + std::to_string(step) + " ends at " + + Describe(l) + " / " + Describe(s)); + } + } + + if (failures > 0) { + std::fprintf(stderr, "%d stored items check(s) failed\n", failures); + return 1; + } + std::printf("%d stored items vectors passed\n", cases); + return 0; +} diff --git a/docs/STORED_STATE_LAYOUT.md b/docs/STORED_STATE_LAYOUT.md new file mode 100644 index 00000000..e8ab36cd --- /dev/null +++ b/docs/STORED_STATE_LAYOUT.md @@ -0,0 +1,141 @@ +# 持久化落盘布局(schema 1)与一次性迁移 + +> 适用版本:10.61.0 之后的下一个版本起。单一来源是 `scripts/contract.ts` 的 +> `storeSchema` / `stateFields` / `storedItems` / `legacyLayouts`, +> `bun scripts/generate-contract.ts` 生成三端的 key 表、State ↔ 存储映射与 +> C++ 旧布局表;迁移规则是共享内核 `cpp/patch_core/stored_items.h`, +> 向量 `cpp/patch_core/tests/stored-items-vectors.json`。 + +## 1. 统一后的布局 + +三端各有两个**自己的**键值存储,名字相同: + +| 存储 | Android | iOS | 鸿蒙 | 内容 | +| --- | --- | --- | --- | --- | +| `pushy_state` | SharedPreferences 文件 | `NSUserDefaults` suite | preferences | 状态字段与其余各项、`schemaVersion` | +| `pushy_cache` | SharedPreferences 文件 | `NSUserDefaults` suite | preferences | 只有响应缓存 `nativeCheckResp` | + +响应缓存单独放,是因为三端的存储每次落盘都会重写整个文件,整份服务端响应不该 +跟着每一次小的状态提交一起重写(Android 早就这么做,这次三端对齐)。 + +**值的编码**:一律是字符串。布尔值存 `"1"` / `"0"`,缺失时取字段默认值 +(`firstTime` 为 false,`firstTimeOk` 为 true);标记(`firstLoadMarked`、 +`binaryUpgraded`、`nativeCheckIncomplete`)置位时存 `"1"`,清除即删键;空串从不 +落盘(写空串等于删键),所以“缺失”和“空”读起来一样。 + +**键**(三端同名): + +- 状态字段(`pushy::state::State`,由共享状态内核整体改写):`packageVersion`、 + `buildTime`、`currentVersion`、`lastVersion`、`firstTime`、`firstTimeOk`、 + `rolledBackVersion`。 +- `hash_<版本>`:版本元信息;`firstLoadMarked`;`binaryUpgraded`(仅 iOS 使用); + `nativeCheckResp`(缓存存储);`nativeCheckIncomplete`;`uuid`;`nativeConfig`; + `bundleHashCache`;`schemaVersion`(当前为 `"1"`)。 + +reset / 二进制升级各删什么仍由 `storedItems.clearedOn` 决定(与 #687 相同), +缓存存储在两种事件里都整体清掉。 + +## 2. 迁移只搬“升级后本来就保留”的东西 + +新布局只会随新的原生二进制上线(SDK 原生代码变了,必须重新打包)。而三端的 +release 构建每次都会写入新的 buildTime: + +- Android:`android/build.gradle` 的 `pushy_build_time` resValue,release 为构建时的分钟数; +- iOS:podspec 的 “Generate build time” 脚本阶段每次构建 `date +%s`(源码只读时退回 + 安装包里的值,再不行用 Info.plist 的 mtime); +- 鸿蒙:`hvigor-plugin.ts` 在 release 构建时写入当前时间。 + +所以新布局的第一次启动一定会被 `SyncBinaryVersion` 判为二进制升级:当前/上一 +版本、首次加载标记、回滚标记清空,旧热更目录随后被清理。迁移因此只需要搬升级后 +**保留**的项,外加判定升级用的二进制身份: + +| 搬过去 | 为什么 | +| --- | --- | +| `uuid` | 标识安装,灰度分桶依据;变了会重洗分桶 | +| `nativeConfig` | 原生冷启动检测与 crash hold 在 JS 再次运行之前就要用 | +| `nativeCheckIncomplete` | 上次轮次中断时,本次启动不等 5 秒直接续传 | +| `bundleHashCache` | 以二进制身份为键,升级后自然失效,搬过去无害 | +| `packageVersion`、`buildTime` | 让升级照常由 `SyncBinaryVersion` 判定,而不是由迁移强行触发 | + +热更状态(当前版本、版本元信息、首启/回滚标记、响应缓存)**不搬、直接删**。 + +**例外:debug 构建**三端的 buildTime 都固定为 `"0"`,同一台设备上换新 SDK 重新 +debug 构建不会被判为升级;此时迁移后的状态里没有当前版本,启动内置包(热更版本 +需要重新下载)。只影响开发期,且方向是安全的(回到内置包)。iOS 的 +`legacy_migration_same_binary` 用例锁定这一行为。 + +## 3. 迁移规则(`MigrateStoredItems`) + +输入:旧存储与新状态存储的快照(字符串键值;旧存储里的原生布尔读作 `"1"`/`"0"`, +数字读作文本,读不成文本的值——iOS 的旧 info 字典——读作 `""`:要删的键,绝不搬运)。 +输出:`puts`(写入新状态存储,`schemaVersion` 永远最后一个)与 `removes` +(从旧存储删除,已排序)。 + +- 新存储 `schemaVersion` 为当前版本(1):不写入;`removes` 为旧存储里仍然存在的、 + 属于旧布局的键(上次迁移在删键前被杀,或降级期间旧二进制写回的键)。 +- 新存储 `schemaVersion` 更大(未来的 SDK 写的,用户装回了本版本):什么都不做, + 两个存储都不碰,按本版本认识的键读取。 +- 否则(缺失或不是规范的正整数):迁移。旧值非空、且新存储里还没有这个键时才写入 + (**新存储优先**:没有 schema 却已有值,要么是上次未完成迁移写进去的同一个值, + 要么是之后本 SDK 写的更新的值),最后写 `schemaVersion`。 +- 只删旧布局**拥有**的键(`legacyLayouts` 列出的每个 SDK 写过的键与 `hash_` 前缀)。 + iOS 的旧存储是与宿主共用的 `standardUserDefaults`;Android/鸿蒙的旧文件名 + `update` 也很通用,宿主可能自己在用,所以同样只删认识的键。iOS 早期 SDK 写过的 + 无前缀 `packageVersion`/`buildTime` 可能是宿主的,既不读也不删。 + +## 4. 宿主侧的 IO 与崩溃安全 + +三端都在**任何读取状态存储之前**执行迁移:Android 在 `UpdateContext` 构造函数里, +iOS 在 `PushyDefaults()` 的 `dispatch_once` 里,鸿蒙在 `UpdateContext` 构造函数里。 + +| 步骤 | Android | iOS | 鸿蒙 | +| --- | --- | --- | --- | +| 写 puts | 一次 `commit()`(整文件原子写) | 逐个 `setObject:`,schema 最后 | `putSync` 后一次 flush | +| 确认落盘 | `commit()` 返回 true | 写入在返回前已交给 cfprefsd,进程被杀不丢 | flush 成功 | +| 删 removes | 旧主文件与旧 `_check` 文件 | `standardUserDefaults` | 旧 preferences,再 flush | + +- **幂等、可在任一步被杀后重入**:puts 落盘前被杀,旧键都还在,下次重做;iOS 在 + 两个 put 之间被杀,已写的值按“新存储优先”保留、其余补写;puts 落盘后、删键前被杀, + 下次看到 schema 只删旧键。C++ 测试对每个向量的每一个前缀都验证了这一点。 +- **落盘失败**:旧键保留,下次启动重试;本次进程内存里已有迁移结果,照常运行 + (Android 内存里的 schema 会随之后任意一次成功提交一并落盘,下次只剩删旧键)。 +- **迁移本身失败**(内核抛异常、JNI/NAPI 不可用、计划无法解析):按全新安装启动, + 但宿主单独把旧 `uuid` 搬过去;不写 schema,下次启动重做完整迁移。删旧键永远在 + 写入之后,所以任何失败都不会丢掉 uuid(iOS 的 `remove-first` 负向对照验证)。 + +## 5. 降级(用户装回旧二进制) + +- 旧二进制只认旧布局,而旧布局的键已被删除:它表现为**全新安装**——没有热更版本、 + 没有原生配置(JS 运行后 `syncNativeConfig` 会重新写入),`uuid` 由 JS 重新生成, + 降级期间灰度分桶会变。它下载的热更目录与新二进制共用存储根目录,可能被它的清理删掉。 +- 再升级回新二进制:新存储的 schema 还在,不再迁移;降级期间旧二进制写的键全部删除, + `uuid` 恢复为降级前的值(分桶回到原样)。若重新安装的是同一个构建(身份相同), + 状态里的当前版本若目录已被旧二进制清掉,启动解析会回滚到内置包;否则照常判为升级。 +- App Store / 应用市场不允许降级,降级只出现在侧载、`adb install -d`、企业分发等场景; + 为此保留旧 `uuid` 键会违背“迁移完成后删除旧 key”,权衡后不保留。 + +## 6. iOS 改用独立 suite 的取舍 + +改为 `initWithSuiteName:@"pushy_state"` / `@"pushy_cache"`,不再与宿主共用 +`standardUserDefaults`: + +- **避免键冲突**:无前缀的 `packageVersion`/`buildTime` 曾与宿主/三方 SDK 的键撞上, + 每次启动都像换了二进制、把已装热更清掉;独立命名空间后三端可以用同一组无前缀键名。 +- **避免被宿主连带清空**:常见的“退出登录”实现是 + `removePersistentDomainForName:bundleIdentifier`,会把 uuid 与热更状态一起抹掉。 +- **前缀扫描只扫自己的键**:reset / 升级删 `hash_*` 时不再遍历宿主的全部 defaults。 +- 代价:多一个 plist 文件(同在 `Library/Preferences`,备份行为与之前相同); + 隐私清单的 `CA92.1`(仅本应用读写)照样覆盖,不涉及 App Group。迁移需要处理旧键, + 即上面的一次性迁移。 + +## 7. 验证 + +- C++:`scripts/test-patch-core.sh` 的 `stored_items_test`(计划、应用后的两个存储、 + 再次规划为空操作、任一前缀被杀后重入结果一致)。 +- Android:`StoreMigrationTest`(JVM 单测,按向量回放迁移 IO、提交失败保留旧键、 + 内核失败只搬 uuid、State 映射往返)。 +- iOS:`scripts/test-ios-purge-restore.sh` 的 `stored_items_vectors`(真实内核 + + 真实 `PushyMigrateStores`)、`legacy_migration_upgrade` / `_same_binary` / + `_write_failure` / `_read_failure`,负向对照 `skip-carry`、`remove-first`。 +- 鸿蒙:`src/__tests__/harmonyStateLifecycle.test.ts`(按向量回放 `migrateStore`、 + 落盘失败、内核失败、State 映射往返)。 diff --git a/harmony/pushy/src/main/cpp/pushy.cpp b/harmony/pushy/src/main/cpp/pushy.cpp index 8c5d28f9..89369de1 100644 --- a/harmony/pushy/src/main/cpp/pushy.cpp +++ b/harmony/pushy/src/main/cpp/pushy.cpp @@ -24,6 +24,7 @@ #include "resume_plan.h" #include "state_core.h" #include "state_ops.h" +#include "stored_items.h" namespace { @@ -1496,6 +1497,26 @@ static napi_value ResumeSidecar(napi_env env, napi_callback_info info) { static_cast(total))); } +// migrateStoredItems(legacyLayout, legacy[], current[]) -> plan JSON +// (cpp/patch_core/stored_items.h); the flat [key, value, ...] arrays are the +// two stores' snapshots. +static napi_value MigrateStoredItems(napi_env env, napi_callback_info info) { + napi_value args[3] = {nullptr, nullptr, nullptr}; + size_t argc = 3; + if (!GetArgCount(env, info, &argc, args) || argc < 3) { + ThrowError(env, "migrateStoredItems: wrong number of arguments"); + return nullptr; + } + int32_t layout = 0; + std::vector legacy; + std::vector current; + if (!GetInt32(env, args[0], &layout) || !GetStringArray(env, args[1], &legacy) || + !GetStringArray(env, args[2], ¤t)) { + return nullptr; + } + return NewString(env, pushy::stored::MigrateStoredItemsJson(layout, legacy, current)); +} + napi_value Init(napi_env env, napi_value exports) { // (scripts/contract.ts; bun scripts/generate-contract.ts) if (!ExportFunction(env, exports, "syncStateWithBinaryVersion", Guarded) || @@ -1523,7 +1544,8 @@ napi_value Init(napi_env env, napi_value exports) { !ExportFunction(env, exports, "normalizeConfiguration", Guarded) || !ExportFunction(env, exports, "resumePlanRequest", Guarded) || !ExportFunction(env, exports, "resumeClassifyResponse", Guarded) || - !ExportFunction(env, exports, "resumeSidecar", Guarded)) { + !ExportFunction(env, exports, "resumeSidecar", Guarded) || + !ExportFunction(env, exports, "migrateStoredItems", Guarded)) { // return nullptr; } diff --git a/harmony/pushy/src/main/ets/NativePatchCore.ts b/harmony/pushy/src/main/ets/NativePatchCore.ts index fce94758..ccce05c5 100644 --- a/harmony/pushy/src/main/ets/NativePatchCore.ts +++ b/harmony/pushy/src/main/ets/NativePatchCore.ts @@ -221,6 +221,11 @@ interface NativePatchCoreBindings { previousSidecar: string, total: number, ): string; + + // 落盘布局迁移(cpp/patch_core/stored_items.h,与 Android/iOS 共用): + // 旧/新存储的扁平键值数组 [k, v, k, v, ...],返回计划 JSON + // {schemaVersion, migrated, puts, removes};未知布局返回 'null'。IO 在 StoreSchema.ts。 + migrateStoredItems(legacyLayout: number, legacy: string[], current: string[]): string; } export default NativeCore as unknown as NativePatchCoreBindings; diff --git a/harmony/pushy/src/main/ets/PushyTurboModule.ts b/harmony/pushy/src/main/ets/PushyTurboModule.ts index 6380440c..84e671b6 100644 --- a/harmony/pushy/src/main/ets/PushyTurboModule.ts +++ b/harmony/pushy/src/main/ets/PushyTurboModule.ts @@ -8,11 +8,8 @@ import logger from './Logger'; import NativePatchCore from './NativePatchCore'; import { UpdateContext } from './UpdateContext'; import { EventHub } from './EventHub'; -import { - KEY_CONFIG, - recordJsRound, - KEY_RESP_CACHE, -} from './SyncCoordinator'; +import { recordJsRound } from './SyncCoordinator'; +import { KEY_HASH_INFO, KEY_UUID } from './StoreSchema'; import { ERROR_FILE_OPERATION_FAILED, ERROR_INVALID_HASH_INFO, @@ -173,12 +170,12 @@ export class PushyTurboModule extends UITurboModule { const currentVersion = this.context.getCurrentVersion(); const currentVersionInfo = currentVersion - ? this.context.getKv(`hash_${currentVersion}`) + ? this.context.getKv(`${KEY_HASH_INFO}${currentVersion}`) : ''; const currentBundleSha256 = this.context.currentBundleSha256(currentVersion); const isFirstTime = this.context.consumeFirstLoadMarker(); const rolledBackVersion = this.context.rolledBackVersion(); - const uuid = this.context.getKv('uuid'); + const uuid = this.context.getKv(KEY_UUID); const isUsingBundleUrl = this.context.getIsUsingBundleUrl(); if (rolledBackVersion) { @@ -217,7 +214,7 @@ export class PushyTurboModule extends UITurboModule { this.requireHash(hash, 'setLocalHashInfo'); validateHashInfo(info); try { - await this.context.setKv(`hash_${hash}`, info); + await this.context.setKv(`${KEY_HASH_INFO}${hash}`, info); } catch (error) { throw toPushyError(error, ERROR_FILE_OPERATION_FAILED); } @@ -227,7 +224,7 @@ export class PushyTurboModule extends UITurboModule { // 但不是 JSON 对象的记录才是 INVALID_HASH_INFO。 async getLocalHashInfo(hash: string): Promise { this.requireHash(hash, 'getLocalHashInfo'); - const value = this.context.getKv(`hash_${hash}`); + const value = this.context.getKv(`${KEY_HASH_INFO}${hash}`); if (!value) { return ''; } @@ -238,7 +235,7 @@ export class PushyTurboModule extends UITurboModule { async setUuid(uuid: string): Promise { logger.debug(TAG, ',call setUuid'); try { - await this.context.setKv('uuid', uuid); + await this.context.setKv(KEY_UUID, uuid); } catch (error) { throw toPushyError(error, ERROR_FILE_OPERATION_FAILED); } @@ -282,7 +279,7 @@ export class PushyTurboModule extends UITurboModule { // (NATIVE_CHECKUPDATE_DESIGN §10.3)。缺省空串,永不 reject。 async getNativeCheckCache(): Promise { logger.debug(TAG, ',call getNativeCheckCache'); - return this.context.getKv(KEY_RESP_CACHE) ?? ''; + return this.context.getNativeCheckCache(); } async reloadUpdate(options: { hash: string }): Promise { diff --git a/harmony/pushy/src/main/ets/StoreSchema.ts b/harmony/pushy/src/main/ets/StoreSchema.ts new file mode 100644 index 00000000..aba830e2 --- /dev/null +++ b/harmony/pushy/src/main/ets/StoreSchema.ts @@ -0,0 +1,262 @@ +import type { StateCoreResult } from './NativePatchCore'; +import logger from './Logger'; + +// The persisted layout every platform shares (scripts/contract.ts +// storeSchema): the keys, the two stores and the State mapping, generated. +// Every value is a string; an empty one is never stored, a boolean is +// BOOLEAN_TRUE / BOOLEAN_FALSE, a marker is BOOLEAN_TRUE while set. + +// (scripts/contract.ts; bun scripts/generate-contract.ts) +export const SCHEMA_VERSION = 1; +export const KEY_SCHEMA_VERSION = 'schemaVersion'; +export const STATE_STORE = 'pushy_state'; +export const CACHE_STORE = 'pushy_cache'; +// A boolean is stored as one of these; anything else (absent) reads as the +// field's fallback. +export const BOOLEAN_TRUE = '1'; +export const BOOLEAN_FALSE = '0'; +export const LEGACY_LAYOUT = 3; +// Carried by hand when the migration itself cannot run. +export const LEGACY_KEY_UUID = 'uuid'; +// The state fields (pushy::state::State). +export const KEY_PACKAGE_VERSION = 'packageVersion'; +export const KEY_BUILD_TIME = 'buildTime'; +export const KEY_CURRENT_VERSION = 'currentVersion'; +export const KEY_LAST_VERSION = 'lastVersion'; +export const KEY_FIRST_TIME = 'firstTime'; +export const KEY_FIRST_TIME_OK = 'firstTimeOk'; +export const KEY_ROLLED_BACK_VERSION = 'rolledBackVersion'; +// Per-version info: name, description, metaInfo and the rescue flags. +export const KEY_HASH_INFO = 'hash_'; +// Set when a launch consumes first_time; getConstants reports and clears it. +export const KEY_FIRST_LOAD_MARKER = 'firstLoadMarked'; +// The native round's raw response for the JS side to reuse (§10.3), scoped +// to the exact logical request and native config that produced it. It +// describes versions a reset or an upgrade removes. +export const KEY_CHECK_CACHE = 'nativeCheckResp'; +// Set when a round starts, cleared when it ends (§11.4). Residue on the +// next launch means the previous process died mid-round: that launch +// resumes immediately instead of waiting 5s. +export const KEY_ROUND_BREADCRUMB = 'nativeCheckIncomplete'; +// Identifies the install for gray-release bucketing: must never change. +export const KEY_UUID = 'uuid'; +// The persisted native check config (JS syncNativeConfig or the host) the +// cold-start round and the crash hold run from. +export const KEY_NATIVE_CONFIG = 'nativeConfig'; +// "|" of the embedded bundle: keyed by the binary, +// so it invalidates itself on upgrade. +export const KEY_BUNDLE_HASH_CACHE = 'bundleHashCache'; +// + +const TAG = 'PushyStore'; + +/** One store, as text. read returns '' for an absent key. */ +export interface StoreAccess { + read(key: string): string; + write(key: string, value: string): void; + remove(key: string): void; +} + +export function readBoolean( + store: StoreAccess, + key: string, + fallback: boolean, +): boolean { + const value = store.read(key); + if (value === BOOLEAN_TRUE) { + return true; + } + if (value === BOOLEAN_FALSE) { + return false; + } + return fallback; +} + +export function readMarker(store: StoreAccess, key: string): boolean { + return readBoolean(store, key, false); +} + +/** Removes the key for an absent or empty value. */ +export function writeString( + store: StoreAccess, + key: string, + value: string | undefined, +): void { + if (value) { + store.write(key, value); + } else { + store.remove(key); + } +} + +export function writeBoolean( + store: StoreAccess, + key: string, + value: boolean | undefined, +): void { + store.write(key, value ? BOOLEAN_TRUE : BOOLEAN_FALSE); +} + +export function writeMarker(store: StoreAccess, key: string, set: boolean): void { + if (set) { + store.write(key, BOOLEAN_TRUE); + } else { + store.remove(key); + } +} + +export function readState(store: StoreAccess): StateCoreResult { + return { + // (scripts/contract.ts; bun scripts/generate-contract.ts) + packageVersion: store.read(KEY_PACKAGE_VERSION), + buildTime: store.read(KEY_BUILD_TIME), + currentVersion: store.read(KEY_CURRENT_VERSION), + lastVersion: store.read(KEY_LAST_VERSION), + firstTime: readBoolean(store, KEY_FIRST_TIME, false), + firstTimeOk: readBoolean(store, KEY_FIRST_TIME_OK, true), + rolledBackVersion: store.read(KEY_ROLLED_BACK_VERSION), + // + }; +} + +export function writeState(store: StoreAccess, state: StateCoreResult): void { + // (scripts/contract.ts; bun scripts/generate-contract.ts) + writeString(store, KEY_PACKAGE_VERSION, state.packageVersion); + writeString(store, KEY_BUILD_TIME, state.buildTime); + writeString(store, KEY_CURRENT_VERSION, state.currentVersion); + writeString(store, KEY_LAST_VERSION, state.lastVersion); + writeBoolean(store, KEY_FIRST_TIME, state.firstTime); + writeBoolean(store, KEY_FIRST_TIME_OK, state.firstTimeOk); + writeString(store, KEY_ROLLED_BACK_VERSION, state.rolledBackVersion); + // +} + +/** A store's IO for the migration: a snapshot, in-memory writes, a flush. */ +export interface MigrationStore { + snapshot(): Record; + put(key: string, value: string): void; + remove(key: string): void; + /** Resolves once the store is on disk; rejects when it is not. */ + flush(): Promise; +} + +/** NativePatchCore.migrateStoredItems: the plan as JSON, 'null' for an unknown layout. */ +export type MigrationPlanner = ( + legacyLayout: number, + legacy: string[], + current: string[], +) => string; + +interface MigrationPlan { + migrated?: boolean; + puts?: string[][]; + removes?: string[]; +} + +/** + * [key, value, key, value, ...] with every value as text: a legacy boolean + * is '1' / '0' like the new layout's, anything without a text form is '' — + * still a key to delete, never a value. + */ +export function flattenStore(items: Record): string[] { + const flat: string[] = []; + for (const key of Object.keys(items)) { + const value: Object | null | undefined = items[key]; + flat.push(key); + if (typeof value === 'boolean') { + flat.push(value ? BOOLEAN_TRUE : BOOLEAN_FALSE); + } else if (typeof value === 'string' || typeof value === 'number') { + flat.push(String(value)); + } else { + flat.push(''); + } + } + return flat; +} + +/** + * The one-time move from the legacy layout (SDKs up to 10.61: preferences + * Texts.PREFERENCES_NAME, booleans native or 'true') into the state store, + * by the shared core's plan (cpp/patch_core/stored_items.h). The puts land + * in memory at once (everything after this reads them); the legacy keys are + * deleted only once the state store's flush succeeded. Every step is safe to + * repeat, so a process killed anywhere in between finishes the move on its + * next launch. Never throws: a failure leaves a fresh state store (as a new + * install) that still carries the install's uuid. Resolves with what it did + * ('current' | 'migrated' | 'retry' | 'fallback'), for logs and tests. + */ +export function migrateStore( + state: MigrationStore, + legacy: MigrationStore, + planner: MigrationPlanner, +): Promise { + let plan: MigrationPlan; + try { + const text = planner( + LEGACY_LAYOUT, + flattenStore(legacy.snapshot()), + flattenStore(state.snapshot()), + ); + const parsed = JSON.parse(text) as MigrationPlan | null; + if (!parsed || !Array.isArray(parsed.puts) || !Array.isArray(parsed.removes)) { + throw new Error('no migration plan'); + } + plan = parsed; + for (const put of plan.puts ?? []) { + state.put(put[0], put[1]); + } + } catch (error) { + logger.error(TAG, `state store migration failed: ${String(error)}`); + return carryUuid(state, legacy).then(() => 'fallback'); + } + const migrated = plan.migrated === true; + const written = (plan.puts ?? []).length > 0 ? state.flush() : Promise.resolve(); + return written.then( + () => { + const removes = plan.removes ?? []; + if (removes.length === 0) { + return migrated ? 'migrated' : 'current'; + } + for (const key of removes) { + legacy.remove(key); + } + // A failure only leaves keys nothing reads: the next launch removes + // them again. + return legacy.flush().then( + () => (migrated ? 'migrated' : 'current'), + (error: Object) => { + logger.warn(TAG, `failed to remove the legacy keys: ${String(error)}`); + return migrated ? 'migrated' : 'current'; + }, + ); + }, + (error: Object) => { + // The legacy keys stay until the puts are on disk. + logger.error(TAG, `failed to persist the migrated store: ${String(error)}`); + return 'retry'; + }, + ); +} + +// The migration could not run: start like a fresh install, but keep the +// install's identity (a new uuid would re-bucket every gray release). No +// schema is written, so the next launch runs the whole migration again. +function carryUuid(state: MigrationStore, legacy: MigrationStore): Promise { + try { + const current = state.snapshot()[KEY_UUID]; + const uuid = legacy.snapshot()[LEGACY_KEY_UUID]; + if (typeof current === 'string' && current.length > 0) { + return Promise.resolve(); + } + if (typeof uuid !== 'string' || uuid.length === 0) { + return Promise.resolve(); + } + state.put(KEY_UUID, uuid); + return state.flush().catch((error: Object) => { + logger.error(TAG, `failed to persist the carried uuid: ${String(error)}`); + }); + } catch (error) { + logger.error(TAG, `failed to carry the uuid: ${String(error)}`); + return Promise.resolve(); + } +} diff --git a/harmony/pushy/src/main/ets/SyncCoordinator.ts b/harmony/pushy/src/main/ets/SyncCoordinator.ts index cf1ac752..12cbdb59 100644 --- a/harmony/pushy/src/main/ets/SyncCoordinator.ts +++ b/harmony/pushy/src/main/ets/SyncCoordinator.ts @@ -7,6 +7,12 @@ import { BundlePreparationRound, bundlePreparationResult } from './BundlePrepara import type { BundlePreparationResult } from './BundlePreparationResult'; import { monotonicNowMs } from './MonotonicClock'; import { PushyError, getErrorMessage } from './ErrorCodes'; +import { + BOOLEAN_TRUE, + KEY_NATIVE_CONFIG, + KEY_ROUND_BREADCRUMB, + KEY_UUID, +} from './StoreSchema'; // 原生冷启动检测(NATIVE_CHECKUPDATE_DESIGN §10):每进程一次,getBundleUrl // 后延迟数秒运行,完全不依赖 app bundle——坏热更把 JS 砸挂后,下次启动仍能 @@ -17,19 +23,8 @@ import { PushyError, getErrorMessage } from './ErrorCodes'; // 鸿蒙的 debug 门控由触发点天然承担:dev 走 MetroJSBundleProvider, // PushyFileJSBundleProvider.getBundleUrl 不会被调用。 const TAG = 'NativeSync'; -// 与 Android 共用的存储键。鸿蒙不做 crash-hold(errorManager 的同步回调驱动 -// 不了 ArkTS 异步网络 IO),续传 + 零延迟标记是收敛砖机的全部机制。 -// (scripts/contract.ts; bun scripts/generate-contract.ts) -// The persisted native check config (JS syncNativeConfig or the host). -export const KEY_CONFIG = 'nativeConfig'; -// Raw response cache for the JS side to reuse (§10.3), scoped to the exact -// logical request and native config that produced it. -export const KEY_RESP_CACHE = 'nativeCheckResp'; -// Set when a round starts, cleared when it ends (§11.4). Residue on the -// next launch means the previous process died mid-round: that launch -// resumes immediately instead of waiting 5s. -export const KEY_ROUND_INCOMPLETE = 'nativeCheckIncomplete'; -// +// 鸿蒙不做 crash-hold(errorManager 的同步回调驱动不了 ArkTS 异步网络 IO), +// 续传 + 零延迟标记(KEY_ROUND_BREADCRUMB)是收敛砖机的全部机制。 const START_DELAY_MS = 5000; // 本次启动的事实,交给共享内核(cpp/update_flow_core/native_round.h)。 @@ -133,7 +128,7 @@ interface RunnableVerdict { } function readNativeConfig(context: UpdateContext): ConfigRead { - const json = context.getKv(KEY_CONFIG); + const json = context.getKv(KEY_NATIVE_CONFIG); const verdict = JSON.parse(NativePatchCore.runnableConfig(json)) as RunnableVerdict; if (verdict.status !== undefined) { return { @@ -222,7 +217,7 @@ export function scheduleNativeSync( scheduledRollback = launchRolledBackVersion; // 结果本来就是"下次启动生效",延迟几秒让开冷启动关键路径(§7 R5)—— // 除非上个进程死于轮中(残留标记),那时每一秒启动时间都要用来续传。 - const delayMs = context.getKv(KEY_ROUND_INCOMPLETE) ? 0 : START_DELAY_MS; + const delayMs = context.getKv(KEY_ROUND_BREADCRUMB) ? 0 : START_DELAY_MS; setTimeout(() => { if (hasJsRound(context)) { logger.info( @@ -249,7 +244,7 @@ async function runOnce( roundGeneration = resetGeneration; roundConfigGeneration = configGeneration; roundResult = bundlePreparationResult('failed', 'check_failed'); - const configJson = context.getKv(KEY_CONFIG); + const configJson = context.getKv(KEY_NATIVE_CONFIG); roundConfigJson = configJson; let event: RoundEvent = { @@ -276,11 +271,11 @@ async function runOnce( marked = true; logger.info( TAG, - `round started (resume=${!!context.getKv(KEY_ROUND_INCOMPLETE)})`, + `round started (resume=${!!context.getKv(KEY_ROUND_BREADCRUMB)})`, ); // 面包屑只是"下次零延迟"的优化:落盘失败不能阻止救援轮次本身。 try { - await context.setKv(KEY_ROUND_INCOMPLETE, '1'); + await context.setKv(KEY_ROUND_BREADCRUMB, BOOLEAN_TRUE); } catch (e) { logger.warn(TAG, `cannot persist round marker: ${getErrorMessage(e)}`); } @@ -295,7 +290,7 @@ async function runOnce( } finally { if (marked) { try { - await context.removeKv(KEY_ROUND_INCOMPLETE); + await context.removeKv(KEY_ROUND_BREADCRUMB); } catch (e) { // 残留标记只意味着下次启动少等 5 秒。 logger.warn(TAG, `cannot clear round marker: ${getErrorMessage(e)}`); @@ -345,7 +340,7 @@ async function launchEnv( packageVersion: context.getPackageVersion(), // 与 JS 常量同形(无版本时为 ''),JS 才能复用这次请求的响应缓存。 currentVersion: context.getCurrentVersion(), - uuid: context.getKv('uuid') ?? '', + uuid: context.getKv(KEY_UUID) ?? '', // getConstants consumes the persisted rollback marker during startup; use // the launch-path snapshot captured before that happens. rolledBackVersion: launchRolledBackVersion, diff --git a/harmony/pushy/src/main/ets/UpdateContext.ts b/harmony/pushy/src/main/ets/UpdateContext.ts index 158802f2..c1372e3d 100644 --- a/harmony/pushy/src/main/ets/UpdateContext.ts +++ b/harmony/pushy/src/main/ets/UpdateContext.ts @@ -12,12 +12,26 @@ import { DownloadTaskParams } from './DownloadTaskParams'; import { bundleManager } from '@kit.AbilityKit'; import { util } from '@kit.ArkTS'; import logger from './Logger'; +import { recordJsRound, scheduleNativeSync } from './SyncCoordinator'; import { - KEY_CONFIG, - KEY_RESP_CACHE, - recordJsRound, - scheduleNativeSync, -} from './SyncCoordinator'; + CACHE_STORE, + KEY_BUNDLE_HASH_CACHE, + KEY_CHECK_CACHE, + KEY_CURRENT_VERSION, + KEY_FIRST_LOAD_MARKER, + KEY_HASH_INFO, + KEY_LAST_VERSION, + KEY_NATIVE_CONFIG, + KEY_UUID, + MigrationStore, + migrateStore, + readMarker, + readState, + STATE_STORE, + StoreAccess, + writeMarker, + writeState, +} from './StoreSchema'; import NativePatchCore, { STATE_OP_CLEAR_ROLLBACK_MARK, STATE_OP_MARK_SUCCESS, @@ -56,27 +70,23 @@ function nativeConfigsEquivalent(a: string | undefined, b: string | undefined): return NativePatchCore.configsEquivalent(a, b); } -// Per-version info key prefix and the first-load marker key. -const HASH_INFO_PREFIX = 'hash_'; -const FIRST_LOAD_MARKED_KEY = 'firstLoadMarked'; - interface ClearedKeys { keys: string[]; prefixes: string[]; } // (scripts/contract.ts; bun scripts/generate-contract.ts) -// What a reset to the packaged bundle and a binary upgrade delete besides -// the state fields (scripts/contract.ts storedItems; every other item survives -// both: the uuid, the native config, the round breadcrumb, the bundle hash -// cache). +// What a reset to the packaged bundle and a binary upgrade delete from the +// state store besides the state fields (scripts/contract.ts storedItems; +// the cache store is cleared on both, every other item survives both: the +// uuid, the native config, the round breadcrumb, the bundle hash cache). const RESET_CLEARED: ClearedKeys = { - keys: [FIRST_LOAD_MARKED_KEY, KEY_RESP_CACHE], - prefixes: [HASH_INFO_PREFIX], + keys: [KEY_FIRST_LOAD_MARKER], + prefixes: [KEY_HASH_INFO], }; const UPGRADE_CLEARED: ClearedKeys = { - keys: [FIRST_LOAD_MARKED_KEY, KEY_RESP_CACHE], - prefixes: [HASH_INFO_PREFIX], + keys: [KEY_FIRST_LOAD_MARKER], + prefixes: [KEY_HASH_INFO], }; // @@ -89,7 +99,11 @@ interface PersistOptions { export class UpdateContext { private context: common.UIAbilityContext; private rootDir: string; + // The state store and the cache store (StoreSchema): the response cache is + // a whole server response, and keeping it with the state would make every + // small state flush rewrite it. private preferences!: preferences.Preferences; + private cachePreferences!: preferences.Preferences; // 宿主传入的调试标志(RNOH isDebugModeEnabled)。debug 下 markSuccess 空转、 // 不算内嵌 bundle 摘要,与 Android 的 debug 库对齐。HAR 自身没有构建期 // DEBUG 信号(hvigor 不为 HAR 生成 BuildProfile),所以只看宿主。 @@ -144,6 +158,7 @@ export class UpdateContext { logger.error(TAG, `Failed to create root directory: ${getErrorMessage(e)}`); } this.initPreferences(); + this.migrateLegacyStore(); this.trace('ctor'); this.syncStateWithBinaryVersion( this.getPackageVersion(), @@ -164,8 +179,8 @@ export class UpdateContext { ` cv=${snap.currentVersion} lv=${snap.lastVersion}` + ` ft=${snap.firstTime} fto=${snap.firstTimeOk}` + ` rb=${snap.rolledBackVersion}` + - ` flm=${this.readString(FIRST_LOAD_MARKED_KEY)}` + - ` uuidSet=${!!this.readString('uuid')}`, + ` flm=${this.readString(KEY_FIRST_LOAD_MARKER)}` + + ` uuidSet=${!!this.readString(KEY_UUID)}`, ); } @@ -177,7 +192,10 @@ export class UpdateContext { private initPreferences() { try { this.preferences = preferences.getPreferencesSync(this.context, { - name: PREFERENCES_NAME, + name: STATE_STORE, + }); + this.cachePreferences = preferences.getPreferencesSync(this.context, { + name: CACHE_STORE, }); } catch (e) { // Fail fast: a missing preferences store means no state can be persisted, @@ -189,8 +207,53 @@ export class UpdateContext { } } - private optionalPreferencesApi(): OptionalPreferencesApi { - return this.preferences as unknown as OptionalPreferencesApi; + /** + * 一次性把旧布局(PREFERENCES_NAME)迁入状态存储,在任何读取之前执行;完成后 + * 为空操作。puts 立即写入内存(之后的读取都能看到),旧键在状态存储落盘成功后 + * 才删除;失败时按全新安装启动,但保住 uuid(见 StoreSchema.migrateStore)。 + */ + private migrateLegacyStore(): void { + let legacy: preferences.Preferences; + try { + legacy = preferences.getPreferencesSync(this.context, { + name: PREFERENCES_NAME, + }); + } catch (e) { + // 读不到旧存储就当作全新安装。 + logger.error(TAG, `Failed to open the legacy store: ${getErrorMessage(e)}`); + return; + } + const state = this.migrationStore(this.preferences, 'state store'); + migrateStore( + state, + this.migrationStore(legacy, 'legacy store'), + NativePatchCore.migrateStoredItems, + ).then(result => { + if (result !== 'current') { + logger.info(TAG, `state store migration: ${result}`); + } + }); + } + + private migrationStore( + store: preferences.Preferences, + name: string, + ): MigrationStore { + return { + snapshot: () => store.getAllSync() as Record, + put: (key: string, value: string) => store.putSync(key, value), + remove: (key: string) => store.deleteSync(key), + flush: () => this.flushStore(store, `migrate ${name}`), + }; + } + + /** 状态存储的文本视图(StoreSchema 的读写映射)。 */ + private stateAccess(): StoreAccess { + return { + read: (key: string) => this.readString(key), + write: (key: string, value: string) => this.preferences.putSync(key, value), + remove: (key: string) => this.preferences.deleteSync(key), + }; } private getBundleFlags(): bundleManager.BundleFlag { @@ -267,30 +330,6 @@ export class UpdateContext { return ''; } - private readBoolean(key: string, defaultValue: boolean): boolean { - const value = this.preferences.getSync(key, defaultValue) as - | string - | boolean - | number - | null - | undefined; - if (typeof value === 'boolean') { - return value; - } - if (typeof value === 'string') { - if (value === 'true') { - return true; - } - if (value === 'false') { - return false; - } - } - if (typeof value === 'number') { - return value !== 0; - } - return defaultValue; - } - // >0 while a multi-write commit is open: putSync/deleteSync still apply in // memory, the single flush happens when the outermost batch closes. The // cold-start round's three writes (hash info, activation, response cache) @@ -322,7 +361,12 @@ export class UpdateContext { if (this.flushBatchDepth > 0) { return Promise.resolve(); } - const api = this.optionalPreferencesApi(); + return this.flushStore(this.preferences, reason); + } + + /** 落盘一个存储(见 flushPreferences),不受批次影响。 */ + private flushStore(store: preferences.Preferences, reason: string): Promise { + const api = store as unknown as OptionalPreferencesApi; if (typeof api.flushSync === 'function') { try { api.flushSync(); @@ -336,7 +380,7 @@ export class UpdateContext { // fall through to the async flush rather than failing outright } } - return this.preferences.flush().then( + return store.flush().then( () => undefined, (error: Object) => { logger.error( @@ -354,48 +398,26 @@ export class UpdateContext { }); } - private putNullableString(key: string, value?: string): void { - if (value) { - this.preferences.putSync(key, value); - return; - } - this.preferences.deleteSync(key); - } - private getBundlePath(hash: string): string { return `${this.rootDir}/${hash}/${HARMONY_BUNDLE_FILE_NAME}`; } private getStateSnapshot(): StateCoreResult { - return { - packageVersion: this.readString('packageVersion'), - buildTime: this.readString('buildTime'), - currentVersion: this.readString('currentVersion'), - lastVersion: this.readString('lastVersion'), - firstTime: this.readBoolean('firstTime', false), - firstTimeOk: this.readBoolean('firstTimeOk', true), - rolledBackVersion: this.readString('rolledBackVersion'), - }; + return readState(this.stateAccess()); } private applyState(state: StateCoreResult): void { - this.putNullableString('packageVersion', state.packageVersion); - this.putNullableString('buildTime', state.buildTime); - this.putNullableString('currentVersion', state.currentVersion); - this.putNullableString('lastVersion', state.lastVersion); - this.preferences.putSync('firstTime', !!state.firstTime); - this.preferences.putSync('firstTimeOk', state.firstTimeOk !== false); - this.putNullableString('rolledBackVersion', state.rolledBackVersion); + writeState(this.stateAccess(), state); } /** 内存写入(不落盘):状态字段 + 可选的陈旧 hash / 首载标记 / 清理。 */ private writeState(state: StateCoreResult, options: PersistOptions): void { this.applyState(state); if (options.removeStaleHash && state.staleVersionToDelete) { - this.preferences.deleteSync(`hash_${state.staleVersionToDelete}`); + this.preferences.deleteSync(`${KEY_HASH_INFO}${state.staleVersionToDelete}`); } if (options.markFirstLoadMarker) { - this.preferences.putSync(FIRST_LOAD_MARKED_KEY, 'true'); + writeMarker(this.stateAccess(), KEY_FIRST_LOAD_MARKER, true); } if (options.cleanUp) { this.cleanUp(); @@ -570,6 +592,22 @@ export class UpdateContext { this.removeKeys(UPGRADE_CLEARED, 'binary upgrade'); this.writeState(nextState, {}); this.flushInBackground('sync binary version'); + this.clearCheckCache('binary upgrade').catch(() => { + // 已在 flushStore 里记录。 + }); + } + + /** 原生轮次的原始响应缓存(§10.3);没有时为 ''。 */ + public getNativeCheckCache(): string { + const value = this.cachePreferences.getSync(KEY_CHECK_CACHE, ''); + return typeof value === 'string' ? value : ''; + } + + // 删除响应缓存:它描述的版本刚被 reset / 升级 / 配置更换作废。内存里立即 + // 生效,返回落盘的 promise。 + private clearCheckCache(reason: string): Promise { + this.cachePreferences.deleteSync(KEY_CHECK_CACHE); + return this.flushStore(this.cachePreferences, `clear check cache (${reason})`); } private static nativeConfigGeneration: number = 0; @@ -580,7 +618,7 @@ export class UpdateContext { /** 与持久化的配置是否等价(C1)。 */ public isStoredNativeConfig(config: string | undefined): boolean { - return nativeConfigsEquivalent(config, this.getKv(KEY_CONFIG)); + return nativeConfigsEquivalent(config, this.getKv(KEY_NATIVE_CONFIG)); } /** @@ -589,18 +627,22 @@ export class UpdateContext { * response cache and generations stay as they are. */ public setNativeConfig(config: string): Promise { - if (!this.getKv('uuid')) { - this.preferences.putSync('uuid', util.generateRandomUUID()); + if (!this.getKv(KEY_UUID)) { + this.preferences.putSync(KEY_UUID, util.generateRandomUUID()); } - const current = this.getKv(KEY_CONFIG); + const current = this.getKv(KEY_NATIVE_CONFIG); // Byte-identical is trivially no change, even for a value C1 cannot parse. if (!current || (current !== config && !nativeConfigsEquivalent(current, config))) { // Also guards A -> B -> A replacements and late download commits. UpdateContext.resetGeneration += 1; UpdateContext.nativeConfigGeneration += 1; - this.preferences.putSync(KEY_CONFIG, config); - this.preferences.deleteSync(KEY_RESP_CACHE); + this.preferences.putSync(KEY_NATIVE_CONFIG, config); recordJsRound(''); + // Flush even an equal value so a retry after a storage error can succeed. + return Promise.all([ + this.flushPreferences('persist configuration'), + this.clearCheckCache('configuration'), + ]).then(() => undefined); } // Flush even an equal value so a retry after a storage error can succeed. return this.flushPreferences('persist configuration'); @@ -679,8 +721,9 @@ export class UpdateContext { } finally { flushed = this.endFlushBatch('reset to packaged bundle'); } + const cacheCleared = this.clearCheckCache('reset'); UpdateContext.ignoreRollback = false; - await flushed; + await Promise.all([flushed, cacheCleared]); // maxAgeDays=0:删除下载目录内容,仅保留当前运行版本的目录(残留目录由 // 下次常规清理回收)。挂到串行任务链尾,避免与在飞的解压/打补丁并发。 @@ -732,18 +775,23 @@ export class UpdateContext { let flushed: Promise = Promise.resolve(); try { if (hash && hashInfoJson) { - this.preferences.putSync(`hash_${hash}`, hashInfoJson); + this.preferences.putSync(`${KEY_HASH_INFO}${hash}`, hashInfoJson); } if (shouldSwitch) { this.applySwitch(hash); } - if (responseCacheJson) { - this.preferences.putSync(KEY_RESP_CACHE, responseCacheJson); - } } finally { flushed = this.endFlushBatch('commit sync result'); } await flushed; + // Advisory cache in its own store, written after the state it describes + // (as on Android): a lost write only costs JS a request. + if (responseCacheJson) { + this.cachePreferences.putSync(KEY_CHECK_CACHE, responseCacheJson); + this.flushStore(this.cachePreferences, 'commit sync cache').catch(() => { + // 已在 flushStore 里记录。 + }); + } return true; } @@ -835,8 +883,8 @@ export class UpdateContext { await verifyInstallForActivation( `${this.rootDir}/${safeHash}`, safeHash, - this.readString('currentVersion') === safeHash || - this.readString('lastVersion') === safeHash, + this.readString(KEY_CURRENT_VERSION) === safeHash || + this.readString(KEY_LAST_VERSION) === safeHash, ); } @@ -871,10 +919,10 @@ export class UpdateContext { } public consumeFirstLoadMarker(): boolean { - const marked = this.readString(FIRST_LOAD_MARKED_KEY) === 'true'; + const marked = readMarker(this.stateAccess(), KEY_FIRST_LOAD_MARKER); this.trace(`consumeFirstLoadMarker:marked=${marked}`); if (marked) { - this.preferences.deleteSync(FIRST_LOAD_MARKED_KEY); + writeMarker(this.stateAccess(), KEY_FIRST_LOAD_MARKER, false); this.flushInBackground('clear first load marker'); } return marked; @@ -999,9 +1047,8 @@ export class UpdateContext { return UpdateContext.isUsingBundleUrl; } - // bundleHash 缓存:"||"。键标识当前 - // 安装的二进制,每次(覆盖)安装 updateTime 都会变,每个安装只算一次。 - private static readonly KEY_BUNDLE_HASH_CACHE = 'bundleHashCache'; + // bundleHash 缓存(KEY_BUNDLE_HASH_CACHE):"||"。 + // 键标识当前安装的二进制,每次(覆盖)安装 updateTime 都会变,每个安装只算一次。 private getBundleModifiedTime(): number { try { @@ -1033,7 +1080,7 @@ export class UpdateContext { return Promise.resolve(''); } const cachePrefix = `${this.getPackageVersion()}|${this.getBundleModifiedTime()}|`; - const cached = this.readString(UpdateContext.KEY_BUNDLE_HASH_CACHE); + const cached = this.readString(KEY_BUNDLE_HASH_CACHE); if (cached.startsWith(cachePrefix)) { return Promise.resolve(cached.slice(cachePrefix.length)); } @@ -1075,7 +1122,7 @@ export class UpdateContext { } if (hash) { this.preferences.putSync( - UpdateContext.KEY_BUNDLE_HASH_CACHE, + KEY_BUNDLE_HASH_CACHE, cachePrefix + hash, ); // 缓存落盘失败不影响返回值(下次重算即可)。 diff --git a/ios/RCTPushy/RCTPushy+Launch.mm b/ios/RCTPushy/RCTPushy+Launch.mm index 2bcf3992..f6e90293 100644 --- a/ios/RCTPushy/RCTPushy+Launch.mm +++ b/ios/RCTPushy/RCTPushy+Launch.mm @@ -70,7 +70,8 @@ + (NSURL *)resolveLaunchBundleURL:(NSString **)launchRolledBackVersionOut // as every platform does (scripts/contract.ts storedItems). PushyRemoveKeys(defaults, PushyKeysClearedOnUpgrade(), PushyKeyPrefixesClearedOnUpgrade()); - [defaults setObject:@(YES) forKey:KeyPackageUpdatedMarked()]; + [PushyCacheDefaults() removeObjectForKey:keyCheckCache]; + PushyWriteMarker(defaults, keyBinaryUpgradedMarker, YES); state = sync.state; PushyApplyStateToDefaults(defaults, state); } @@ -97,7 +98,7 @@ + (NSURL *)resolveLaunchBundleURL:(NSString **)launchRolledBackVersionOut if (decision.consumed_first_time) { // bundleURL may be called many times, ignore rollbacks before process restarted again. ignoreRollback = true; - [defaults setObject:@(YES) forKey:keyFirstLoadMarked]; + PushyWriteMarker(defaults, keyFirstLoadMarker, YES); } NSString *loadVersion = PushyFromStdString(decision.load_version); @@ -127,7 +128,7 @@ + (NSURL *)resolveLaunchBundleURL:(NSString **)launchRolledBackVersionOut // The first load being consumed never happens: the // packaged bundle must not report isFirstTime. ignoreRollback = false; - [defaults removeObjectForKey:keyFirstLoadMarked]; + PushyWriteMarker(defaults, keyFirstLoadMarker, NO); } break; #else diff --git a/ios/RCTPushy/RCTPushy.mm b/ios/RCTPushy/RCTPushy.mm index 95ecea7d..52153208 100644 --- a/ios/RCTPushy/RCTPushy.mm +++ b/ios/RCTPushy/RCTPushy.mm @@ -177,34 +177,38 @@ - (NSDictionary *)constantsToExport ret[@"downloadRootDir"] = [RCTPushy downloadDir]; ret[@"packageVersion"] = [RCTPushy packageVersion]; ret[@"buildTime"] = [RCTPushy buildTime]; - ret[@"rolledBackVersion"] = [defaults objectForKey:keyRolledBackMarked]; - ret[@"isFirstTime"] = [defaults objectForKey:keyFirstLoadMarked]; - ret[@"uuid"] = [defaults objectForKey:keyUuid]; + pushy::state::State state = PushyStateFromDefaults(defaults); + NSString *rolledBackVersion = PushyFromStdString(state.rolled_back_version); + BOOL isFirstTime = PushyReadMarker(defaults, keyFirstLoadMarker); + ret[@"rolledBackVersion"] = rolledBackVersion; + if (isFirstTime) { + ret[@"isFirstTime"] = @YES; + } + ret[@"uuid"] = PushyReadString(defaults, keyUuid); ret[@"isUsingBundleUrl"] = @(pushyIsUsingBundleUrl.load()); // 原生 patch 内核可消费的 diff 轨道版本(2 = hdiffv2 轨道), // JS 随 checkUpdate 以 diffV 上报,服务端按能力门控下发 ret[@"supportedDiffVersion"] = @(pushy::hbc::kSupportedDiffVersion); - NSDictionary *pushyInfo = [defaults dictionaryForKey:keyPushyInfo]; - NSString *currentVersion = [pushyInfo objectForKey:paramCurrentVersion]; + NSString *currentVersion = PushyFromStdString(state.current_version); ret[@"currentVersion"] = currentVersion; if (currentVersion != nil) { - ret[@"currentVersionInfo"] = [defaults objectForKey:PushyHashInfoKey(currentVersion)]; + ret[@"currentVersionInfo"] = PushyReadString(defaults, PushyHashInfoKey(currentVersion)); // bundleSha256 from the install record, for crash-report attribution. ret[@"currentBundleSha256"] = PushyIsSafePathComponent(currentVersion) ? PushyRecordedBundleSha256(PushyVersionDir(currentVersion)) : @""; } - if (ret[@"isFirstTime"]) { - [defaults removeObjectForKey:keyFirstLoadMarked]; + if (isFirstTime) { + PushyWriteMarker(defaults, keyFirstLoadMarker, NO); } - if (ret[@"rolledBackVersion"] != nil) { - [defaults removeObjectForKey:keyRolledBackMarked]; + if (rolledBackVersion != nil) { + PushyApplyStateToDefaults(defaults, pushy::state::ClearRollbackMark(state)); [RCTPushyInstaller clearInvalidFiles]; } - if ([[defaults objectForKey:KeyPackageUpdatedMarked()] boolValue]) { - [defaults removeObjectForKey:KeyPackageUpdatedMarked()]; + if (PushyReadMarker(defaults, keyBinaryUpgradedMarker)) { + PushyWriteMarker(defaults, keyBinaryUpgradedMarker, NO); [RCTPushyInstaller clearInvalidFiles]; } }); }); @@ -220,8 +224,7 @@ - (NSDictionary *)constantsToExport return; } - NSUserDefaults *defaults = PushyDefaults(); - [defaults setObject:uuid forKey:keyUuid]; + PushyWriteString(PushyDefaults(), keyUuid, uuid); resolve(@true); } @@ -255,7 +258,7 @@ - (NSDictionary *)constantsToExport RCT_EXPORT_METHOD(getNativeCheckCache:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { - resolve([PushyDefaults() stringForKey:keyNativeCheckCache] ?: @""); + resolve(PushyReadString(PushyCacheDefaults(), keyCheckCache) ?: @""); } RCT_EXPORT_METHOD(markJsCheckCompleted:(NSString *)config @@ -281,7 +284,7 @@ - (NSDictionary *)constantsToExport NSError *error = nil; if (PushyJsonDictionary(value, &error) != nil) { - [PushyDefaults() setObject:value forKey:PushyHashInfoKey(hash)]; + PushyWriteString(PushyDefaults(), PushyHashInfoKey(hash), value); resolve(@true); } else { PushyRejectError(reject, PushyErrorWithCode( @@ -297,7 +300,7 @@ - (NSDictionary *)constantsToExport { NSUserDefaults *defaults = PushyDefaults(); - resolve([defaults stringForKey:PushyHashInfoKey(hash)]); + resolve(PushyReadString(defaults, PushyHashInfoKey(hash))); } RCT_EXPORT_METHOD(downloadFullUpdate:(NSDictionary *)options @@ -450,6 +453,7 @@ - (NSDictionary *)constantsToExport // removed), the same on every platform (scripts/contract.ts). PushyRemoveKeys(defaults, PushyKeysClearedOnReset(), PushyKeyPrefixesClearedOnReset()); + [PushyCacheDefaults() removeObjectForKey:keyCheckCache]; ignoreRollback = false; }); } @catch (...) { diff --git a/ios/RCTPushy/RCTPushyInternal.h b/ios/RCTPushy/RCTPushyInternal.h index 0f2001bc..7e67014c 100644 --- a/ios/RCTPushy/RCTPushyInternal.h +++ b/ios/RCTPushy/RCTPushyInternal.h @@ -41,20 +41,31 @@ typedef NS_ENUM(NSInteger, PushyType) { #pragma mark - RCTPushyState.mm -extern PUSHY_HIDDEN NSString *const keyPushyInfo; -extern PUSHY_HIDDEN NSString *const paramCurrentVersion; -extern PUSHY_HIDDEN NSString *const keyUuid; +// The persisted keys (scripts/contract.ts storeSchema). +// (scripts/contract.ts; bun scripts/generate-contract.ts) +extern PUSHY_HIDDEN NSString *const keySchemaVersion; +extern PUSHY_HIDDEN NSString *const keyPackageVersion; +extern PUSHY_HIDDEN NSString *const keyBuildTime; +extern PUSHY_HIDDEN NSString *const keyCurrentVersion; +extern PUSHY_HIDDEN NSString *const keyLastVersion; +extern PUSHY_HIDDEN NSString *const keyFirstTime; +extern PUSHY_HIDDEN NSString *const keyFirstTimeOk; +extern PUSHY_HIDDEN NSString *const keyRolledBackVersion; extern PUSHY_HIDDEN NSString *const keyHashInfo; -extern PUSHY_HIDDEN NSString *const keyFirstLoadMarked; -extern PUSHY_HIDDEN NSString *const keyRolledBackMarked; -extern PUSHY_HIDDEN NSString *const keyNativeCheckCache; +extern PUSHY_HIDDEN NSString *const keyFirstLoadMarker; +extern PUSHY_HIDDEN NSString *const keyBinaryUpgradedMarker; +extern PUSHY_HIDDEN NSString *const keyCheckCache; +extern PUSHY_HIDDEN NSString *const keyRoundBreadcrumb; +extern PUSHY_HIDDEN NSString *const keyUuid; +extern PUSHY_HIDDEN NSString *const keyNativeConfig; +extern PUSHY_HIDDEN NSString *const keyBundleHashCache; +// extern PUSHY_HIDDEN NSString *const ERROR_OPTIONS; // Consumed by the first +bundleURL of a process; re-armed by a version switch. extern PUSHY_HIDDEN std::atomic ignoreRollback; // Bumped by resetToPackagedBundle only; see RCTPushyState.mm. extern PUSHY_HIDDEN std::atomic pushyResetGeneration; -PUSHY_HIDDEN NSString *KeyPackageUpdatedMarked(void); // What a reset / a binary upgrade deletes besides the state fields // (generated from scripts/contract.ts storedItems), and the removal itself: // every key in `keys` and every stored key starting with one of `prefixes`. @@ -69,7 +80,21 @@ PUSHY_HIDDEN NSString *PushyHashInfoKey(NSString *hash); PUSHY_HIDDEN NSDictionary *PushyHostResult(NSString *status, NSString *reason, NSString *hash = nil, BOOL activated = NO); PUSHY_HIDDEN NSTimeInterval PushyMonotonicNow(void); +// The state store (every key but keyCheckCache), migrated out of the legacy +// layout on first use; and the cache store (keyCheckCache). PUSHY_HIDDEN NSUserDefaults *PushyDefaults(void); +PUSHY_HIDDEN NSUserDefaults *PushyCacheDefaults(void); +// Values as the layout stores them: text, never empty (writing nil or "" +// removes the key); a marker is a boolean that is only stored while set. +PUSHY_HIDDEN NSString *PushyReadString(NSUserDefaults *defaults, NSString *key); +PUSHY_HIDDEN void PushyWriteString(NSUserDefaults *defaults, NSString *key, NSString *value); +PUSHY_HIDDEN BOOL PushyReadBool(NSUserDefaults *defaults, NSString *key, BOOL fallback); +PUSHY_HIDDEN void PushyWriteBool(NSUserDefaults *defaults, NSString *key, BOOL value); +PUSHY_HIDDEN BOOL PushyReadMarker(NSUserDefaults *defaults, NSString *key); +PUSHY_HIDDEN void PushyWriteMarker(NSUserDefaults *defaults, NSString *key, BOOL set); +// The one-time move from the legacy layout (standardUserDefaults) into +// `state`; see RCTPushyState.mm. Returns what it did, for logs and tests. +PUSHY_HIDDEN NSString *PushyMigrateStores(NSUserDefaults *state, NSUserDefaults *legacy); PUSHY_HIDDEN void PushyWithStateLock(void (NS_NOESCAPE ^block)(void)); // Inside `@catch (...)`: the reason of what was caught — an NSException's // reason or a C++ exception's what() — or `fallback` when it has none. The diff --git a/ios/RCTPushy/RCTPushyOrchestrator.mm b/ios/RCTPushy/RCTPushyOrchestrator.mm index 68383fff..667ea880 100644 --- a/ios/RCTPushy/RCTPushyOrchestrator.mm +++ b/ios/RCTPushy/RCTPushyOrchestrator.mm @@ -11,13 +11,12 @@ #include #endif -// Raw JSON persisted by JS (syncNativeConfig) or the host (configure) for the -// native round; parsed on read (PushyLoadRunnableConfig). Absent = no round. -static NSString *const keyNativeConfig = @"REACTNATIVECN_PUSHY_NATIVE_CONFIG_KEY"; -// Set when a native check round starts, cleared when it ends (§11.4). Residue +// keyNativeConfig: the raw JSON persisted by JS (syncNativeConfig) or the +// host (configure) for the native round, parsed on read +// (PushyLoadRunnableConfig); absent = no round. keyRoundBreadcrumb: residue // on the next launch means the previous process died mid-round (a crash -// rescue was truncated): that launch resumes immediately instead of waiting. -static NSString *const keyNativeCheckIncomplete = @"REACTNATIVECN_PUSHY_NATIVE_CHECK_INCOMPLETE_KEY"; +// rescue was truncated), so that launch resumes immediately instead of +// waiting. Both in RCTPushyState.mm (scripts/contract.ts storedItems). // The crash-hold version-info flag read by JS, stored encoded // (cpp/patch_core/native_texts.h) so it does not appear as a plain binary @@ -324,7 +323,7 @@ static BOOL PushyConfigsEquivalent(NSString *a, NSString *b) { // otherwise *rejection is the host-facing result (skipped: // not_configured/disabled, failed: invalid_config). static BOOL PushyLoadRunnableConfig(NSString **json, NSDictionary **rejection) { - NSString *text = [PushyDefaults() stringForKey:keyNativeConfig]; + NSString *text = PushyReadString(PushyDefaults(), keyNativeConfig); if (json != NULL) { *json = [text copy]; } @@ -341,10 +340,10 @@ @implementation RCTPushyOrchestrator + (void)persistConfiguration:(NSString *)config { PushyWithStateLock(^{ NSUserDefaults *defaults = PushyDefaults(); - if ([defaults stringForKey:keyUuid].length == 0) { + if (PushyReadString(defaults, keyUuid) == nil) { [defaults setObject:[NSUUID UUID].UUIDString forKey:keyUuid]; } - if (PushyConfigsEquivalent([defaults stringForKey:keyNativeConfig], config)) { + if (PushyConfigsEquivalent(PushyReadString(defaults, keyNativeConfig), config)) { // The same config in another serialization (key order, trailing // slashes, defaulted keys). Not a change: the stored text, the // response cache and any in-flight round all stay valid. @@ -355,8 +354,8 @@ + (void)persistConfiguration:(NSString *)config { // commitRoundWithGeneration next to the reset generation), and the // cached response and JS-completed marker belong to the old one. pushyNativeConfigGeneration.fetch_add(1); - [defaults setObject:config forKey:keyNativeConfig]; - [defaults removeObjectForKey:keyNativeCheckCache]; + PushyWriteString(defaults, keyNativeConfig, config); + [PushyCacheDefaults() removeObjectForKey:keyCheckCache]; [self recordJsRound:nil]; }); if (pushySyncReady.load() && [self hasRunnableConfig]) { @@ -401,7 +400,7 @@ + (void)scheduleFromColdStart:(NSString *)launchRolledBackVersion { [RCTPushyOrchestrator prepareProcess:launchRolledBackVersion]; NSUserDefaults *defaults = PushyDefaults(); int64_t delaySeconds = - [defaults objectForKey:keyNativeCheckIncomplete] != nil ? 0 : 5; + PushyReadMarker(defaults, keyRoundBreadcrumb) ? 0 : 5; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delaySeconds * NSEC_PER_SEC), dispatch_get_global_queue(QOS_CLASS_UTILITY, 0), ^{ PushyGuard(@"native sync", ^{ if ([RCTPushyOrchestrator hasJsRound]) { @@ -522,7 +521,7 @@ + (NSDictionary *)prepareBundleWithin:(NSTimeInterval)timeout { } NSString *cancellation = PushyFromStdString(flowcore::HostCancellation( PushyToStdString(configJson), PushyToStdString(pushyHostRoundConfig), - PushyToStdString([PushyDefaults() stringForKey:keyNativeConfig]), + PushyToStdString(PushyReadString(PushyDefaults(), keyNativeConfig)), pushyHostRoundConfigGeneration, pushyNativeConfigGeneration.load(), pushyHostRoundGeneration, pushyResetGeneration.load())); if (cancellation != nil) { @@ -550,7 +549,7 @@ + (BOOL)hasJsRound { if (jsConfig == nil) { return NO; } - return PushyConfigsEquivalent([PushyDefaults() stringForKey:keyNativeConfig], jsConfig); + return PushyConfigsEquivalent(PushyReadString(PushyDefaults(), keyNativeConfig), jsConfig); } // Runs the process's single round on the calling thread if nobody has @@ -628,7 +627,7 @@ + (void)activatePendingVersion { } NSDictionary *hashInfoEntry = nil; NSDictionary *parsed = - PushyJsonDictionary([PushyDefaults() stringForKey:PushyHashInfoKey(hash)], NULL); + PushyJsonDictionary(PushyReadString(PushyDefaults(), PushyHashInfoKey(hash)), NULL); if (parsed != nil) { NSMutableDictionary *merged = [parsed mutableCopy]; merged[PushyInfoCrashHold()] = @YES; @@ -668,7 +667,7 @@ + (void)runOnce:(NSString *)launchRolledBackVersion deadline:(NSTimeInterval)dea pushyHostRoundConfigGeneration = configGeneration; pushyHostRoundResult = PushyHostResult(@"failed", @"check_failed"); NSUserDefaults *defaults = PushyDefaults(); - NSString *configJson = [defaults stringForKey:keyNativeConfig]; + NSString *configJson = PushyReadString(defaults, keyNativeConfig); pushyHostRoundConfig = configJson; flowjson::Value event = flowjson::Value::Object(); @@ -691,7 +690,7 @@ + (void)runOnce:(NSString *)launchRolledBackVersion deadline:(NSTimeInterval)dea for (const flowjson::Value &command : step.Get("commands").elements()) { const std::string &type = command.Get("type").AsString(); if (type == "markIncomplete") { - [defaults setObject:@YES forKey:keyNativeCheckIncomplete]; + PushyWriteMarker(defaults, keyRoundBreadcrumb, YES); marked = YES; } else if (type == "finish") { [self finishRound:command @@ -708,7 +707,7 @@ + (void)runOnce:(NSString *)launchRolledBackVersion deadline:(NSTimeInterval)dea } } @finally { if (marked) { - [defaults removeObjectForKey:keyNativeCheckIncomplete]; + PushyWriteMarker(defaults, keyRoundBreadcrumb, NO); } } } @@ -764,7 +763,7 @@ + (void)runOnce:(NSString *)launchRolledBackVersion deadline:(NSTimeInterval)dea }; put("packageVersion", [RCTPushy packageVersion]); put("currentVersion", currentVersion); - put("uuid", [PushyDefaults() stringForKey:keyUuid]); + put("uuid", PushyReadString(PushyDefaults(), keyUuid)); put("rolledBackVersion", launchRolledBackVersion); put("buildTime", [RCTPushy buildTime]); put("os", [NSString stringWithFormat:@"%@ %@", PushyOsName, PushyOsVersion()]); @@ -953,7 +952,7 @@ + (BOOL)commitRoundWithGeneration:(uint64_t)generation activated = YES; } if (cache != nil) { - [defaults setObject:cache forKey:keyNativeCheckCache]; + [PushyCacheDefaults() setObject:cache forKey:keyCheckCache]; } committed = YES; }); diff --git a/ios/RCTPushy/RCTPushyState.mm b/ios/RCTPushy/RCTPushyState.mm index d37e173e..a4a63722 100644 --- a/ios/RCTPushy/RCTPushyState.mm +++ b/ios/RCTPushy/RCTPushyState.mm @@ -6,57 +6,74 @@ #include #include "../../cpp/patch_core/digest.h" #include "../../cpp/patch_core/native_texts.h" +#include "../../cpp/patch_core/stored_items.h" #import #import -PUSHY_HIDDEN NSString *const keyPushyInfo = @"REACTNATIVECN_PUSHY_INFO_KEY"; -// Binary identity (SyncBinaryVersion input). Prefixed like every other key: -// the unprefixed names collided with generic host-app/SDK defaults, and a -// foreign value there made every launch look like a rebuilt binary and wipe -// the installed update. -static NSString *const paramPackageVersion = @"REACTNATIVECN_PUSHY_PACKAGEVERSION"; -static NSString *const paramBuildTime = @"REACTNATIVECN_PUSHY_BUILDTIME"; -// The unprefixed names earlier SDKs wrote. Read only as a fallback until the -// first state write migrates them (PushyStateFromDefaults / -// PushyApplyStateToDefaults). -static NSString *const legacyParamPackageVersion = @"packageVersion"; -static NSString *const legacyParamBuildTime = @"buildTime"; -static NSString *const paramLastVersion = @"lastVersion"; -PUSHY_HIDDEN NSString *const paramCurrentVersion = @"currentVersion"; -static NSString *const paramIsFirstTime = @"isFirstTime"; -static NSString *const paramIsFirstLoadOk = @"isFirstLoadOK"; -PUSHY_HIDDEN NSString *const keyUuid = @"REACTNATIVECN_PUSHY_UUID"; -PUSHY_HIDDEN NSString *const keyHashInfo = @"REACTNATIVECN_PUSHY_HASH_"; -PUSHY_HIDDEN NSString *const keyFirstLoadMarked = @"REACTNATIVECN_PUSHY_FIRSTLOADMARKED_KEY"; -PUSHY_HIDDEN NSString *const keyRolledBackMarked = @"REACTNATIVECN_PUSHY_ROLLEDBACKMARKED_KEY"; -// Encoded constants (native_texts.h) are decoded on first use, not by -// static initializers at image load. -PUSHY_HIDDEN NSString *KeyPackageUpdatedMarked(void) { - static NSString *value = PushyFromStdString(pushy::texts::PackageUpdatedMarkedKey()); - return value; -} -// bundleHash cache: "|" where cacheKey identifies the -// installed binary (packageVersion + embedded bundle size + mtime). Recomputed -// only when the key changes, i.e. once per install. -static NSString *const keyBundleHashCache = @"REACTNATIVECN_PUSHY_BUNDLEHASH_KEY"; -// Raw response cache written by the native cold-start check for the JS side -// to reuse (§10.3), scoped to the request and config that produced it. -PUSHY_HIDDEN NSString *const keyNativeCheckCache = @"REACTNATIVECN_PUSHY_NATIVE_CHECK_RESP_KEY"; +// The persisted layout every platform shares (scripts/contract.ts +// storeSchema): two NSUserDefaults suites of our own. Not +// standardUserDefaults: the host app shares that namespace, so a host key +// could collide with ours (the unprefixed packageVersion/buildTime once did, +// and wiped installed versions), and a host that clears its defaults domain +// (a common "log out" reset) would take the uuid and the update state along. +// (scripts/contract.ts; bun scripts/generate-contract.ts) +static NSString *const PushyStateStoreName = @"pushy_state"; +static NSString *const PushyCacheStoreName = @"pushy_cache"; +// A boolean is stored as one of these; anything else (absent) reads as the +// field's fallback. +static NSString *const PushyBooleanTrue = @"1"; +static NSString *const PushyBooleanFalse = @"0"; +// Carried by hand when the migration itself cannot run. +static NSString *const legacyKeyUuid = @"REACTNATIVECN_PUSHY_UUID"; +// Every legacy key starts with it: only those are snapshotted (the host app +// shares that store). +static NSString *const legacyKeyPrefix = @"REACTNATIVECN_PUSHY_"; +PUSHY_HIDDEN NSString *const keySchemaVersion = @"schemaVersion"; +PUSHY_HIDDEN NSString *const keyPackageVersion = @"packageVersion"; +PUSHY_HIDDEN NSString *const keyBuildTime = @"buildTime"; +PUSHY_HIDDEN NSString *const keyCurrentVersion = @"currentVersion"; +PUSHY_HIDDEN NSString *const keyLastVersion = @"lastVersion"; +PUSHY_HIDDEN NSString *const keyFirstTime = @"firstTime"; +PUSHY_HIDDEN NSString *const keyFirstTimeOk = @"firstTimeOk"; +PUSHY_HIDDEN NSString *const keyRolledBackVersion = @"rolledBackVersion"; +// Per-version info: name, description, metaInfo and the rescue flags. +PUSHY_HIDDEN NSString *const keyHashInfo = @"hash_"; +// Set when a launch consumes first_time; getConstants reports and clears it. +PUSHY_HIDDEN NSString *const keyFirstLoadMarker = @"firstLoadMarked"; +// Set by a binary upgrade, consumed by getConstants (old version cleanup). +PUSHY_HIDDEN NSString *const keyBinaryUpgradedMarker = @"binaryUpgraded"; +// The native round's raw response for the JS side to reuse (§10.3), scoped +// to the exact logical request and native config that produced it. It +// describes versions a reset or an upgrade removes. +PUSHY_HIDDEN NSString *const keyCheckCache = @"nativeCheckResp"; +// Set when a round starts, cleared when it ends (§11.4). Residue on the +// next launch means the previous process died mid-round: that launch +// resumes immediately instead of waiting 5s. +PUSHY_HIDDEN NSString *const keyRoundBreadcrumb = @"nativeCheckIncomplete"; +// Identifies the install for gray-release bucketing: must never change. +PUSHY_HIDDEN NSString *const keyUuid = @"uuid"; +// The persisted native check config (JS syncNativeConfig or the host) the +// cold-start round and the crash hold run from. +PUSHY_HIDDEN NSString *const keyNativeConfig = @"nativeConfig"; +// "|" of the embedded bundle: keyed by the binary, +// so it invalidates itself on upgrade. +PUSHY_HIDDEN NSString *const keyBundleHashCache = @"bundleHashCache"; +// // (scripts/contract.ts; bun scripts/generate-contract.ts) -// What a reset to the packaged bundle and a binary upgrade delete besides -// the state fields (scripts/contract.ts storedItems; every other item survives -// both: the uuid, the native config, the round breadcrumb, the bundle hash -// cache). +// What a reset to the packaged bundle and a binary upgrade delete from the +// state store besides the state fields (scripts/contract.ts storedItems; +// the cache store is cleared on both, every other item survives both: the +// uuid, the native config, the round breadcrumb, the bundle hash cache). PUSHY_HIDDEN NSArray *PushyKeysClearedOnReset(void) { - return @[keyFirstLoadMarked, KeyPackageUpdatedMarked(), keyNativeCheckCache]; + return @[keyFirstLoadMarker, keyBinaryUpgradedMarker]; } PUSHY_HIDDEN NSArray *PushyKeyPrefixesClearedOnReset(void) { return @[keyHashInfo]; } PUSHY_HIDDEN NSArray *PushyKeysClearedOnUpgrade(void) { - return @[keyFirstLoadMarked, keyNativeCheckCache]; + return @[keyFirstLoadMarker]; } PUSHY_HIDDEN NSArray *PushyKeyPrefixesClearedOnUpgrade(void) { return @[keyHashInfo]; @@ -160,10 +177,6 @@ PUSHY_HIDDEN BOOL PushyGuard(NSString *where, void (NS_NOESCAPE ^block)(void)) { return std::string([value UTF8String]); } -PUSHY_HIDDEN NSUserDefaults *PushyDefaults(void) { - return [NSUserDefaults standardUserDefaults]; -} - PUSHY_HIDDEN NSString *PushyFromStdString(const std::string &value) { if (value.empty()) { return nil; @@ -171,14 +184,132 @@ PUSHY_HIDDEN BOOL PushyGuard(NSString *where, void (NS_NOESCAPE ^block)(void)) { return [NSString stringWithUTF8String:value.c_str()]; } -static void PushySetNullableString(NSUserDefaults *defaults, NSString *key, NSString *value) { - if (value != nil) { +PUSHY_HIDDEN NSString *PushyReadString(NSUserDefaults *defaults, NSString *key) { + NSString *value = [defaults stringForKey:key]; + return value.length > 0 ? value : nil; +} + +PUSHY_HIDDEN void PushyWriteString(NSUserDefaults *defaults, NSString *key, NSString *value) { + if (value.length > 0) { [defaults setObject:value forKey:key]; } else { [defaults removeObjectForKey:key]; } } +PUSHY_HIDDEN BOOL PushyReadBool(NSUserDefaults *defaults, NSString *key, BOOL fallback) { + NSString *value = [defaults stringForKey:key]; + if ([value isEqualToString:PushyBooleanTrue]) { + return YES; + } + if ([value isEqualToString:PushyBooleanFalse]) { + return NO; + } + return fallback; +} + +PUSHY_HIDDEN void PushyWriteBool(NSUserDefaults *defaults, NSString *key, BOOL value) { + [defaults setObject:value ? PushyBooleanTrue : PushyBooleanFalse forKey:key]; +} + +PUSHY_HIDDEN BOOL PushyReadMarker(NSUserDefaults *defaults, NSString *key) { + return PushyReadBool(defaults, key, NO); +} + +PUSHY_HIDDEN void PushyWriteMarker(NSUserDefaults *defaults, NSString *key, BOOL set) { + if (set) { + [defaults setObject:PushyBooleanTrue forKey:key]; + } else { + [defaults removeObjectForKey:key]; + } +} + +// A stored value as the migration core reads it: text as is, a number or a +// boolean as its text ("1" for YES, like the layout's own booleans), anything +// else (the legacy info dictionary) as "" — a key to delete, never a value. +static std::string PushyDefaultsText(id value) { + if ([value isKindOfClass:[NSString class]]) { + return PushyToStdString(value); + } + if ([value isKindOfClass:[NSNumber class]]) { + return PushyToStdString([(NSNumber *)value stringValue]); + } + return std::string(); +} + +// The one-time move from the legacy layout (SDKs up to 10.61: +// standardUserDefaults, REACTNATIVECN_PUSHY_* keys) into the state suite, by +// the shared core's plan (cpp/patch_core/stored_items.h). The puts end with +// the schema, so a process killed between two of them migrates again on its +// next launch (the core never overwrites what the suite already holds); the +// legacy keys are deleted only after every put. A write reaches cfprefsd +// before setObject:forKey: returns, so dying here loses nothing already put. +// Never throws: a failure leaves a fresh suite (as a new install) that still +// carries the install's uuid, and writes no schema, so the next launch tries +// again. +PUSHY_HIDDEN NSString *PushyMigrateStores(NSUserDefaults *state, NSUserDefaults *legacy) { + @try { + pushy::stored::Entries legacyItems; + NSDictionary *legacyAll = [legacy dictionaryRepresentation]; + for (NSString *key in legacyAll) { + // The host app shares that store: only our prefix is looked at. + if ([key hasPrefix:legacyKeyPrefix]) { + legacyItems.emplace_back(PushyToStdString(key), PushyDefaultsText(legacyAll[key])); + } + } + pushy::stored::Entries currentItems; + NSDictionary *currentAll = [state dictionaryRepresentation]; + for (NSString *key in currentAll) { + currentItems.emplace_back(PushyToStdString(key), PushyDefaultsText(currentAll[key])); + } + pushy::stored::MigrationPlan plan = pushy::stored::MigrateStoredItems( + pushy::stored::kLegacyIos, legacyItems, currentItems); + if (!plan.valid) { + [NSException raise:NSInternalInconsistencyException format:@"no migration plan"]; + } + for (const auto &put : plan.puts) { + [state setObject:PushyFromStdString(put.second) forKey:PushyFromStdString(put.first)]; + } + for (const std::string &key : plan.removes) { + [legacy removeObjectForKey:PushyFromStdString(key)]; + } + return plan.migrated ? @"migrated" : @"current"; + } @catch (...) { + NSLog(@"RCTPushy -- state store migration failed: %@", + PushyCaughtReason(@"unknown exception")); + } + PushyGuard(@"uuid carry", ^{ + NSString *uuid = [legacy stringForKey:legacyKeyUuid]; + if (PushyReadString(state, keyUuid) == nil && uuid.length > 0) { + [state setObject:uuid forKey:keyUuid]; + } + }); + return @"fallback"; +} + +PUSHY_HIDDEN NSUserDefaults *PushyDefaults(void) { + static NSUserDefaults *defaults; + static dispatch_once_t once; + dispatch_once(&once, ^{ + defaults = [[NSUserDefaults alloc] initWithSuiteName:PushyStateStoreName]; + // Before anything reads the suite; a no-op once done. + NSString *migration = PushyMigrateStores(defaults, [NSUserDefaults standardUserDefaults]); + if (![migration isEqualToString:@"current"]) { + NSLog(@"RCTPushy -- state store migration: %@", migration); + } + }); + return defaults; +} + +PUSHY_HIDDEN NSUserDefaults *PushyCacheDefaults(void) { + static NSUserDefaults *defaults; + static dispatch_once_t once; + dispatch_once(&once, ^{ + defaults = [[NSUserDefaults alloc] initWithSuiteName:PushyCacheStoreName]; + }); + return defaults; +} + PUSHY_HIDDEN NSString *PushyHashInfoKey(NSString *hash) { return [keyHashInfo stringByAppendingString:hash ?: @""]; } @@ -247,60 +378,30 @@ PUSHY_HIDDEN void PushyRejectError(RCTPromiseRejectBlock reject, NSError *error) return data == nil ? nil : [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; } -// Binary identity under the prefixed key, or — until the first state write -// migrates it — the value an earlier SDK left under the unprefixed one, so an -// installed update survives the SDK upgrade instead of reading as a rebuilt -// binary. -static NSString *PushyBinaryIdentityValue(NSUserDefaults *defaults, NSString *key, NSString *legacyKey) { - return [defaults stringForKey:key] ?: [defaults stringForKey:legacyKey]; -} - PUSHY_HIDDEN pushy::state::State PushyStateFromDefaults(NSUserDefaults *defaults) { pushy::state::State state; - state.package_version = PushyToStdString( - PushyBinaryIdentityValue(defaults, paramPackageVersion, legacyParamPackageVersion)); - state.build_time = PushyToStdString( - PushyBinaryIdentityValue(defaults, paramBuildTime, legacyParamBuildTime)); - NSDictionary *pushyInfo = [defaults dictionaryForKey:keyPushyInfo]; - if (pushyInfo != nil) { - state.current_version = PushyToStdString(pushyInfo[paramCurrentVersion]); - state.last_version = PushyToStdString(pushyInfo[paramLastVersion]); - state.first_time = [pushyInfo[paramIsFirstTime] boolValue]; - id firstLoadOk = pushyInfo[paramIsFirstLoadOk]; - state.first_time_ok = firstLoadOk == nil ? true : [firstLoadOk boolValue]; - } - state.rolled_back_version = PushyToStdString([defaults stringForKey:keyRolledBackMarked]); + // (scripts/contract.ts; bun scripts/generate-contract.ts) + state.package_version = PushyToStdString(PushyReadString(defaults, keyPackageVersion)); + state.build_time = PushyToStdString(PushyReadString(defaults, keyBuildTime)); + state.current_version = PushyToStdString(PushyReadString(defaults, keyCurrentVersion)); + state.last_version = PushyToStdString(PushyReadString(defaults, keyLastVersion)); + state.first_time = PushyReadBool(defaults, keyFirstTime, false); + state.first_time_ok = PushyReadBool(defaults, keyFirstTimeOk, true); + state.rolled_back_version = PushyToStdString(PushyReadString(defaults, keyRolledBackVersion)); + // return state; } PUSHY_HIDDEN void PushyApplyStateToDefaults(NSUserDefaults *defaults, const pushy::state::State &state) { - PushySetNullableString(defaults, paramPackageVersion, PushyFromStdString(state.package_version)); - PushySetNullableString(defaults, paramBuildTime, PushyFromStdString(state.build_time)); - // One-time migration: once the prefixed keys hold the identity, the - // legacy ones are retired so a host-app write there is never read again. - [defaults removeObjectForKey:legacyParamPackageVersion]; - [defaults removeObjectForKey:legacyParamBuildTime]; - - BOOL hasPushyInfo = !state.current_version.empty() || !state.last_version.empty() || state.first_time || !state.first_time_ok; - if (hasPushyInfo) { - NSMutableDictionary *newInfo = [[NSMutableDictionary alloc] init]; - if (!state.current_version.empty()) { - newInfo[paramCurrentVersion] = PushyFromStdString(state.current_version); - } - if (!state.last_version.empty()) { - newInfo[paramLastVersion] = PushyFromStdString(state.last_version); - } - newInfo[paramIsFirstTime] = @(state.first_time); - newInfo[paramIsFirstLoadOk] = @(state.first_time_ok); - [defaults setObject:newInfo forKey:keyPushyInfo]; - } else { - [defaults removeObjectForKey:keyPushyInfo]; - } - - PushySetNullableString( - defaults, - keyRolledBackMarked, - PushyFromStdString(state.rolled_back_version)); + // (scripts/contract.ts; bun scripts/generate-contract.ts) + PushyWriteString(defaults, keyPackageVersion, PushyFromStdString(state.package_version)); + PushyWriteString(defaults, keyBuildTime, PushyFromStdString(state.build_time)); + PushyWriteString(defaults, keyCurrentVersion, PushyFromStdString(state.current_version)); + PushyWriteString(defaults, keyLastVersion, PushyFromStdString(state.last_version)); + PushyWriteBool(defaults, keyFirstTime, state.first_time); + PushyWriteBool(defaults, keyFirstTimeOk, state.first_time_ok); + PushyWriteString(defaults, keyRolledBackVersion, PushyFromStdString(state.rolled_back_version)); + // } // Version switch without acquiring the state lock: the caller must already @@ -319,7 +420,7 @@ PUSHY_HIDDEN void PushySwitchVersionLocked(NSString *hash) { } static NSString *PushyCachedBundleHash(NSUserDefaults *defaults, NSString *cachedPrefix) { - NSString *cached = [defaults stringForKey:keyBundleHashCache]; + NSString *cached = PushyReadString(defaults, keyBundleHashCache); if ([cached hasPrefix:cachedPrefix]) { return [cached substringFromIndex:cachedPrefix.length]; } diff --git a/scripts/contract.ts b/scripts/contract.ts index 341c97a4..2f148b17 100644 --- a/scripts/contract.ts +++ b/scripts/contract.ts @@ -212,31 +212,6 @@ export const archivePatchTypes = [ }, ]; -// Storage keys the Android and Harmony orchestrators share (iOS uses its own -// REACTNATIVECN_PUSHY_* names). -export const syncStorageKeys = [ - { - name: 'Config', - value: 'nativeConfig', - doc: 'The persisted native check config (JS syncNativeConfig or the host).', - }, - { - name: 'RespCache', - value: 'nativeCheckResp', - doc: - 'Raw response cache for the JS side to reuse (§10.3), scoped to the exact\n' + - 'logical request and native config that produced it.', - }, - { - name: 'RoundIncomplete', - value: 'nativeCheckIncomplete', - doc: - 'Set when a round starts, cleared when it ends (§11.4). Residue on the\n' + - 'next launch means the previous process died mid-round: that launch\n' + - 'resumes immediately instead of waiting 5s.', - }, -]; - // The host-facing result of a native round (prepareBundle). export const roundStatuses = [ { name: 'Skipped', value: 'skipped' }, @@ -283,6 +258,7 @@ export const jniFunctions: Record = { 'ResumePlan.planRequest': 'ResumePlanRequest', 'ResumePlan.classifyResponse': 'ResumeClassifyResponse', 'ResumePlan.sidecar': 'ResumeSidecar', + 'StoreMigration.migrateStoredItems': 'StoredItemsMigrate', }; // NativePatchCore.ts binding -> the NAPI callback in pushy.cpp. @@ -313,6 +289,7 @@ export const napiFunctions: Record = { resumePlanRequest: 'ResumePlanRequest', resumeClassifyResponse: 'ResumeClassifyResponse', resumeSidecar: 'ResumeSidecar', + migrateStoredItems: 'MigrateStoredItems', }; export type TextHost = 'cpp' | 'java' | 'arkts'; @@ -376,11 +353,6 @@ export const nativeTexts: NativeText[] = [ values: { java: '.apk.patch', arkts: '.app.patch' }, doc: 'Archive suffix of a patch against the installed package.', }, - { - name: 'PackageUpdatedMarkedKey', - value: 'REACTNATIVECN_PUSHY_ISPACKAGEUPDATEDMARKED_KEY', - hosts: ['cpp'], - }, { name: 'LogTag', value: 'react-native-update', hosts: ['cpp', 'java'] }, { name: 'LibraryName', value: 'rnpushy', hosts: ['java'] }, { @@ -421,85 +393,228 @@ export const servicePresets = { }, }; + +// --- Persisted layout (schema 1) -------------------------------------------- +// +// Every platform keeps the same keys, with the same value encoding, in two +// key-value stores of its own (Android SharedPreferences files, iOS +// NSUserDefaults suites, Harmony preferences). The generator turns this into +// each platform's key table and its State <-> store mapping; the one-time +// move out of the layouts SDKs up to 10.61 wrote is the shared +// cpp/patch_core/stored_items.h (vectors: stored-items-vectors.json). +// +// Every value is a string. A boolean is "1" or "0"; a marker is "1" while set +// and absent otherwise; an empty string is never stored (writing one removes +// the key), so absent and empty read the same. + +export type Platform = 'android' | 'ios' | 'harmony'; + +export const storeSchema = { + version: 1, + versionKey: 'schemaVersion', + /** The main store: the state fields and every item without `store`. */ + stateStore: 'pushy_state', + /** + * Whole server responses: kept apart so the small state commits do not + * rewrite them (every platform rewrites a store's whole file). + */ + cacheStore: 'pushy_cache', + booleans: { true: '1', false: '0' }, +}; + +export interface StateField { + /** The key, and the field's name in Java/ArkTS (C++ uses its snake_case). */ + name: string; + type: 'string' | 'boolean'; + /** What an absent boolean reads as. */ + fallback?: boolean; +} + +// pushy::state::State (cpp/patch_core/state_core.h), which the shared state +// core rewrites as a whole. +export const stateFields: StateField[] = [ + { name: 'packageVersion', type: 'string' }, + { name: 'buildTime', type: 'string' }, + { name: 'currentVersion', type: 'string' }, + { name: 'lastVersion', type: 'string' }, + { name: 'firstTime', type: 'boolean', fallback: false }, + { name: 'firstTimeOk', type: 'boolean', fallback: true }, + { name: 'rolledBackVersion', type: 'string' }, +]; + export type Lifecycle = 'reset' | 'binaryUpgrade'; export interface StoredItem { name: string; doc: string; + key: string; /** The key is a prefix (one entry per version). */ prefix?: boolean; + /** Kept in the cache store instead of the state store. */ + cache?: boolean; + /** A flag: "1" while set, absent otherwise (any legacy value counts as set). */ + marker?: boolean; /** The events that delete it; everything else survives both. */ clearedOn: Lifecycle[]; - /** The key (or prefix) as an expression in each platform's own code. */ - keys: { objc?: string; java?: string; arkts?: string }; + /** The platforms that use it (all when absent). */ + platforms?: Platform[]; } -// The persisted items next to the state fields (which the shared state core -// rewrites itself) and what a reset to the packaged bundle or a binary -// upgrade does to them, the same on every platform. The physical keys stay -// as each platform has always stored them (no format migration). +// The persisted items next to the state fields and what a reset to the +// packaged bundle or a binary upgrade does to them, the same on every +// platform. export const storedItems: StoredItem[] = [ { name: 'HashInfo', + key: 'hash_', prefix: true, doc: 'Per-version info: name, description, metaInfo and the rescue flags.', clearedOn: ['reset', 'binaryUpgrade'], - keys: { objc: 'keyHashInfo', java: 'HASH_INFO_PREFIX', arkts: 'HASH_INFO_PREFIX' }, }, { name: 'FirstLoadMarker', + key: 'firstLoadMarked', + marker: true, doc: 'Set when a launch consumes first_time; getConstants reports and clears it.', clearedOn: ['reset', 'binaryUpgrade'], - keys: { - objc: 'keyFirstLoadMarked', - java: 'UpdateContext.KEY_FIRST_LOAD_MARKED', - arkts: 'FIRST_LOAD_MARKED_KEY', - }, }, { - name: 'PackageUpdatedMarker', - doc: 'iOS: set by a binary upgrade, consumed by getConstants (old version cleanup).', + name: 'BinaryUpgradedMarker', + key: 'binaryUpgraded', + marker: true, + doc: 'Set by a binary upgrade, consumed by getConstants (old version cleanup).', clearedOn: ['reset'], - keys: { objc: 'KeyPackageUpdatedMarked()' }, + platforms: ['ios'], }, { name: 'CheckCache', + key: 'nativeCheckResp', + cache: true, doc: - "The native round's response cache: it describes versions the event just\n" + - 'removed (Android: its legacy location here; its own file is cleared too).', + "The native round's raw response for the JS side to reuse (§10.3), scoped\n" + + 'to the exact logical request and native config that produced it. It\n' + + 'describes versions a reset or an upgrade removes.', clearedOn: ['reset', 'binaryUpgrade'], - keys: { - objc: 'keyNativeCheckCache', - java: 'SyncCoordinator.KEY_RESP_CACHE', - arkts: 'KEY_RESP_CACHE', - }, }, { name: 'RoundBreadcrumb', - doc: 'Only decides whether the next launch resumes the round without the 5s delay.', + key: 'nativeCheckIncomplete', + marker: true, + doc: + 'Set when a round starts, cleared when it ends (§11.4). Residue on the\n' + + 'next launch means the previous process died mid-round: that launch\n' + + 'resumes immediately instead of waiting 5s.', clearedOn: [], - keys: { - objc: 'keyNativeCheckIncomplete', - java: 'SyncCoordinator.KEY_ROUND_INCOMPLETE', - arkts: 'KEY_ROUND_INCOMPLETE', - }, }, { name: 'Uuid', + key: 'uuid', doc: 'Identifies the install for gray-release bucketing: must never change.', clearedOn: [], - keys: {}, }, { name: 'NativeConfig', - doc: 'The host or JS config the cold-start round and crash hold run from.', + key: 'nativeConfig', + doc: + 'The persisted native check config (JS syncNativeConfig or the host) the\n' + + 'cold-start round and the crash hold run from.', clearedOn: [], - keys: {}, }, { name: 'BundleHashCache', - doc: 'Keyed by the binary identity, so it invalidates itself on upgrade.', + key: 'bundleHashCache', + doc: + '"|" of the embedded bundle: keyed by the binary,\n' + + 'so it invalidates itself on upgrade.', clearedOn: [], - keys: {}, }, ]; + +export interface LegacyLayout { + platform: Platform; + /** Crosses JNI/NAPI as this number. */ + id: number; + doc: string; + /** + * What the migration carries over: new key <- legacy key. Only what a + * binary upgrade keeps (the uuid, the native config, the breadcrumb, the + * bundle hash cache) and the binary identity that upgrade is detected + * from: the new layout only ships in a new binary, whose first launch + * resets every other state field anyway (SyncBinaryVersion). + */ + carried: Record; + /** Legacy keys deleted without carrying them, every one an SDK ever wrote. */ + dropped: string[]; + droppedPrefixes: string[]; +} + +const androidLegacy = { + carried: { + uuid: 'uuid', + nativeConfig: 'nativeConfig', + nativeCheckIncomplete: 'nativeCheckIncomplete', + bundleHashCache: 'bundleHashCache', + packageVersion: 'packageVersion', + buildTime: 'buildTime', + }, + dropped: [ + 'currentVersion', + 'lastVersion', + 'firstTime', + 'firstTimeOk', + 'rolledBackVersion', + 'firstLoadMarked', + 'nativeCheckResp', + 'rolledBack', + 'shouldRollback', + 'blockUntil', + 'blockReason', + ], + droppedPrefixes: ['hash_'], +}; + +// The layouts SDKs up to 10.61 wrote. +export const legacyLayouts: LegacyLayout[] = [ + { + platform: 'android', + id: 1, + doc: + 'SharedPreferences Texts.PREFERENCES_NAME, and its "_check" file for the\n' + + 'response cache; native booleans.', + ...androidLegacy, + }, + { + platform: 'ios', + id: 2, + doc: + 'standardUserDefaults, shared with the host app: only these keys are\n' + + "ours (the unprefixed packageVersion/buildTime that SDKs before 10.5x\n" + + 'wrote are left alone, they may be the host\'s).', + carried: { + uuid: 'REACTNATIVECN_PUSHY_UUID', + nativeConfig: 'REACTNATIVECN_PUSHY_NATIVE_CONFIG_KEY', + nativeCheckIncomplete: 'REACTNATIVECN_PUSHY_NATIVE_CHECK_INCOMPLETE_KEY', + bundleHashCache: 'REACTNATIVECN_PUSHY_BUNDLEHASH_KEY', + packageVersion: 'REACTNATIVECN_PUSHY_PACKAGEVERSION', + buildTime: 'REACTNATIVECN_PUSHY_BUILDTIME', + }, + dropped: [ + 'REACTNATIVECN_PUSHY_INFO_KEY', + 'REACTNATIVECN_PUSHY_FIRSTLOADMARKED_KEY', + 'REACTNATIVECN_PUSHY_ROLLEDBACKMARKED_KEY', + 'REACTNATIVECN_PUSHY_ISPACKAGEUPDATEDMARKED_KEY', + 'REACTNATIVECN_PUSHY_NATIVE_CHECK_RESP_KEY', + 'REACTNATIVECN_PUSHY_BLOCKUPDATE', + 'REACTNATIVECN_PUSHY_BUNDLEHASH_IDENTITY', + 'REACTNATIVECN_PUSHY_BUNDLEHASH_VALUE', + ], + droppedPrefixes: ['REACTNATIVECN_PUSHY_HASH_'], + }, + { + platform: 'harmony', + id: 3, + doc: 'preferences Texts.PREFERENCES_NAME; booleans native or "true".', + ...androidLegacy, + }, +]; + diff --git a/scripts/generate-contract.ts b/scripts/generate-contract.ts index e9b28b48..6eebd273 100644 --- a/scripts/generate-contract.ts +++ b/scripts/generate-contract.ts @@ -19,8 +19,11 @@ import { roundStatuses, servicePresets, stateOperations, + legacyLayouts, + type Platform, + stateFields, storedItems, - syncStorageKeys, + storeSchema, type Lifecycle, type TextHost, vendoredSources, @@ -399,24 +402,6 @@ region( archivePatchTypes.map(({ objc, value }) => `PushyType${objc} = ${value},`) ); -// Sync storage keys. -region( - `${javaDir}/SyncCoordinator.java`, - 'storage-keys', - syncStorageKeys.flatMap(({ name, value, doc }) => [ - ...comment(doc, 4), - `static final String KEY_${snake(name)} = "${value}";`, - ]) -); -region( - `${ets}/SyncCoordinator.ts`, - 'storage-keys', - syncStorageKeys.flatMap(({ name, value, doc }) => [ - ...comment(doc), - `export const KEY_${snake(name)} = '${value}';`, - ]) -); - // Round statuses. region( `${javaDir}/BundlePreparationResult.java`, @@ -660,62 +645,280 @@ region('src/client.ts', 'service-presets', [ '};', ]); -// Stored-item lifecycle: what a reset / binary upgrade deletes. +// --- Persisted layout (contract.ts storeSchema) ---------------------------- + +const capitalize = (name: string) => name[0].toUpperCase() + name.slice(1); +const platformLabels: Record = { + android: 'Android', + ios: 'iOS', + harmony: 'Harmony', +}; +// Stored encoded in native code: the binaries carry no update wording. +const nativeWording = /update|patch|rescue|reload|hotfix/i; +const cppText = (value: string) => + nativeWording.test(value) + ? `text::Reveal("${encodeNativeText(value)}")` + : `"${value}"`; +const itemsOn = (platform: Platform) => + storedItems.filter((item) => !item.platforms || item.platforms.includes(platform)); +const layoutOf = (platform: Platform) => { + const layout = legacyLayouts.find((candidate) => candidate.platform === platform); + if (!layout) { + throw new Error(`scripts/contract.ts legacyLayouts: no ${platform} layout`); + } + return layout; +}; +// Every key the schema defines, for the legacy tables' targets. +const schemaKeys = new Map([ + ...stateFields.map((field) => [field.name, { marker: false }] as const), + ...storedItems.map((item) => [item.key, { marker: !!item.marker }] as const), +]); +for (const layout of legacyLayouts) { + for (const target of Object.keys(layout.carried)) { + if (!schemaKeys.has(target) || target.endsWith('_')) { + throw new Error(`legacyLayouts ${layout.platform}: ${target} is not a schema key`); + } + } +} +for (const key of [storeSchema.versionKey, ...schemaKeys.keys()]) { + if (nativeWording.test(key)) { + throw new Error(`storeSchema: key ${key} has update wording (stores are plain text)`); + } +} +const booleanDoc = [ + 'A boolean is stored as one of these; anything else (absent) reads as the', + "field's fallback.", +]; + +// The shared core: the schema and the legacy layouts. +region('cpp/patch_core/stored_items.h', 'schema', [ + `constexpr int kSchemaVersion = ${storeSchema.version};`, + `constexpr const char* kSchemaVersionKey = "${storeSchema.versionKey}";`, + '// The legacy layouts, by the id the hosts pass.', + ...legacyLayouts.map( + ({ platform, id }) => `constexpr int kLegacy${capitalize(platform)} = ${id};` + ), +]); +region( + 'cpp/patch_core/stored_items.cpp', + 'legacy-layouts', + legacyLayouts.flatMap((layout) => [ + ...comment(`${platformLabels[layout.platform]}: ${layout.doc.replace(/\n/g, ' ')}`, 6), + `{kLegacy${capitalize(layout.platform)},`, + ' // Carried: {key, legacy key, marker}.', + ' {', + ...Object.entries(layout.carried).map( + ([to, from]) => + ` {"${to}", ${cppText(from)}, ${schemaKeys.get(to)?.marker ? 'true' : 'false'}},` + ), + ' },', + ' // Dropped.', + ' {', + ...layout.dropped.map((key) => ` ${cppText(key)},`), + ' },', + ` {${layout.droppedPrefixes.map(cppText).join(', ')}}},`, + ]) +); + +// Android. +const javaItems = itemsOn('android'); +region(`${javaDir}/StoreSchema.java`, 'store-schema', [ + `static final int VERSION = ${storeSchema.version};`, + `static final String KEY_SCHEMA_VERSION = "${storeSchema.versionKey}";`, + `static final String STATE_STORE = "${storeSchema.stateStore}";`, + `static final String CACHE_STORE = "${storeSchema.cacheStore}";`, + ...booleanDoc.map((line) => `// ${line}`), + `static final String BOOLEAN_TRUE = "${storeSchema.booleans.true}";`, + `static final String BOOLEAN_FALSE = "${storeSchema.booleans.false}";`, + `static final int LEGACY_LAYOUT = ${layoutOf('android').id};`, + '// Carried by hand when the migration itself cannot run.', + `static final String LEGACY_KEY_UUID = "${layoutOf('android').carried.uuid}";`, + '// The state fields (pushy::state::State).', + ...stateFields.map( + ({ name }) => `static final String KEY_${snake(name)} = "${name}";` + ), + ...javaItems.flatMap(({ name, key, doc }) => [ + ...comment(doc, 4), + `static final String KEY_${snake(name)} = "${key}";`, + ]), +]); +region( + `${javaDir}/StoreSchema.java`, + 'read-state', + stateFields.map(({ name, type, fallback }) => + type === 'boolean' + ? `state.${name} = readBoolean(store, KEY_${snake(name)}, ${fallback});` + : `state.${name} = readString(store, KEY_${snake(name)});` + ) +); +region( + `${javaDir}/StoreSchema.java`, + 'write-state', + stateFields.map(({ name, type }) => + type === 'boolean' + ? `writeBoolean(editor, KEY_${snake(name)}, state.${name});` + : `writeString(editor, KEY_${snake(name)}, state.${name});` + ) +); + +// Harmony. +const etsItems = itemsOn('harmony'); +region(`${ets}/StoreSchema.ts`, 'store-schema', [ + `export const SCHEMA_VERSION = ${storeSchema.version};`, + `export const KEY_SCHEMA_VERSION = '${storeSchema.versionKey}';`, + `export const STATE_STORE = '${storeSchema.stateStore}';`, + `export const CACHE_STORE = '${storeSchema.cacheStore}';`, + ...booleanDoc.map((line) => `// ${line}`), + `export const BOOLEAN_TRUE = '${storeSchema.booleans.true}';`, + `export const BOOLEAN_FALSE = '${storeSchema.booleans.false}';`, + `export const LEGACY_LAYOUT = ${layoutOf('harmony').id};`, + '// Carried by hand when the migration itself cannot run.', + `export const LEGACY_KEY_UUID = '${layoutOf('harmony').carried.uuid}';`, + '// The state fields (pushy::state::State).', + ...stateFields.map(({ name }) => `export const KEY_${snake(name)} = '${name}';`), + ...etsItems.flatMap(({ name, key, doc }) => [ + ...comment(doc), + `export const KEY_${snake(name)} = '${key}';`, + ]), +]); +region( + `${ets}/StoreSchema.ts`, + 'read-state', + stateFields.map(({ name, type, fallback }) => + type === 'boolean' + ? `${name}: readBoolean(store, KEY_${snake(name)}, ${fallback}),` + : `${name}: store.read(KEY_${snake(name)}),` + ) +); +region( + `${ets}/StoreSchema.ts`, + 'write-state', + stateFields.map(({ name, type }) => + type === 'boolean' + ? `writeBoolean(store, KEY_${snake(name)}, state.${name});` + : `writeString(store, KEY_${snake(name)}, state.${name});` + ) +); + +// iOS: the keys are PUSHY_HIDDEN globals the other files declare extern. +const objcItems = itemsOn('ios'); +const objcKeys: [string, string, string | undefined][] = [ + ['SchemaVersion', storeSchema.versionKey, undefined], + ...stateFields.map(({ name }) => [capitalize(name), name, undefined] as [string, string, undefined]), + ...objcItems.map(({ name, key, doc }) => [name, key, doc] as [string, string, string]), +]; +const iosLegacy = layoutOf('ios'); +const iosLegacyKeys = [ + ...Object.values(iosLegacy.carried), + ...iosLegacy.dropped, + ...iosLegacy.droppedPrefixes, +]; +const iosLegacyPrefix = iosLegacyKeys.reduce((prefix, key) => { + let length = 0; + while (length < prefix.length && prefix[length] === key[length]) { + length++; + } + return prefix.slice(0, length); +}); +if (iosLegacyPrefix.length < 8) { + throw new Error('legacyLayouts ios: the legacy keys share no prefix'); +} +region('ios/RCTPushy/RCTPushyState.mm', 'store-schema', [ + `static NSString *const PushyStateStoreName = @"${storeSchema.stateStore}";`, + `static NSString *const PushyCacheStoreName = @"${storeSchema.cacheStore}";`, + ...booleanDoc.map((line) => `// ${line}`), + `static NSString *const PushyBooleanTrue = @"${storeSchema.booleans.true}";`, + `static NSString *const PushyBooleanFalse = @"${storeSchema.booleans.false}";`, + '// Carried by hand when the migration itself cannot run.', + `static NSString *const legacyKeyUuid = @"${iosLegacy.carried.uuid}";`, + '// Every legacy key starts with it: only those are snapshotted (the host app', + '// shares that store).', + `static NSString *const legacyKeyPrefix = @"${iosLegacyPrefix}";`, + ...objcKeys.flatMap(([name, key, doc]) => [ + ...comment(doc), + `PUSHY_HIDDEN NSString *const key${name} = @"${key}";`, + ]), +]); +region( + 'ios/RCTPushy/RCTPushyInternal.h', + 'store-keys', + objcKeys.map(([name]) => `extern PUSHY_HIDDEN NSString *const key${name};`) +); +region( + 'ios/RCTPushy/RCTPushyState.mm', + 'read-state', + stateFields.map(({ name, type, fallback }) => + type === 'boolean' + ? `state.${lowerSnake(name)} = PushyReadBool(defaults, key${capitalize(name)}, ${fallback});` + : `state.${lowerSnake(name)} = PushyToStdString(PushyReadString(defaults, key${capitalize(name)}));` + ) +); +region( + 'ios/RCTPushy/RCTPushyState.mm', + 'write-state', + stateFields.map(({ name, type }) => + type === 'boolean' + ? `PushyWriteBool(defaults, key${capitalize(name)}, state.${lowerSnake(name)});` + : `PushyWriteString(defaults, key${capitalize(name)}, PushyFromStdString(state.${lowerSnake(name)}));` + ) +); + +// Stored-item lifecycle: what a reset / binary upgrade deletes from the state +// store (the cache store's one item is cleared on both, by each platform's +// cache clear). +for (const item of storedItems) { + if (item.cache && item.clearedOn.length !== 2) { + throw new Error(`storedItems ${item.name}: the cache store is cleared on both events`); + } +} const cleared = ( event: Lifecycle, - platform: 'objc' | 'java' | 'arkts', - prefix: boolean + platform: Platform, + prefix: boolean, + name: (item: (typeof storedItems)[number]) => string ) => - storedItems + itemsOn(platform) .filter( - (item) => - item.clearedOn.includes(event) && - !!item.prefix === prefix && - item.keys[platform] !== undefined + (item) => item.clearedOn.includes(event) && !item.cache && !!item.prefix === prefix ) - .map((item) => item.keys[platform] as string); + .map(name); const lifecycleDoc = [ - 'What a reset to the packaged bundle and a binary upgrade delete besides', - 'the state fields (scripts/contract.ts storedItems; every other item survives', - 'both: the uuid, the native config, the round breadcrumb, the bundle hash', - 'cache).', + 'What a reset to the packaged bundle and a binary upgrade delete from the', + 'state store besides the state fields (scripts/contract.ts storedItems;', + 'the cache store is cleared on both, every other item survives both: the', + 'uuid, the native config, the round breadcrumb, the bundle hash cache).', ]; const events: [Lifecycle, string, string][] = [ ['reset', 'Reset', 'RESET'], ['binaryUpgrade', 'Upgrade', 'UPGRADE'], ]; -region( - `${javaDir}/VersionScopedKeys.java`, - 'lifecycle', - [ - ...lifecycleDoc.map((line) => `// ${line}`), - ...events.flatMap(([event, , upper]) => [ - `static final String[] ${upper}_KEYS = {${cleared(event, 'java', false).join(', ')}};`, - `static final String[] ${upper}_PREFIXES = {${cleared(event, 'java', true).join(', ')}};`, - ]), - ] -); -region( - 'ios/RCTPushy/RCTPushyState.mm', - 'lifecycle', - [ - ...lifecycleDoc.map((line) => `// ${line}`), - ...events.flatMap(([event, camel]) => [ - `PUSHY_HIDDEN NSArray *PushyKeysClearedOn${camel}(void) {`, - ` return @[${cleared(event, 'objc', false).join(', ')}];`, - '}', - `PUSHY_HIDDEN NSArray *PushyKeyPrefixesClearedOn${camel}(void) {`, - ` return @[${cleared(event, 'objc', true).join(', ')}];`, - '}', - ]), - ] -); +const javaKey = (item: { name: string }) => `StoreSchema.KEY_${snake(item.name)}`; +region(`${javaDir}/VersionScopedKeys.java`, 'lifecycle', [ + ...lifecycleDoc.map((line) => `// ${line}`), + ...events.flatMap(([event, , upper]) => [ + `static final String[] ${upper}_KEYS = {${cleared(event, 'android', false, javaKey).join(', ')}};`, + `static final String[] ${upper}_PREFIXES = {${cleared(event, 'android', true, javaKey).join(', ')}};`, + ]), +]); +const objcKey = (item: { name: string }) => `key${item.name}`; +region('ios/RCTPushy/RCTPushyState.mm', 'lifecycle', [ + ...lifecycleDoc.map((line) => `// ${line}`), + ...events.flatMap(([event, camel]) => [ + `PUSHY_HIDDEN NSArray *PushyKeysClearedOn${camel}(void) {`, + ` return @[${cleared(event, 'ios', false, objcKey).join(', ')}];`, + '}', + `PUSHY_HIDDEN NSArray *PushyKeyPrefixesClearedOn${camel}(void) {`, + ` return @[${cleared(event, 'ios', true, objcKey).join(', ')}];`, + '}', + ]), +]); +const etsKey = (item: { name: string }) => `KEY_${snake(item.name)}`; region(`${ets}/UpdateContext.ts`, 'lifecycle', [ ...lifecycleDoc.map((line) => `// ${line}`), ...events.flatMap(([event, , upper]) => [ `const ${upper}_CLEARED: ClearedKeys = {`, - ` keys: [${cleared(event, 'arkts', false).join(', ')}],`, - ` prefixes: [${cleared(event, 'arkts', true).join(', ')}],`, + ` keys: [${cleared(event, 'harmony', false, etsKey).join(', ')}],`, + ` prefixes: [${cleared(event, 'harmony', true, etsKey).join(', ')}],`, '};', ]), ]); diff --git a/scripts/test-ios-purge-restore.sh b/scripts/test-ios-purge-restore.sh index a0885066..688f03b0 100755 --- a/scripts/test-ios-purge-restore.sh +++ b/scripts/test-ios-purge-restore.sh @@ -38,6 +38,7 @@ build() { xcrun clang++ -std=c++17 -fobjc-arc -fblocks $WARNING_FLAGS $SANITIZE_FLAGS \ -I"$ROOT_DIR" -I"$destination" -I"$ROOT_DIR/cpp/patch_core" \ "$TEST_DIR/purge_restore_test.mm" "$ROOT_DIR/cpp/patch_core/state_core.cpp" \ + "$ROOT_DIR/cpp/patch_core/stored_items.cpp" \ "$ROOT_DIR/cpp/patch_core/digest.cpp" "$destination/install_record.cpp" \ "$ROOT_DIR"/cpp/update_flow_core/*.cpp \ "$ROOT_DIR/ios/RCTPushy/RCTPushyConfiguration.mm" \ @@ -108,7 +109,8 @@ if [ "${VERIFY_REGRESSIONS:-0}" = "1" ]; then for pair in late-activation:late_commit skip-reresolve:commit_before_signal ignore-reset:reset_wins \ trust-digestless:install_record_activation grandfather-recorded:switch_version_records \ - skip-commit-verify:round_commit_verifies; do + skip-commit-verify:round_commit_verifies skip-carry:legacy_migration_upgrade \ + remove-first:legacy_migration_write_failure; do variant="${pair%:*}" testcase="${pair#*:}" build "$variant" @@ -124,6 +126,8 @@ if [ "${VERIFY_REGRESSIONS:-0}" = "1" ]; then trust-digestless) expected="digest-less record must not activate" ;; grandfather-recorded) expected="recorded current version must be verified" ;; skip-commit-verify) expected="a version failing verification must not be activated by the round commit" ;; + skip-carry) expected="migration must keep the install's uuid" ;; + remove-first) expected="a failed migration must keep the uuid for the next launch" ;; esac if ! grep -F "[FAIL] $testcase: $expected" "$logfile"; then cat "$logfile" >&2 diff --git a/scripts/test-patch-core.sh b/scripts/test-patch-core.sh index bd28c112..d1964d39 100755 --- a/scripts/test-patch-core.sh +++ b/scripts/test-patch-core.sh @@ -73,6 +73,17 @@ c++ \ -o "$BUILD_DIR/resume_plan_test" "$BUILD_DIR/resume_plan_test" "$ROOT_DIR/cpp/patch_core/tests/resume-plan-vectors.json" +# The persisted-layout migration every platform's store delegates to. +c++ \ + -std=c++17 \ + $CORE_WARNINGS \ + $SANITIZE_FLAGS \ + "$ROOT_DIR/cpp/patch_core/tests/stored_items_test.cpp" \ + "$ROOT_DIR/cpp/patch_core/stored_items.cpp" \ + "$ROOT_DIR/cpp/update_flow_core/flow_json.cpp" \ + -o "$BUILD_DIR/stored_items_test" +"$BUILD_DIR/stored_items_test" "$ROOT_DIR/cpp/patch_core/tests/stored-items-vectors.json" + # Opt-in libFuzzer runs of the hbcTransform wire parser (untrusted __diff.json # metadata) and of the whole __diff.json parser: FUZZ=1 bun run test:patch-core. if cpp_test_fuzz_compiler; then diff --git a/scripts/tests/ios-purge-restore/extract.py b/scripts/tests/ios-purge-restore/extract.py index 3bc9c3ea..ef36ca77 100644 --- a/scripts/tests/ios-purge-restore/extract.py +++ b/scripts/tests/ios-purge-restore/extract.py @@ -81,11 +81,13 @@ def declaration(source: str, name: str) -> tuple[int, str]: GLOBALS = [ - 'keyPushyInfo', 'paramPackageVersion', 'paramBuildTime', - 'legacyParamPackageVersion', 'legacyParamBuildTime', 'paramLastVersion', - 'paramCurrentVersion', 'paramIsFirstTime', 'paramIsFirstLoadOk', 'keyUuid', - 'keyHashInfo', 'keyFirstLoadMarked', 'keyRolledBackMarked', - 'keyNativeCheckCache', 'BUNDLE_FILE_NAME', 'ERROR_OPTIONS', + # The persisted keys and value encoding (generated from scripts/contract.ts). + 'keySchemaVersion', 'keyPackageVersion', 'keyBuildTime', 'keyCurrentVersion', + 'keyLastVersion', 'keyFirstTime', 'keyFirstTimeOk', 'keyRolledBackVersion', + 'keyHashInfo', 'keyFirstLoadMarker', 'keyBinaryUpgradedMarker', 'keyCheckCache', + 'keyRoundBreadcrumb', 'keyUuid', 'keyNativeConfig', 'keyBundleHashCache', + 'PushyBooleanTrue', 'PushyBooleanFalse', 'legacyKeyUuid', 'legacyKeyPrefix', + 'BUNDLE_FILE_NAME', 'ERROR_OPTIONS', 'pushyStateLock', 'ignoreRollback', 'pushyIsUsingBundleUrl', 'pushyResetGeneration', 'pushyNativeConfigGeneration', 'pushyLaunchVersion', 'pushyCrashHoldActive', 'pushyPurgeRestoreActive', 'pushyPurgeRestoreWindowOpen', @@ -94,12 +96,16 @@ def declaration(source: str, name: str) -> tuple[int, str]: HELPERS = [ # The exception boundary every entry point uses (CODE_AUDIT 4.4). 'PushyCaughtReason', 'PushyGuard', - 'PushyWithStateLock', 'PushyToStdString', 'PushyFromStdString', 'KeyPackageUpdatedMarked', + 'PushyWithStateLock', 'PushyToStdString', 'PushyFromStdString', # What reset / binary upgrade delete (generated from scripts/contract.ts). 'PushyKeysClearedOnReset', 'PushyKeyPrefixesClearedOnReset', 'PushyKeysClearedOnUpgrade', 'PushyKeyPrefixesClearedOnUpgrade', 'PushyRemoveKeys', 'PushyJsonDictionary', 'PushyJsonString', 'PushyRejectCaught', 'PushyFileQueue', - 'PushySetNullableString', 'PushyHashInfoKey', 'PushyBinaryIdentityValue', + 'PushyHashInfoKey', + # The value encoding, the State mapping and the legacy-layout migration + # (over the shared cpp/patch_core/stored_items.cpp). + 'PushyReadString', 'PushyWriteString', 'PushyReadBool', 'PushyWriteBool', + 'PushyReadMarker', 'PushyWriteMarker', 'PushyDefaultsText', 'PushyMigrateStores', 'PushyStateFromDefaults', 'PushyApplyStateToDefaults', 'PushySwitchVersionLocked', # Canonical config equality (contract C1): the binding over # flowcore::ConfigsEquivalent, tested directly. @@ -116,14 +122,16 @@ def declaration(source: str, name: str) -> tuple[int, str]: # against a scripted engine. Their globals and pure helpers come along; the # IO collaborators are the host's. ROUND_GLOBALS = [ - 'keyNativeConfig', 'keyNativeCheckIncomplete', 'pushyResetGeneration', + 'keyNativeConfig', 'keyRoundBreadcrumb', 'PushyBooleanTrue', 'PushyBooleanFalse', + 'pushyResetGeneration', 'pushyNativeConfigGeneration', 'pushyCrashHoldActive', 'pushyPurgeRestoreActive', 'pushyHostRoundResult', 'pushyHostRoundConfig', 'pushyHostRoundGeneration', 'pushyHostRoundConfigGeneration', 'pushyUnactivatedHash', 'pushyUnactivatedGeneration', 'pushyUnactivatedConfigGeneration', ] ROUND_HELPERS = ['PushyToStdString', 'PushyFromStdString', 'PushyJsonDictionary', - 'PushyHostResult', 'PushyWaitSeconds'] + 'PushyHostResult', 'PushyWaitSeconds', 'PushyReadString', 'PushyReadBool', + 'PushyReadMarker', 'PushyWriteMarker'] ROUND_METHODS = ['runOnce', 'perform', 'download', 'commit', 'finishRound'] # Emitted ahead of HELPERS, which use them. STRUCTS: list[str] = ['PushyVerifiedActivation'] @@ -134,8 +142,10 @@ def declaration(source: str, name: str) -> tuple[int, str]: CORE_MUTATIONS = ('trust-digestless', 'grandfather-recorded') # Mutate the round adapter (round.inc) instead of the purge-restore methods. ROUND_MUTATIONS = ('drop-config-changed',) +# Mutate the legacy-layout migration (a helper in RCTPushyState.mm). +STORE_MUTATIONS = ('skip-carry', 'remove-first') MUTATIONS = ('late-activation', 'skip-reresolve', 'ignore-reset', - 'skip-commit-verify') + CORE_MUTATIONS + ROUND_MUTATIONS + 'skip-commit-verify') + CORE_MUTATIONS + ROUND_MUTATIONS + STORE_MUTATIONS def mutate(text: str, mutation: str) -> str: @@ -157,6 +167,16 @@ def mutate(text: str, mutation: str) -> str: 'drop-config-changed': ( r'event\.Set\("reason", flowjson::Value::String\("config_changed"\)\);', '(void)configGeneration;'), + # Write only the schema: every carried item (the uuid among them) is + # lost while the legacy keys are still deleted. + 'skip-carry': ( + r'\[state setObject:PushyFromStdString\(put\.second\) forKey:PushyFromStdString\(put\.first\)\];', + 'if (put.first == pushy::stored::kSchemaVersionKey) { [state setObject:@"1" forKey:keySchemaVersion]; }'), + # Delete the legacy keys before anything is written, so a failed + # write loses them. + 'remove-first': ( + r'(for \(const auto &put : plan\.puts\) \{)', + r'for (const std::string &key : plan.removes) { [legacy removeObjectForKey:PushyFromStdString(key)]; }\n \1'), # Activate from the round commit without the activation gate (both # the out-of-lock verification and the under-lock re-check). 'skip-commit-verify': [ @@ -203,6 +223,9 @@ def generate(source_dir: Path, output: Path, mutation: str | None = None) -> Non restore = locate(sources, method, 'restorePurgedLaunch') commit = locate(sources, method, 'commitRoundWithGeneration') helpers = [locate(sources, function, name) for name in HELPERS] + if mutation in STORE_MUTATIONS: + helpers = [(path, line, mutate(text, mutation) if name == 'PushyMigrateStores' else text) + for name, (path, line, text) in zip(HELPERS, helpers)] switch_version = locate(sources, method, 'switchVersion') core_path = (source_dir / '..' / '..' / CORE_SOURCE).resolve() core = core_path.read_text(encoding='utf-8') @@ -214,7 +237,7 @@ def generate(source_dir: Path, output: Path, mutation: str | None = None) -> Non core = mutate(core, mutation) elif mutation == 'skip-reresolve': restore = (restore[0], restore[1], mutate(restore[2], mutation)) - elif mutation: + elif mutation and mutation not in STORE_MUTATIONS: commit = (commit[0], commit[1], mutate(commit[2], mutation)) sections = { 'globals.inc': [locate(sources, declaration, name) for name in GLOBALS], diff --git a/scripts/tests/ios-purge-restore/purge_restore_test.mm b/scripts/tests/ios-purge-restore/purge_restore_test.mm index b0d79096..bd2939a8 100644 --- a/scripts/tests/ios-purge-restore/purge_restore_test.mm +++ b/scripts/tests/ios-purge-restore/purge_restore_test.mm @@ -19,6 +19,7 @@ #include "cpp/patch_core/digest.h" #include "cpp/patch_core/install_record.h" #include "cpp/patch_core/native_texts.h" +#include "cpp/patch_core/stored_items.h" #include "cpp/update_flow_core/native_config.h" #include "ios/RCTPushy/RCTPushyCommon.h" @@ -86,6 +87,11 @@ static void MaybeThrow(void) { throw std::length_error("state too large"); } } +// Makes every write to that store throw, as a full disk or a sandbox denial +// surfaces from the preferences daemon. +static id failWritesOn = nil; +// Makes that store's snapshot throw (the migration's first read). +static id failSnapshotOn = nil; // In-memory collaborator, deliberately NOT an NSUserDefaults subclass: inherited // accessors could otherwise reach real preferences without ObserveWrite(). Only @@ -116,7 +122,13 @@ - (instancetype)init { if (self) { _values = [NSMutableDictionary new]; } return self; } -- (void)setObject:(id)value forKey:(NSString *)key { ObserveWrite(); _values[key] = value; } +- (void)setObject:(id)value forKey:(NSString *)key { + ObserveWrite(); + if (self == failWritesOn) { + [NSException raise:NSInternalInconsistencyException format:@"write failed"]; + } + _values[key] = value; +} - (void)removeObjectForKey:(NSString *)key { ObserveWrite(); [_values removeObjectForKey:key]; } - (id)objectForKey:(NSString *)key { MaybeThrow(); return _values[key]; } - (NSString *)stringForKey:(NSString *)key { @@ -129,7 +141,12 @@ - (NSDictionary *)dictionaryForKey:(NSString *)key { id value = _values[key]; return [value isKindOfClass:NSDictionary.class] ? value : nil; } -- (NSDictionary *)dictionaryRepresentation { return [_values copy]; } +- (NSDictionary *)dictionaryRepresentation { + if (self == failSnapshotOn) { + throw std::length_error("snapshot too large"); + } + return [_values copy]; +} - (void)doesNotRecognizeSelector:(SEL)selector { // Fail even if product code catches Objective-C exceptions. Dynamic sends // must not fall through to a real defaults domain or turn into a passed test. @@ -159,7 +176,9 @@ static void DefaultsWriteProbe(NSUserDefaults *defaults) { #endif static TestDefaults *testDefaults; +static TestDefaults *testCacheDefaults; static NSUserDefaults *PushyDefaults(void) { return testDefaults; } +static NSUserDefaults *PushyCacheDefaults(void) { return testCacheDefaults; } static NSTimeInterval PushyMonotonicNow(void) { return 100; } static NSError *PushyErrorWithCode(const char *code, NSString *message) { return [NSError errorWithDomain:@(code) code:1 userInfo:@{NSLocalizedDescriptionKey: message}]; @@ -362,6 +381,7 @@ static void SetUp(Order selected) { processElapsed = 0; networkPath = YES; testDefaults = [TestDefaults new]; + testCacheDefaults = [TestDefaults new]; engine = [RCTPushy new]; root = [NSTemporaryDirectory() stringByAppendingPathComponent:NSUUID.UUID.UUIDString]; NSString *versionDir = [[RCTPushy downloadDir] stringByAppendingPathComponent:@"B"]; @@ -407,6 +427,12 @@ static id Value(NSString *key) { return value; } +static id CacheValue(void) { + __block id value; + PushyWithStateLock(^{ value = [testCacheDefaults objectForKey:keyCheckCache]; }); + return value; +} + static NSDictionary *Info(void) { NSString *json = Value(PushyHashInfoKey(@"B")); return json == nil ? nil : [NSJSONSerialization JSONObjectWithData: @@ -420,7 +446,7 @@ static void ExpectPackaged(NSURL *url) { Expect(state.last_version.empty(), "packaged launch must have no stale last version"); Expect(!state.first_time && state.first_time_ok, "packaged launch must not arm first load"); Expect(state.rolled_back_version.empty(), "purge must not add a rollback mark"); - Expect(Value(keyFirstLoadMarked) == nil, "packaged launch must not report isFirstTime"); + Expect(Value(keyFirstLoadMarker) == nil, "packaged launch must not report isFirstTime"); Expect(pushyLaunchVersion == nil, "packaged launch must not claim B ran"); } @@ -430,11 +456,11 @@ static void ExpectRestored(NSURL *url) { auto state = State(); Expect(state.current_version == "B", "state must select the launched B"); Expect(!state.first_time && !state.first_time_ok, "B first load must be consumed but not acknowledged"); - Expect([Value(keyFirstLoadMarked) boolValue], "B launch must report isFirstTime"); + Expect([Value(keyFirstLoadMarker) isEqual:@"1"], "B launch must report isFirstTime"); Expect([pushyLaunchVersion isEqualToString:@"B"], "running bundle identity must be B"); Expect([Info()[@"purgeRestore"] boolValue], "in-window activation must record purgeRestore"); Expect([Info()[@"forceBootRescue"] boolValue], "other metadata must survive the commit"); - Expect(Value(keyNativeCheckCache) != nil, "successful round must cache its response"); + Expect(CacheValue() != nil, "successful round must cache its response"); } static void Finish(void) { @@ -456,7 +482,7 @@ static void LateCommit(void) { Await(signalAttempted, "late round reached its done signal"); Expect(roundCommitted && !roundActivated, "late round may persist its response but must not activate"); ExpectPackaged(url); - Expect(Value(keyNativeCheckCache) != nil, "late response remains available to JS"); + Expect(CacheValue() != nil, "late response remains available to JS"); Expect(Info() != nil && Info()[@"purgeRestore"] == nil, "non-activation must not claim purgeRestore"); Finish(); } @@ -481,7 +507,7 @@ static void ResetOrdering(Order selected) { } ExpectPackaged(url); Expect(Value(PushyHashInfoKey(@"B")) == nil, "reset must leave no version metadata"); - Expect(Value(keyNativeCheckCache) == nil, "reset must leave no response cache"); + Expect(CacheValue() == nil, "reset must leave no response cache"); Expect([Value(keyUuid) isEqual:@"installation-uuid"], "reset must preserve install identity"); // The failed delete ran after the promise had already resolved, and did // not turn it into a rejection. @@ -735,7 +761,7 @@ static void RoundCommitVerifies(void) { "verification failures are SWITCH_VERSION_FAILED"); Expect(State().current_version == "A", "state must keep the previous version"); Expect(Info() == nil, "a rejected commit writes no version info"); - Expect(Value(keyNativeCheckCache) == nil, "a rejected commit writes no response cache"); + Expect(CacheValue() == nil, "a rejected commit writes no response cache"); // The intact bundle passes the same gate. Expect([@"B" writeToFile:bundle atomically:YES encoding:NSUTF8StringEncoding error:NULL], @@ -756,7 +782,6 @@ static void RoundCommitVerifies(void) { static void BinaryUpgradeClearsVersionKeys(void) { SetUp(Order::ResetFirst); NSString *hashInfoKey = PushyHashInfoKey(@"B"); - NSString *breadcrumb = @"REACTNATIVECN_PUSHY_NATIVE_CHECK_INCOMPLETE_KEY"; PushyWithStateLock(^{ pushy::state::State state; state.package_version = "0.9"; // the previous binary @@ -764,9 +789,9 @@ static void BinaryUpgradeClearsVersionKeys(void) { state.current_version = "B"; PushyApplyStateToDefaults(testDefaults, state); [testDefaults setObject:@"{\"name\":\"B\"}" forKey:hashInfoKey]; - [testDefaults setObject:@YES forKey:keyFirstLoadMarked]; - [testDefaults setObject:@"{}" forKey:keyNativeCheckCache]; - [testDefaults setObject:@YES forKey:breadcrumb]; + PushyWriteMarker(testDefaults, keyFirstLoadMarker, YES); + [testCacheDefaults setObject:@"{}" forKey:keyCheckCache]; + PushyWriteMarker(testDefaults, keyRoundBreadcrumb, YES); }); NSString *rolledBack = nil; NSString *purged = nil; @@ -774,11 +799,11 @@ static void BinaryUpgradeClearsVersionKeys(void) { Expect(State().package_version == "1.0", "the state takes the new binary identity"); Expect(State().current_version.empty(), "the old binary's version is not launched"); Expect(Value(hashInfoKey) == nil, "an upgrade drops the old versions' info"); - Expect(Value(keyFirstLoadMarked) == nil, "an upgrade drops the first-load marker"); - Expect(Value(keyNativeCheckCache) == nil, "an upgrade drops the response cache"); - Expect([Value(KeyPackageUpdatedMarked()) boolValue], "an upgrade is reported to getConstants"); + Expect(Value(keyFirstLoadMarker) == nil, "an upgrade drops the first-load marker"); + Expect(CacheValue() == nil, "an upgrade drops the response cache"); + Expect([Value(keyBinaryUpgradedMarker) isEqual:@"1"], "an upgrade is reported to getConstants"); Expect([Value(keyUuid) isEqual:@"installation-uuid"], "an upgrade keeps the install identity"); - Expect([Value(breadcrumb) boolValue], "an upgrade keeps the round breadcrumb"); + Expect([Value(keyRoundBreadcrumb) isEqual:@"1"], "an upgrade keeps the round breadcrumb"); Expect([[NSFileManager defaultManager] removeItemAtPath:root error:NULL], "remove fixture files"); } @@ -821,6 +846,164 @@ static void CppExceptionBoundary(void) { Expect([[NSFileManager defaultManager] removeItemAtPath:root error:NULL], "remove fixture files"); } +// /, located from this source file +// (/scripts/tests/ios-purge-restore/). +static NSString *RepoFile(NSString *path) { + NSString *repo = [[[[@__FILE__ stringByDeletingLastPathComponent] + stringByDeletingLastPathComponent] stringByDeletingLastPathComponent] + stringByDeletingLastPathComponent]; + return [repo stringByAppendingPathComponent:path]; +} + +static TestDefaults *DefaultsWith(NSDictionary *values) { + TestDefaults *defaults = [TestDefaults new]; + PushyWithStateLock(^{ + for (NSString *key in values) { + [defaults setObject:values[key] forKey:key]; + } + }); + return defaults; +} + +static NSString *Migrate(TestDefaults *state, TestDefaults *legacy) { + __block NSString *result = nil; + PushyWithStateLock(^{ result = PushyMigrateStores(state, legacy); }); + return result; +} + +static NSDictionary *Contents(TestDefaults *defaults) { + __block NSDictionary *contents = nil; + PushyWithStateLock(^{ contents = [defaults dictionaryRepresentation]; }); + return contents; +} + +// The iOS cases of the shared vectors (cpp/patch_core/tests/ +// stored-items-vectors.json) through the real PushyMigrateStores and the +// real core: the snapshot conversion (NSNumber booleans, the legacy info +// dictionary), the order of the writes and the stores afterwards. +static void StoredItemsVectors(void) { + NSData *data = [NSData dataWithContentsOfFile:RepoFile( + @"cpp/patch_core/tests/stored-items-vectors.json")]; + Expect(data != nil, "stored-items-vectors.json is readable"); + NSDictionary *file = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; + int replayed = 0; + for (NSDictionary *vector in file[@"cases"]) { + if (![vector[@"layout"] isEqual:@"ios"]) { + continue; + } + std::string name = std::string("vector \"") + [vector[@"name"] UTF8String] + "\""; + TestDefaults *legacy = DefaultsWith(vector[@"legacy"]); + TestDefaults *state = DefaultsWith(vector[@"current"]); + NSString *result = Migrate(state, legacy); + Expect([result isEqualToString:[vector[@"plan"][@"migrated"] boolValue] ? @"migrated" : @"current"], + (name + ": result").c_str()); + Expect([Contents(state) isEqual:vector[@"after"][@"current"]], (name + ": state store").c_str()); + Expect([Contents(legacy) isEqual:vector[@"after"][@"legacy"]], (name + ": legacy store").c_str()); + Expect([Migrate(state, legacy) isEqualToString:@"current"], (name + ": done means done").c_str()); + ++replayed; + } + Expect(replayed >= 3, "the vectors carry iOS cases"); + std::printf("[PASS] stored_items_vectors: %d shared vectors\n", replayed); +} + +// What an installed SDK up to 10.61 left in standardUserDefaults: version B +// running, its info, the launch markers, the install's own items, and keys +// of the host app. +static NSMutableDictionary *LegacyLayout(NSString *packageVersion, NSString *buildTime) { + return [@{ + @"REACTNATIVECN_PUSHY_PACKAGEVERSION": packageVersion, + @"REACTNATIVECN_PUSHY_BUILDTIME": buildTime, + @"REACTNATIVECN_PUSHY_INFO_KEY": @{@"currentVersion": @"B", @"isFirstTime": @NO, + @"isFirstLoadOK": @YES}, + @"REACTNATIVECN_PUSHY_HASH_B": @"{\"name\":\"B\"}", + @"REACTNATIVECN_PUSHY_FIRSTLOADMARKED_KEY": @YES, + @"REACTNATIVECN_PUSHY_UUID": @"legacy-uuid", + @"REACTNATIVECN_PUSHY_NATIVE_CONFIG_KEY": @"{\"appKey\":\"k\"}", + @"REACTNATIVECN_PUSHY_NATIVE_CHECK_INCOMPLETE_KEY": @YES, + @"REACTNATIVECN_PUSHY_NATIVE_CHECK_RESP_KEY": @"{}", + @"packageVersion": @"host-owned", + @"hostSetting": @"host-owned", + } mutableCopy]; +} + +static void ExpectInstallItemsCarried(TestDefaults *legacy) { + Expect([Value(keyUuid) isEqual:@"legacy-uuid"], "migration must keep the install's uuid"); + Expect([Value(keyNativeConfig) isEqual:@"{\"appKey\":\"k\"}"], "migration keeps the native config"); + Expect([Value(keyRoundBreadcrumb) isEqual:@"1"], "migration keeps the round breadcrumb"); + Expect([Value(keySchemaVersion) isEqual:@"1"], "migration writes the schema"); + Expect([Contents(legacy) isEqual:(@{@"packageVersion": @"host-owned", @"hostSetting": @"host-owned"})], + "migration deletes every legacy key and only those"); +} + +// The first launch of a binary with the new layout: the legacy identity is +// carried, so the upgrade is detected the usual way and drops the old +// binary's version; the install's own items survive it. +static void LegacyMigrationUpgrade(void) { + SetUp(Order::CloseFirst); + testDefaults = [TestDefaults new]; + TestDefaults *legacy = DefaultsWith(LegacyLayout(@"0.9", @"100")); + Expect([Migrate(testDefaults, legacy) isEqualToString:@"migrated"], "the legacy layout is migrated"); + ExpectInstallItemsCarried(legacy); + NSString *rolledBack = nil; + NSString *purged = nil; + NSURL *url = [RCTPushy resolveLaunchBundleURL:&rolledBack purgedVersion:&purged]; + Expect(url == nil, "the new binary launches its packaged bundle"); + Expect(State().package_version == "1.0" && State().build_time == "123", + "the state takes the new binary identity"); + Expect([Value(keyBinaryUpgradedMarker) isEqual:@"1"], "the upgrade is reported to getConstants"); + Expect([Value(keyUuid) isEqual:@"legacy-uuid"], "the upgrade keeps the uuid"); + Expect([Value(keyRoundBreadcrumb) isEqual:@"1"], "the upgrade keeps the breadcrumb"); + Expect([[NSFileManager defaultManager] removeItemAtPath:root error:NULL], "remove fixture files"); +} + +// Same identity (a debug build, whose buildTime is always "0"): no upgrade, +// and the old version is not carried either — the packaged bundle runs. +static void LegacyMigrationSameBinary(void) { + SetUp(Order::CloseFirst); + testDefaults = [TestDefaults new]; + TestDefaults *legacy = DefaultsWith(LegacyLayout(@"1.0", @"123")); + Expect([Migrate(testDefaults, legacy) isEqualToString:@"migrated"], "the legacy layout is migrated"); + ExpectInstallItemsCarried(legacy); + NSString *rolledBack = nil; + NSString *purged = nil; + NSURL *url = [RCTPushy resolveLaunchBundleURL:&rolledBack purgedVersion:&purged]; + Expect(url == nil, "the old version's state is not carried"); + Expect(Value(keyBinaryUpgradedMarker) == nil, "the same binary is no upgrade"); + Expect(Value(PushyHashInfoKey(@"B")) == nil, "no version info is carried"); + Expect(Value(keyFirstLoadMarker) == nil, "no launch marker is carried"); + Expect([[NSFileManager defaultManager] removeItemAtPath:root error:NULL], "remove fixture files"); +} + +// A write that fails leaves the legacy keys in place (they are deleted only +// after every write), so the next launch migrates the same uuid. +static void LegacyMigrationWriteFailure(void) { + TestDefaults *state = [TestDefaults new]; + TestDefaults *legacy = DefaultsWith(LegacyLayout(@"0.9", @"100")); + failWritesOn = state; + NSString *result = Migrate(state, legacy); + failWritesOn = nil; + Expect([result isEqualToString:@"fallback"], "a failed write falls back"); + Expect(Contents(state).count == 0, "nothing landed"); + Expect([Migrate(state, legacy) isEqualToString:@"migrated"], "the next launch migrates"); + Expect([[state stringForKey:keyUuid] isEqual:@"legacy-uuid"], + "a failed migration must keep the uuid for the next launch"); +} + +// The core cannot run (its snapshot throws): a fresh store that still carries +// the uuid, and no schema, so the next launch migrates the rest. +static void LegacyMigrationReadFailure(void) { + TestDefaults *state = [TestDefaults new]; + TestDefaults *legacy = DefaultsWith(LegacyLayout(@"0.9", @"100")); + failSnapshotOn = legacy; + NSString *result = Migrate(state, legacy); + failSnapshotOn = nil; + Expect([result isEqualToString:@"fallback"], "an unreadable legacy store falls back"); + Expect([Contents(state) isEqual:@{keyUuid: @"legacy-uuid"}], "the fallback carries the uuid alone"); + Expect([Migrate(state, legacy) isEqualToString:@"migrated"], "the next launch migrates"); + Expect([[state stringForKey:keyNativeConfig] isEqual:@"{\"appKey\":\"k\"}"], + "the next launch carries the rest"); +} + int main(int argc, char **argv) { @autoreleasepool { // These intentional failures run in separate processes. Erasing the @@ -856,6 +1039,11 @@ int main(int argc, char **argv) { {"round_commit_verifies", RoundCommitVerifies}, {"binary_upgrade_clears_version_keys", BinaryUpgradeClearsVersionKeys}, {"cpp_exception_boundary", CppExceptionBoundary}, + {"stored_items_vectors", StoredItemsVectors}, + {"legacy_migration_upgrade", LegacyMigrationUpgrade}, + {"legacy_migration_same_binary", LegacyMigrationSameBinary}, + {"legacy_migration_write_failure", LegacyMigrationWriteFailure}, + {"legacy_migration_read_failure", LegacyMigrationReadFailure}, }; int ran = 0; for (const auto &test : cases) { diff --git a/scripts/tests/ios-purge-restore/round_replay_test.mm b/scripts/tests/ios-purge-restore/round_replay_test.mm index ba6e4b24..9fecf023 100644 --- a/scripts/tests/ios-purge-restore/round_replay_test.mm +++ b/scripts/tests/ios-purge-restore/round_replay_test.mm @@ -452,7 +452,7 @@ static void Replay(const Value &steps) { Expect(downloaded && !activated ? [pushyUnactivatedHash isEqualToString:hash] : pushyUnactivatedHash == nil, "unactivated hash"); // However the round ends, the breadcrumb does not survive it. - Expect([testDefaults objectForKey:keyNativeCheckIncomplete] == nil, "breadcrumb survived"); + Expect([testDefaults objectForKey:keyRoundBreadcrumb] == nil, "breadcrumb survived"); } int main(int argc, const char **argv) { diff --git a/scripts/tests/ios-purge-restore/test_extract.py b/scripts/tests/ios-purge-restore/test_extract.py index c5dba656..13b9bea5 100644 --- a/scripts/tests/ios-purge-restore/test_extract.py +++ b/scripts/tests/ios-purge-restore/test_extract.py @@ -76,6 +76,11 @@ def test_mutations_fail_on_source_drift(self): mutate('event.Set("reason", flowjson::Value::String("config_changed"));', 'drop-config-changed'), '(void)configGeneration;') + self.assertIn('kSchemaVersionKey', mutate( + '[state setObject:PushyFromStdString(put.second) forKey:PushyFromStdString(put.first)];', + 'skip-carry')) + self.assertTrue(mutate('for (const auto &put : plan.puts) {', 'remove-first') + .startswith('for (const std::string &key : plan.removes)')) for source in ('', 'activation = nil; activation = nil;'): with self.assertRaises(ValueError): mutate(source, 'late-activation') diff --git a/src/__tests__/harmonyStateLifecycle.test.ts b/src/__tests__/harmonyStateLifecycle.test.ts index a22bcb54..4f5f119a 100644 --- a/src/__tests__/harmonyStateLifecycle.test.ts +++ b/src/__tests__/harmonyStateLifecycle.test.ts @@ -1,10 +1,12 @@ import { describe, expect, test } from 'bun:test'; import { storedItems } from '../../scripts/contract'; -import { evalHarmonyModule } from './nativeSources'; +import { evalHarmonyModule, harmonyStoreSchema, source } from './nativeSources'; -// What a reset to the packaged bundle and a binary upgrade delete on Harmony: -// the generated lists (scripts/contract.ts storedItems) through the actual -// UpdateContext.removeKeys, against a store holding every kind of key. +// The Harmony side of the persisted layout (scripts/contract.ts storeSchema): +// what a reset to the packaged bundle and a binary upgrade delete, through +// the actual UpdateContext.removeKeys, and the one-time migration out of the +// legacy layout, through the actual StoreSchema.migrateStore, against the +// shared vectors (cpp/patch_core/tests/stored-items-vectors.json). interface ClearedKeys { keys: string[]; @@ -13,12 +15,12 @@ interface ClearedKeys { function lifecycleHarness() { const values = new Map([ + ['schemaVersion', '1'], ['uuid', 'installation-id'], ['nativeConfig', '{"appKey":"k"}'], ['bundleHashCache', '1.0|1|sha'], ['nativeCheckIncomplete', '1'], - ['nativeCheckResp', '{}'], - ['firstLoadMarked', 'true'], + ['firstLoadMarked', '1'], ['hash_a', '{"name":"a"}'], ['hash_b', '{"name":"b"}'], ['currentVersion', 'a'], @@ -35,9 +37,8 @@ function lifecycleHarness() { store.preferences = preferences; ({ store, RESET_CLEARED, UPGRADE_CLEARED });`, { + ...harmonyStoreSchema(), preferences, - KEY_CONFIG: 'nativeConfig', - KEY_RESP_CACHE: 'nativeCheckResp', logger: { error() {} }, getErrorMessage: (error: unknown) => String(error), } @@ -51,6 +52,7 @@ function lifecycleHarness() { // The install's own keys and the state fields (rewritten by the state core). const survivors = [ + 'schemaVersion', 'uuid', 'nativeConfig', 'bundleHashCache', @@ -77,4 +79,209 @@ describe('harmony stored-item lifecycle', () => { ); } }); + + test('the state mapping writes text and reads it back', () => { + const schema = harmonyStoreSchema() as { + readState: (store: unknown) => Record; + writeState: (store: unknown, state: Record) => void; + }; + const values = new Map(); + const store = { + read: (key: string) => values.get(key) ?? '', + write: (key: string, value: string) => values.set(key, value), + remove: (key: string) => values.delete(key), + }; + expect(schema.readState(store)).toMatchObject({ + firstTime: false, + firstTimeOk: true, + currentVersion: '', + }); + const state = { + packageVersion: '1.0', + buildTime: '1700', + currentVersion: 'b', + lastVersion: '', + firstTime: true, + firstTimeOk: false, + rolledBackVersion: '', + }; + schema.writeState(store, state); + expect(Object.fromEntries(values)).toEqual({ + packageVersion: '1.0', + buildTime: '1700', + currentVersion: 'b', + firstTime: '1', + firstTimeOk: '0', + }); + expect(schema.readState(store)).toEqual(state); + }); +}); + +type Value = string | boolean | number | Record | unknown[]; +interface Plan { + schemaVersion: number; + migrated: boolean; + puts: [string, string][]; + removes: string[]; +} +interface Vector { + name: string; + layout: string | number; + legacy: Record; + current: Record; + plan: Plan | null; + after: { legacy: Record; current: Record }; +} + +const vectors = JSON.parse( + source('cpp/patch_core/tests/stored-items-vectors.json') +).cases as Vector[]; + +// How the core reads a legacy value (see the vectors' doc). +const text = (value: Value) => + typeof value === 'string' + ? value + : typeof value === 'boolean' + ? value + ? '1' + : '0' + : typeof value === 'number' + ? String(value) + : ''; + +interface MigrationStore { + snapshot(): Record; + put(key: string, value: string): void; + remove(key: string): void; + flush(): Promise; +} + +function fakeStore(initial: Record) { + const values = new Map(Object.entries(initial)); + const failures = { flush: false }; + const store: MigrationStore = { + snapshot: () => Object.fromEntries(values), + put: (key, value) => values.set(key, value), + remove: (key) => values.delete(key), + flush: async () => { + if (failures.flush) { + throw new Error('disk full'); + } + }, + }; + return { values, store, failures }; +} + +const schema = harmonyStoreSchema() as { + LEGACY_LAYOUT: number; + migrateStore: ( + state: MigrationStore, + legacy: MigrationStore, + planner: (layout: number, legacy: string[], current: string[]) => string + ) => Promise; +}; + +const pairs = (flat: string[]) => + Object.fromEntries( + flat.flatMap((_, i) => (i % 2 === 0 ? [[flat[i], flat[i + 1]]] : [])) + ); + +describe('harmony state store migration', () => { + for (const vector of vectors.filter((candidate) => candidate.plan)) { + test(vector.name, async () => { + const legacy = fakeStore(vector.legacy); + const state = fakeStore(vector.current); + const result = await schema.migrateStore( + state.store, + legacy.store, + (layout, legacyFlat, currentFlat) => { + // The snapshots reach the core as the vectors read them. + expect(layout).toBe(schema.LEGACY_LAYOUT); + expect(pairs(legacyFlat)).toEqual( + Object.fromEntries( + Object.entries(vector.legacy).map(([key, value]) => [ + key, + text(value), + ]) + ) + ); + expect(pairs(currentFlat)).toEqual(vector.current); + return JSON.stringify(vector.plan); + } + ); + expect(result).toBe(vector.plan?.migrated ? 'migrated' : 'current'); + expect(Object.fromEntries(state.values)).toEqual(vector.after.current); + expect(Object.fromEntries(legacy.values)).toEqual(vector.after.legacy); + }); + } + + const full = vectors[0]; + const plan = () => JSON.stringify(full.plan); + + test('the legacy keys stay until the state store is on disk', async () => { + const legacy = fakeStore(full.legacy); + const state = fakeStore({}); + state.failures.flush = true; + expect(await schema.migrateStore(state.store, legacy.store, plan)).toBe( + 'retry' + ); + expect(Object.fromEntries(legacy.values)).toEqual(full.legacy); + // The puts are in memory: this launch already reads the migrated items. + expect(state.values.get('uuid')).toBe('install-uuid'); + }); + + // The next launch finishes the deletes (the "killed after the puts" vector). + test('a failed legacy delete does not fail the migration', async () => { + const legacy = fakeStore(full.legacy); + const state = fakeStore({}); + legacy.failures.flush = true; + expect(await schema.migrateStore(state.store, legacy.store, plan)).toBe( + 'migrated' + ); + expect(Object.fromEntries(state.values)).toEqual(full.after.current); + }); + + for (const [what, planner] of [ + [ + 'the core throws', + () => { + throw new Error('bad_alloc'); + }, + ], + ['the core has no plan', () => 'null'], + ] as const) { + test(`${what}: a fresh state store that keeps the uuid, retried next launch`, async () => { + const legacy = fakeStore(full.legacy); + const state = fakeStore({}); + expect( + await schema.migrateStore(state.store, legacy.store, planner) + ).toBe('fallback'); + expect(Object.fromEntries(state.values)).toEqual({ + uuid: 'install-uuid', + }); + expect(Object.fromEntries(legacy.values)).toEqual(full.legacy); + // Next launch: the core works again and completes the move. + expect(await schema.migrateStore(state.store, legacy.store, plan)).toBe( + 'migrated' + ); + expect(Object.fromEntries(state.values)).toEqual(full.after.current); + expect(Object.fromEntries(legacy.values)).toEqual(full.after.legacy); + }); + } + + // Negative control: a store adapter that ignored the plan's order and + // deleted the legacy keys before the state store was durable would lose the + // uuid on a failed flush; the real one does not. + test('the uuid survives a failed flush followed by a fallback launch', async () => { + const legacy = fakeStore(full.legacy); + const state = fakeStore({}); + state.failures.flush = true; + await schema.migrateStore(state.store, legacy.store, plan); + // The process dies: memory is lost, only the legacy store is on disk. + const relaunched = fakeStore({}); + expect( + await schema.migrateStore(relaunched.store, legacy.store, () => 'null') + ).toBe('fallback'); + expect(relaunched.values.get('uuid')).toBe('install-uuid'); + }); }); diff --git a/src/__tests__/harmonySyncRound.test.ts b/src/__tests__/harmonySyncRound.test.ts index cb278864..27a20cac 100644 --- a/src/__tests__/harmonySyncRound.test.ts +++ b/src/__tests__/harmonySyncRound.test.ts @@ -8,7 +8,7 @@ import { createPushyError, PushyError, } from '../../harmony/pushy/src/main/ets/ErrorCodes'; -import { evalHarmonyModule } from './nativeSources'; +import { evalHarmonyModule, harmonyStoreSchema } from './nativeSources'; // The Harmony adapter of the shared round engine (SyncCoordinator.runOnce), // evaluated from source against the rounds in @@ -133,6 +133,7 @@ async function replay(round: Round) { 'SyncCoordinator.ts', 'httpRequest = fakeHttp;\n({ run: runOnce, result: () => roundResult });', { + ...harmonyStoreSchema(), BundlePreparationRound, bundlePreparationResult, PushyError, diff --git a/src/__tests__/nativeConfiguration.test.ts b/src/__tests__/nativeConfiguration.test.ts index b8c252e7..e79405fc 100644 --- a/src/__tests__/nativeConfiguration.test.ts +++ b/src/__tests__/nativeConfiguration.test.ts @@ -1,5 +1,9 @@ import { describe, expect, test } from 'bun:test'; -import { evalHarmonyModule, harmonyConfigBindings } from './nativeSources'; +import { + evalHarmonyModule, + harmonyConfigBindings, + harmonyStoreSchema, +} from './nativeSources'; // Option validation (normalizePushyConfiguration) is the shared core's // NormalizeConfiguration, covered by cpp/update_flow_core/tests/ @@ -19,6 +23,7 @@ interface ConfigStore { function storeHarness() { const values = new Map(); + const cacheValues = new Map(); let flushes = 0; let shouldFail = false; const clearedSignals: string[] = []; @@ -31,14 +36,27 @@ function storeHarness() { if (shouldFail) throw new Error('storage unavailable'); }, }; + const cachePreferences = { + getSync: (key: string, fallback: string) => + cacheValues.get(key) ?? fallback, + putSync: (key: string, value: string) => cacheValues.set(key, value), + deleteSync: (key: string) => cacheValues.delete(key), + flush: async () => { + if (shouldFail) throw new Error('storage unavailable'); + }, + }; const store = evalHarmonyModule( 'UpdateContext.ts', - 'const store = Object.create(UpdateContext.prototype); store.preferences = preferences; store.flushBatchDepth = 0; store;', + `const store = Object.create(UpdateContext.prototype); + store.preferences = preferences; + store.cachePreferences = cachePreferences; + store.flushBatchDepth = 0; + store;`, { + ...harmonyStoreSchema(), preferences, + cachePreferences, util: { generateRandomUUID: () => 'native-installation-id' }, - KEY_CONFIG: 'nativeConfig', - KEY_RESP_CACHE: 'nativeCheckResp', recordJsRound: (config: string) => clearedSignals.push(config), logger: { error() {} }, getErrorMessage: (error: unknown) => String(error), @@ -48,10 +66,12 @@ function storeHarness() { return { store, values, + cacheValues, clearedSignals, fail: (value: boolean) => { shouldFail = value; }, + // The state store's flushes. flushes: () => flushes, }; } @@ -61,9 +81,9 @@ describe('actual native configuration store', () => { const h = storeHarness(); await h.store.setNativeConfig('A'); const oldGeneration = h.store.getResetGeneration(); - h.values.set('nativeCheckResp', 'stale'); + h.cacheValues.set('nativeCheckResp', 'stale'); await h.store.setNativeConfig('B'); - expect(h.values.has('nativeCheckResp')).toBe(false); + expect(h.cacheValues.has('nativeCheckResp')).toBe(false); await h.store.setNativeConfig('A'); expect(h.store.getResetGeneration()).toBe(oldGeneration + 2); expect( diff --git a/src/__tests__/nativeHostApi.test.ts b/src/__tests__/nativeHostApi.test.ts index de3df080..ce087ccb 100644 --- a/src/__tests__/nativeHostApi.test.ts +++ b/src/__tests__/nativeHostApi.test.ts @@ -6,7 +6,11 @@ import { bundlePreparationResult, } from '../../harmony/pushy/src/main/ets/BundlePreparationResult'; import { STATUS_NONE } from '../../harmony/pushy/src/main/ets/Texts'; -import { evalHarmonyModule, harmonyConfigBindings } from './nativeSources'; +import { + evalHarmonyModule, + harmonyConfigBindings, + harmonyStoreSchema, +} from './nativeSources'; // Evaluate the actual Harmony orchestrator in an isolated VM per test. Only // platform imports, HTTP, download IO and the round engine are substituted @@ -189,6 +193,7 @@ function harness() { 'SyncCoordinator.ts', 'httpRequest = mockCheck;\n({ check: prepareBundleNative, schedule: scheduleNativeSync });', { + ...harmonyStoreSchema(), BundlePreparationRound, bundlePreparationResult, logger: { info() {}, warn() {}, error() {} }, diff --git a/src/__tests__/nativeSources.ts b/src/__tests__/nativeSources.ts index 35a8fb0a..ff5affd1 100644 --- a/src/__tests__/nativeSources.ts +++ b/src/__tests__/nativeSources.ts @@ -90,3 +90,25 @@ export const harmonyConfigBindings = { return trimmed ? JSON.stringify({ appKey: trimmed }) : invalid; }, }; + +/** + * The exports of harmony/pushy/src/main/ets/StoreSchema.ts (the generated + * keys and the store mapping), for modules evaluated with their imports + * stripped. + */ +export const harmonyStoreSchema = ( + logger: Record void> = { + info() {}, + warn() {}, + error() {}, + } +): Record => { + const names = [ + ...source('harmony/pushy/src/main/ets/StoreSchema.ts').matchAll( + /^export (?:const|function) (\w+)/gm + ), + ].map((match) => match[1]); + return evalHarmonyModule('StoreSchema.ts', `({ ${names.join(', ')} })`, { + logger, + }) as Record; +};