@rs-native-kit/version-check 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (371) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +256 -0
  3. package/VersionCheck.podspec +20 -0
  4. package/android/build.gradle +56 -0
  5. package/android/src/main/AndroidManifest.xml +9 -0
  6. package/android/src/main/java/com/rsnativekit/versioncheck/SecureStorageCipher.kt +57 -0
  7. package/android/src/main/java/com/rsnativekit/versioncheck/VersionCheckHeadlessTaskService.kt +31 -0
  8. package/android/src/main/java/com/rsnativekit/versioncheck/VersionCheckModule.kt +215 -0
  9. package/android/src/main/java/com/rsnativekit/versioncheck/VersionCheckPackage.kt +31 -0
  10. package/android/src/main/java/com/rsnativekit/versioncheck/VersionCheckWorker.kt +29 -0
  11. package/ios/PlatformBridge/Ed25519Verifier.swift +19 -0
  12. package/ios/VersionCheck.h +5 -0
  13. package/ios/VersionCheck.mm +278 -0
  14. package/lib/module/data/cache/MemoryCacheStore.js +30 -0
  15. package/lib/module/data/cache/MemoryCacheStore.js.map +1 -0
  16. package/lib/module/data/cache/PersistentCacheStore.js +56 -0
  17. package/lib/module/data/cache/PersistentCacheStore.js.map +1 -0
  18. package/lib/module/data/config/ConfigCache.js +29 -0
  19. package/lib/module/data/config/ConfigCache.js.map +1 -0
  20. package/lib/module/data/config/ConfigDocumentValidator.js +185 -0
  21. package/lib/module/data/config/ConfigDocumentValidator.js.map +1 -0
  22. package/lib/module/data/config/ConfigLoader.js +82 -0
  23. package/lib/module/data/config/ConfigLoader.js.map +1 -0
  24. package/lib/module/data/config/ConfigProvider.js +58 -0
  25. package/lib/module/data/config/ConfigProvider.js.map +1 -0
  26. package/lib/module/data/config/ConfigResolutionPipeline.js +268 -0
  27. package/lib/module/data/config/ConfigResolutionPipeline.js.map +1 -0
  28. package/lib/module/data/config/ConfigValidator.js +69 -0
  29. package/lib/module/data/config/ConfigValidator.js.map +1 -0
  30. package/lib/module/data/config/SignatureVerifier.js +80 -0
  31. package/lib/module/data/config/SignatureVerifier.js.map +1 -0
  32. package/lib/module/data/config/canonicalize.js +88 -0
  33. package/lib/module/data/config/canonicalize.js.map +1 -0
  34. package/lib/module/data/config/sources/EnvironmentOverrideSource.js +20 -0
  35. package/lib/module/data/config/sources/EnvironmentOverrideSource.js.map +1 -0
  36. package/lib/module/data/config/sources/LocalConfigSource.js +22 -0
  37. package/lib/module/data/config/sources/LocalConfigSource.js.map +1 -0
  38. package/lib/module/data/config/sources/RemoteConfigSource.js +38 -0
  39. package/lib/module/data/config/sources/RemoteConfigSource.js.map +1 -0
  40. package/lib/module/data/providers/amazon/AmazonAppstoreProvider.js +13 -0
  41. package/lib/module/data/providers/amazon/AmazonAppstoreProvider.js.map +1 -0
  42. package/lib/module/data/providers/apple/AppleStoreProvider.js +67 -0
  43. package/lib/module/data/providers/apple/AppleStoreProvider.js.map +1 -0
  44. package/lib/module/data/providers/custom-api/CustomApiProvider.js +51 -0
  45. package/lib/module/data/providers/custom-api/CustomApiProvider.js.map +1 -0
  46. package/lib/module/data/providers/firebase-remote-config/FirebaseRemoteConfigProvider.js +13 -0
  47. package/lib/module/data/providers/firebase-remote-config/FirebaseRemoteConfigProvider.js.map +1 -0
  48. package/lib/module/data/providers/google-play/GooglePlayProvider.js +62 -0
  49. package/lib/module/data/providers/google-play/GooglePlayProvider.js.map +1 -0
  50. package/lib/module/data/providers/huawei/HuaweiAppGalleryProvider.js +18 -0
  51. package/lib/module/data/providers/huawei/HuaweiAppGalleryProvider.js.map +1 -0
  52. package/lib/module/data/repositories/VersionRepositoryImpl.js +69 -0
  53. package/lib/module/data/repositories/VersionRepositoryImpl.js.map +1 -0
  54. package/lib/module/di/container.js +80 -0
  55. package/lib/module/di/container.js.map +1 -0
  56. package/lib/module/domain/IVersionManagerCore.js +4 -0
  57. package/lib/module/domain/IVersionManagerCore.js.map +1 -0
  58. package/lib/module/domain/VersionManagerCore.js +276 -0
  59. package/lib/module/domain/VersionManagerCore.js.map +1 -0
  60. package/lib/module/domain/engines/decision/DecisionEngine.js +40 -0
  61. package/lib/module/domain/engines/decision/DecisionEngine.js.map +1 -0
  62. package/lib/module/domain/engines/policy/IUpdatePolicyEngine.js +4 -0
  63. package/lib/module/domain/engines/policy/IUpdatePolicyEngine.js.map +1 -0
  64. package/lib/module/domain/engines/policy/PolicyEngine.js +42 -0
  65. package/lib/module/domain/engines/policy/PolicyEngine.js.map +1 -0
  66. package/lib/module/domain/engines/semver/IVersionComparator.js +4 -0
  67. package/lib/module/domain/engines/semver/IVersionComparator.js.map +1 -0
  68. package/lib/module/domain/engines/semver/SemVerEngine.js +176 -0
  69. package/lib/module/domain/engines/semver/SemVerEngine.js.map +1 -0
  70. package/lib/module/domain/errors/VersionManagerException.js +104 -0
  71. package/lib/module/domain/errors/VersionManagerException.js.map +1 -0
  72. package/lib/module/domain/models/ActionPlan.js +9 -0
  73. package/lib/module/domain/models/ActionPlan.js.map +1 -0
  74. package/lib/module/domain/models/ConfigDocument.js +4 -0
  75. package/lib/module/domain/models/ConfigDocument.js.map +1 -0
  76. package/lib/module/domain/models/Events.js +4 -0
  77. package/lib/module/domain/models/Events.js.map +1 -0
  78. package/lib/module/domain/models/LifecycleState.js +29 -0
  79. package/lib/module/domain/models/LifecycleState.js.map +1 -0
  80. package/lib/module/domain/models/ParsedVersion.js +2 -0
  81. package/lib/module/domain/models/ParsedVersion.js.map +1 -0
  82. package/lib/module/domain/models/PlatformId.js +2 -0
  83. package/lib/module/domain/models/PlatformId.js.map +1 -0
  84. package/lib/module/domain/models/PublicApiOptions.js +2 -0
  85. package/lib/module/domain/models/PublicApiOptions.js.map +1 -0
  86. package/lib/module/domain/models/RemoteVersionInfo.js +4 -0
  87. package/lib/module/domain/models/RemoteVersionInfo.js.map +1 -0
  88. package/lib/module/domain/models/StoreLookup.js +2 -0
  89. package/lib/module/domain/models/StoreLookup.js.map +1 -0
  90. package/lib/module/domain/models/Unsubscribe.js +2 -0
  91. package/lib/module/domain/models/Unsubscribe.js.map +1 -0
  92. package/lib/module/domain/models/UpdateInfo.js +4 -0
  93. package/lib/module/domain/models/UpdateInfo.js.map +1 -0
  94. package/lib/module/domain/models/VersionManagerOptions.js +4 -0
  95. package/lib/module/domain/models/VersionManagerOptions.js.map +1 -0
  96. package/lib/module/domain/ports/ICacheStore.js +2 -0
  97. package/lib/module/domain/ports/ICacheStore.js.map +1 -0
  98. package/lib/module/domain/ports/IClock.js +2 -0
  99. package/lib/module/domain/ports/IClock.js.map +1 -0
  100. package/lib/module/domain/ports/IConfigProvider.js +4 -0
  101. package/lib/module/domain/ports/IConfigProvider.js.map +1 -0
  102. package/lib/module/domain/ports/IConfigSources.js +4 -0
  103. package/lib/module/domain/ports/IConfigSources.js.map +1 -0
  104. package/lib/module/domain/ports/IPlatformBridge.js +4 -0
  105. package/lib/module/domain/ports/IPlatformBridge.js.map +1 -0
  106. package/lib/module/domain/ports/IStoreProvider.js +4 -0
  107. package/lib/module/domain/ports/IStoreProvider.js.map +1 -0
  108. package/lib/module/domain/ports/IVersionRepository.js +4 -0
  109. package/lib/module/domain/ports/IVersionRepository.js.map +1 -0
  110. package/lib/module/domain/statemachine/LifecycleStateMachine.js +55 -0
  111. package/lib/module/domain/statemachine/LifecycleStateMachine.js.map +1 -0
  112. package/lib/module/domain/usecases/CheckForUpdatesUseCase.js +31 -0
  113. package/lib/module/domain/usecases/CheckForUpdatesUseCase.js.map +1 -0
  114. package/lib/module/domain/usecases/ForceTriggerUpdateUseCase.js +20 -0
  115. package/lib/module/domain/usecases/ForceTriggerUpdateUseCase.js.map +1 -0
  116. package/lib/module/domain/usecases/ResetIgnoredVersionsUseCase.js +24 -0
  117. package/lib/module/domain/usecases/ResetIgnoredVersionsUseCase.js.map +1 -0
  118. package/lib/module/index.js +10 -0
  119. package/lib/module/index.js.map +1 -0
  120. package/lib/module/package.json +1 -0
  121. package/lib/module/platform/contracts/IPlatformBridge.js +2 -0
  122. package/lib/module/platform/contracts/IPlatformBridge.js.map +1 -0
  123. package/lib/module/platform/createPlatformBridge.js +17 -0
  124. package/lib/module/platform/createPlatformBridge.js.map +1 -0
  125. package/lib/module/platform/createPlatformBridge.native.js +9 -0
  126. package/lib/module/platform/createPlatformBridge.native.js.map +1 -0
  127. package/lib/module/platform/native/NativePlatformBridge.js +143 -0
  128. package/lib/module/platform/native/NativePlatformBridge.js.map +1 -0
  129. package/lib/module/platform/native/NativeVersionCheck.js +33 -0
  130. package/lib/module/platform/native/NativeVersionCheck.js.map +1 -0
  131. package/lib/module/platform/web/WebPlatformBridge.js +228 -0
  132. package/lib/module/platform/web/WebPlatformBridge.js.map +1 -0
  133. package/lib/module/presentation/components/ForceUpdateScreen.js +68 -0
  134. package/lib/module/presentation/components/ForceUpdateScreen.js.map +1 -0
  135. package/lib/module/presentation/components/OptionalUpdateBanner.js +69 -0
  136. package/lib/module/presentation/components/OptionalUpdateBanner.js.map +1 -0
  137. package/lib/module/presentation/components/SoftUpdateDialog.js +101 -0
  138. package/lib/module/presentation/components/SoftUpdateDialog.js.map +1 -0
  139. package/lib/module/presentation/hooks/VersionManagerProvider.js +18 -0
  140. package/lib/module/presentation/hooks/VersionManagerProvider.js.map +1 -0
  141. package/lib/module/presentation/hooks/context.js +5 -0
  142. package/lib/module/presentation/hooks/context.js.map +1 -0
  143. package/lib/module/presentation/hooks/useUpdateState.js +26 -0
  144. package/lib/module/presentation/hooks/useUpdateState.js.map +1 -0
  145. package/lib/module/presentation/hooks/useVersionManager.js +33 -0
  146. package/lib/module/presentation/hooks/useVersionManager.js.map +1 -0
  147. package/lib/module/presentation/state/VersionManagerStore.js +47 -0
  148. package/lib/module/presentation/state/VersionManagerStore.js.map +1 -0
  149. package/lib/module/publicApi.js +114 -0
  150. package/lib/module/publicApi.js.map +1 -0
  151. package/lib/module/shared/eventbus/EventBus.js +34 -0
  152. package/lib/module/shared/eventbus/EventBus.js.map +1 -0
  153. package/lib/module/shared/logging/Logger.js +56 -0
  154. package/lib/module/shared/logging/Logger.js.map +1 -0
  155. package/lib/module/ui.js +13 -0
  156. package/lib/module/ui.js.map +1 -0
  157. package/lib/typescript/package.json +1 -0
  158. package/lib/typescript/src/data/cache/MemoryCacheStore.d.ts +12 -0
  159. package/lib/typescript/src/data/cache/MemoryCacheStore.d.ts.map +1 -0
  160. package/lib/typescript/src/data/cache/PersistentCacheStore.d.ts +14 -0
  161. package/lib/typescript/src/data/cache/PersistentCacheStore.d.ts.map +1 -0
  162. package/lib/typescript/src/data/config/ConfigCache.d.ts +15 -0
  163. package/lib/typescript/src/data/config/ConfigCache.d.ts.map +1 -0
  164. package/lib/typescript/src/data/config/ConfigDocumentValidator.d.ts +20 -0
  165. package/lib/typescript/src/data/config/ConfigDocumentValidator.d.ts.map +1 -0
  166. package/lib/typescript/src/data/config/ConfigLoader.d.ts +28 -0
  167. package/lib/typescript/src/data/config/ConfigLoader.d.ts.map +1 -0
  168. package/lib/typescript/src/data/config/ConfigProvider.d.ts +30 -0
  169. package/lib/typescript/src/data/config/ConfigProvider.d.ts.map +1 -0
  170. package/lib/typescript/src/data/config/ConfigResolutionPipeline.d.ts +49 -0
  171. package/lib/typescript/src/data/config/ConfigResolutionPipeline.d.ts.map +1 -0
  172. package/lib/typescript/src/data/config/ConfigValidator.d.ts +10 -0
  173. package/lib/typescript/src/data/config/ConfigValidator.d.ts.map +1 -0
  174. package/lib/typescript/src/data/config/SignatureVerifier.d.ts +16 -0
  175. package/lib/typescript/src/data/config/SignatureVerifier.d.ts.map +1 -0
  176. package/lib/typescript/src/data/config/canonicalize.d.ts +13 -0
  177. package/lib/typescript/src/data/config/canonicalize.d.ts.map +1 -0
  178. package/lib/typescript/src/data/config/sources/EnvironmentOverrideSource.d.ts +17 -0
  179. package/lib/typescript/src/data/config/sources/EnvironmentOverrideSource.d.ts.map +1 -0
  180. package/lib/typescript/src/data/config/sources/LocalConfigSource.d.ts +19 -0
  181. package/lib/typescript/src/data/config/sources/LocalConfigSource.d.ts.map +1 -0
  182. package/lib/typescript/src/data/config/sources/RemoteConfigSource.d.ts +10 -0
  183. package/lib/typescript/src/data/config/sources/RemoteConfigSource.d.ts.map +1 -0
  184. package/lib/typescript/src/data/providers/amazon/AmazonAppstoreProvider.d.ts +9 -0
  185. package/lib/typescript/src/data/providers/amazon/AmazonAppstoreProvider.d.ts.map +1 -0
  186. package/lib/typescript/src/data/providers/apple/AppleStoreProvider.d.ts +19 -0
  187. package/lib/typescript/src/data/providers/apple/AppleStoreProvider.d.ts.map +1 -0
  188. package/lib/typescript/src/data/providers/custom-api/CustomApiProvider.d.ts +14 -0
  189. package/lib/typescript/src/data/providers/custom-api/CustomApiProvider.d.ts.map +1 -0
  190. package/lib/typescript/src/data/providers/firebase-remote-config/FirebaseRemoteConfigProvider.d.ts +9 -0
  191. package/lib/typescript/src/data/providers/firebase-remote-config/FirebaseRemoteConfigProvider.d.ts.map +1 -0
  192. package/lib/typescript/src/data/providers/google-play/GooglePlayProvider.d.ts +22 -0
  193. package/lib/typescript/src/data/providers/google-play/GooglePlayProvider.d.ts.map +1 -0
  194. package/lib/typescript/src/data/providers/huawei/HuaweiAppGalleryProvider.d.ts +14 -0
  195. package/lib/typescript/src/data/providers/huawei/HuaweiAppGalleryProvider.d.ts.map +1 -0
  196. package/lib/typescript/src/data/repositories/VersionRepositoryImpl.d.ts +23 -0
  197. package/lib/typescript/src/data/repositories/VersionRepositoryImpl.d.ts.map +1 -0
  198. package/lib/typescript/src/di/container.d.ts +12 -0
  199. package/lib/typescript/src/di/container.d.ts.map +1 -0
  200. package/lib/typescript/src/domain/IVersionManagerCore.d.ts +30 -0
  201. package/lib/typescript/src/domain/IVersionManagerCore.d.ts.map +1 -0
  202. package/lib/typescript/src/domain/VersionManagerCore.d.ts +94 -0
  203. package/lib/typescript/src/domain/VersionManagerCore.d.ts.map +1 -0
  204. package/lib/typescript/src/domain/engines/decision/DecisionEngine.d.ts +16 -0
  205. package/lib/typescript/src/domain/engines/decision/DecisionEngine.d.ts.map +1 -0
  206. package/lib/typescript/src/domain/engines/policy/IUpdatePolicyEngine.d.ts +17 -0
  207. package/lib/typescript/src/domain/engines/policy/IUpdatePolicyEngine.d.ts.map +1 -0
  208. package/lib/typescript/src/domain/engines/policy/PolicyEngine.d.ts +16 -0
  209. package/lib/typescript/src/domain/engines/policy/PolicyEngine.d.ts.map +1 -0
  210. package/lib/typescript/src/domain/engines/semver/IVersionComparator.d.ts +7 -0
  211. package/lib/typescript/src/domain/engines/semver/IVersionComparator.d.ts.map +1 -0
  212. package/lib/typescript/src/domain/engines/semver/SemVerEngine.d.ts +11 -0
  213. package/lib/typescript/src/domain/engines/semver/SemVerEngine.d.ts.map +1 -0
  214. package/lib/typescript/src/domain/errors/VersionManagerException.d.ts +97 -0
  215. package/lib/typescript/src/domain/errors/VersionManagerException.d.ts.map +1 -0
  216. package/lib/typescript/src/domain/models/ActionPlan.d.ts +15 -0
  217. package/lib/typescript/src/domain/models/ActionPlan.d.ts.map +1 -0
  218. package/lib/typescript/src/domain/models/ConfigDocument.d.ts +86 -0
  219. package/lib/typescript/src/domain/models/ConfigDocument.d.ts.map +1 -0
  220. package/lib/typescript/src/domain/models/Events.d.ts +39 -0
  221. package/lib/typescript/src/domain/models/Events.d.ts.map +1 -0
  222. package/lib/typescript/src/domain/models/LifecycleState.d.ts +18 -0
  223. package/lib/typescript/src/domain/models/LifecycleState.d.ts.map +1 -0
  224. package/lib/typescript/src/domain/models/ParsedVersion.d.ts +9 -0
  225. package/lib/typescript/src/domain/models/ParsedVersion.d.ts.map +1 -0
  226. package/lib/typescript/src/domain/models/PlatformId.d.ts +3 -0
  227. package/lib/typescript/src/domain/models/PlatformId.d.ts.map +1 -0
  228. package/lib/typescript/src/domain/models/PublicApiOptions.d.ts +13 -0
  229. package/lib/typescript/src/domain/models/PublicApiOptions.d.ts.map +1 -0
  230. package/lib/typescript/src/domain/models/RemoteVersionInfo.d.ts +21 -0
  231. package/lib/typescript/src/domain/models/RemoteVersionInfo.d.ts.map +1 -0
  232. package/lib/typescript/src/domain/models/StoreLookup.d.ts +12 -0
  233. package/lib/typescript/src/domain/models/StoreLookup.d.ts.map +1 -0
  234. package/lib/typescript/src/domain/models/Unsubscribe.d.ts +2 -0
  235. package/lib/typescript/src/domain/models/Unsubscribe.d.ts.map +1 -0
  236. package/lib/typescript/src/domain/models/UpdateInfo.d.ts +11 -0
  237. package/lib/typescript/src/domain/models/UpdateInfo.d.ts.map +1 -0
  238. package/lib/typescript/src/domain/models/VersionManagerOptions.d.ts +149 -0
  239. package/lib/typescript/src/domain/models/VersionManagerOptions.d.ts.map +1 -0
  240. package/lib/typescript/src/domain/ports/ICacheStore.d.ts +6 -0
  241. package/lib/typescript/src/domain/ports/ICacheStore.d.ts.map +1 -0
  242. package/lib/typescript/src/domain/ports/IClock.d.ts +4 -0
  243. package/lib/typescript/src/domain/ports/IClock.d.ts.map +1 -0
  244. package/lib/typescript/src/domain/ports/IConfigProvider.d.ts +11 -0
  245. package/lib/typescript/src/domain/ports/IConfigProvider.d.ts.map +1 -0
  246. package/lib/typescript/src/domain/ports/IConfigSources.d.ts +25 -0
  247. package/lib/typescript/src/domain/ports/IConfigSources.d.ts.map +1 -0
  248. package/lib/typescript/src/domain/ports/IPlatformBridge.d.ts +77 -0
  249. package/lib/typescript/src/domain/ports/IPlatformBridge.d.ts.map +1 -0
  250. package/lib/typescript/src/domain/ports/IStoreProvider.d.ts +7 -0
  251. package/lib/typescript/src/domain/ports/IStoreProvider.d.ts.map +1 -0
  252. package/lib/typescript/src/domain/ports/IVersionRepository.d.ts +8 -0
  253. package/lib/typescript/src/domain/ports/IVersionRepository.d.ts.map +1 -0
  254. package/lib/typescript/src/domain/statemachine/LifecycleStateMachine.d.ts +25 -0
  255. package/lib/typescript/src/domain/statemachine/LifecycleStateMachine.d.ts.map +1 -0
  256. package/lib/typescript/src/domain/usecases/CheckForUpdatesUseCase.d.ts +30 -0
  257. package/lib/typescript/src/domain/usecases/CheckForUpdatesUseCase.d.ts.map +1 -0
  258. package/lib/typescript/src/domain/usecases/ForceTriggerUpdateUseCase.d.ts +17 -0
  259. package/lib/typescript/src/domain/usecases/ForceTriggerUpdateUseCase.d.ts.map +1 -0
  260. package/lib/typescript/src/domain/usecases/ResetIgnoredVersionsUseCase.d.ts +7 -0
  261. package/lib/typescript/src/domain/usecases/ResetIgnoredVersionsUseCase.d.ts.map +1 -0
  262. package/lib/typescript/src/index.d.ts +17 -0
  263. package/lib/typescript/src/index.d.ts.map +1 -0
  264. package/lib/typescript/src/platform/contracts/IPlatformBridge.d.ts +2 -0
  265. package/lib/typescript/src/platform/contracts/IPlatformBridge.d.ts.map +1 -0
  266. package/lib/typescript/src/platform/createPlatformBridge.d.ts +12 -0
  267. package/lib/typescript/src/platform/createPlatformBridge.d.ts.map +1 -0
  268. package/lib/typescript/src/platform/createPlatformBridge.native.d.ts +4 -0
  269. package/lib/typescript/src/platform/createPlatformBridge.native.d.ts.map +1 -0
  270. package/lib/typescript/src/platform/native/NativePlatformBridge.d.ts +17 -0
  271. package/lib/typescript/src/platform/native/NativePlatformBridge.d.ts.map +1 -0
  272. package/lib/typescript/src/platform/native/NativeVersionCheck.d.ts +45 -0
  273. package/lib/typescript/src/platform/native/NativeVersionCheck.d.ts.map +1 -0
  274. package/lib/typescript/src/platform/web/WebPlatformBridge.d.ts +17 -0
  275. package/lib/typescript/src/platform/web/WebPlatformBridge.d.ts.map +1 -0
  276. package/lib/typescript/src/presentation/components/ForceUpdateScreen.d.ts +12 -0
  277. package/lib/typescript/src/presentation/components/ForceUpdateScreen.d.ts.map +1 -0
  278. package/lib/typescript/src/presentation/components/OptionalUpdateBanner.d.ts +12 -0
  279. package/lib/typescript/src/presentation/components/OptionalUpdateBanner.d.ts.map +1 -0
  280. package/lib/typescript/src/presentation/components/SoftUpdateDialog.d.ts +14 -0
  281. package/lib/typescript/src/presentation/components/SoftUpdateDialog.d.ts.map +1 -0
  282. package/lib/typescript/src/presentation/hooks/VersionManagerProvider.d.ts +9 -0
  283. package/lib/typescript/src/presentation/hooks/VersionManagerProvider.d.ts.map +1 -0
  284. package/lib/typescript/src/presentation/hooks/context.d.ts +3 -0
  285. package/lib/typescript/src/presentation/hooks/context.d.ts.map +1 -0
  286. package/lib/typescript/src/presentation/hooks/useUpdateState.d.ts +17 -0
  287. package/lib/typescript/src/presentation/hooks/useUpdateState.d.ts.map +1 -0
  288. package/lib/typescript/src/presentation/hooks/useVersionManager.d.ts +22 -0
  289. package/lib/typescript/src/presentation/hooks/useVersionManager.d.ts.map +1 -0
  290. package/lib/typescript/src/presentation/state/VersionManagerStore.d.ts +28 -0
  291. package/lib/typescript/src/presentation/state/VersionManagerStore.d.ts.map +1 -0
  292. package/lib/typescript/src/publicApi.d.ts +24 -0
  293. package/lib/typescript/src/publicApi.d.ts.map +1 -0
  294. package/lib/typescript/src/shared/eventbus/EventBus.d.ts +21 -0
  295. package/lib/typescript/src/shared/eventbus/EventBus.d.ts.map +1 -0
  296. package/lib/typescript/src/shared/logging/Logger.d.ts +17 -0
  297. package/lib/typescript/src/shared/logging/Logger.d.ts.map +1 -0
  298. package/lib/typescript/src/ui.d.ts +15 -0
  299. package/lib/typescript/src/ui.d.ts.map +1 -0
  300. package/package.json +192 -0
  301. package/src/data/cache/MemoryCacheStore.ts +36 -0
  302. package/src/data/cache/PersistentCacheStore.ts +63 -0
  303. package/src/data/config/ConfigCache.ts +30 -0
  304. package/src/data/config/ConfigDocumentValidator.ts +309 -0
  305. package/src/data/config/ConfigLoader.ts +105 -0
  306. package/src/data/config/ConfigProvider.ts +84 -0
  307. package/src/data/config/ConfigResolutionPipeline.ts +424 -0
  308. package/src/data/config/ConfigValidator.ts +79 -0
  309. package/src/data/config/SignatureVerifier.ts +90 -0
  310. package/src/data/config/canonicalize.ts +111 -0
  311. package/src/data/config/sources/EnvironmentOverrideSource.ts +22 -0
  312. package/src/data/config/sources/LocalConfigSource.ts +24 -0
  313. package/src/data/config/sources/RemoteConfigSource.ts +41 -0
  314. package/src/data/providers/amazon/AmazonAppstoreProvider.ts +16 -0
  315. package/src/data/providers/apple/AppleStoreProvider.ts +94 -0
  316. package/src/data/providers/custom-api/CustomApiProvider.ts +75 -0
  317. package/src/data/providers/firebase-remote-config/FirebaseRemoteConfigProvider.ts +16 -0
  318. package/src/data/providers/google-play/GooglePlayProvider.ts +75 -0
  319. package/src/data/providers/huawei/HuaweiAppGalleryProvider.ts +21 -0
  320. package/src/data/repositories/VersionRepositoryImpl.ts +90 -0
  321. package/src/di/container.ts +128 -0
  322. package/src/domain/IVersionManagerCore.ts +54 -0
  323. package/src/domain/VersionManagerCore.ts +425 -0
  324. package/src/domain/engines/decision/DecisionEngine.ts +47 -0
  325. package/src/domain/engines/policy/IUpdatePolicyEngine.ts +18 -0
  326. package/src/domain/engines/policy/PolicyEngine.ts +60 -0
  327. package/src/domain/engines/semver/IVersionComparator.ts +7 -0
  328. package/src/domain/engines/semver/SemVerEngine.ts +200 -0
  329. package/src/domain/errors/VersionManagerException.ts +166 -0
  330. package/src/domain/models/ActionPlan.ts +17 -0
  331. package/src/domain/models/ConfigDocument.ts +97 -0
  332. package/src/domain/models/Events.ts +48 -0
  333. package/src/domain/models/LifecycleState.ts +50 -0
  334. package/src/domain/models/ParsedVersion.ts +8 -0
  335. package/src/domain/models/PlatformId.ts +9 -0
  336. package/src/domain/models/PublicApiOptions.ts +14 -0
  337. package/src/domain/models/RemoteVersionInfo.ts +23 -0
  338. package/src/domain/models/StoreLookup.ts +12 -0
  339. package/src/domain/models/Unsubscribe.ts +1 -0
  340. package/src/domain/models/UpdateInfo.ts +11 -0
  341. package/src/domain/models/VersionManagerOptions.ts +150 -0
  342. package/src/domain/ports/ICacheStore.ts +5 -0
  343. package/src/domain/ports/IClock.ts +3 -0
  344. package/src/domain/ports/IConfigProvider.ts +18 -0
  345. package/src/domain/ports/IConfigSources.ts +44 -0
  346. package/src/domain/ports/IPlatformBridge.ts +97 -0
  347. package/src/domain/ports/IStoreProvider.ts +12 -0
  348. package/src/domain/ports/IVersionRepository.ts +14 -0
  349. package/src/domain/statemachine/LifecycleStateMachine.ts +76 -0
  350. package/src/domain/usecases/CheckForUpdatesUseCase.ts +63 -0
  351. package/src/domain/usecases/ForceTriggerUpdateUseCase.ts +35 -0
  352. package/src/domain/usecases/ResetIgnoredVersionsUseCase.ts +26 -0
  353. package/src/index.tsx +84 -0
  354. package/src/platform/contracts/IPlatformBridge.ts +14 -0
  355. package/src/platform/createPlatformBridge.native.ts +7 -0
  356. package/src/platform/createPlatformBridge.ts +15 -0
  357. package/src/platform/native/NativePlatformBridge.ts +179 -0
  358. package/src/platform/native/NativeVersionCheck.ts +64 -0
  359. package/src/platform/web/WebPlatformBridge.ts +347 -0
  360. package/src/presentation/components/ForceUpdateScreen.tsx +64 -0
  361. package/src/presentation/components/OptionalUpdateBanner.tsx +53 -0
  362. package/src/presentation/components/SoftUpdateDialog.tsx +84 -0
  363. package/src/presentation/hooks/VersionManagerProvider.tsx +23 -0
  364. package/src/presentation/hooks/context.ts +6 -0
  365. package/src/presentation/hooks/useUpdateState.ts +50 -0
  366. package/src/presentation/hooks/useVersionManager.ts +68 -0
  367. package/src/presentation/state/VersionManagerStore.ts +72 -0
  368. package/src/publicApi.ts +126 -0
  369. package/src/shared/eventbus/EventBus.ts +56 -0
  370. package/src/shared/logging/Logger.ts +70 -0
  371. package/src/ui.tsx +19 -0
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ export class ResetIgnoredVersionsUseCase {
4
+ constructor(repository) {
5
+ this.repository = repository;
6
+ }
7
+ async execute(versions) {
8
+ const current = await this.repository.getUserDecision();
9
+ const remindMeLaterUntil = current?.remindMeLaterUntil ?? null;
10
+ if (!versions || versions.length === 0) {
11
+ await this.repository.persistUserDecision({
12
+ ignoredVersions: [],
13
+ remindMeLaterUntil
14
+ });
15
+ return;
16
+ }
17
+ const remaining = (current?.ignoredVersions ?? []).filter(v => !versions.includes(v));
18
+ await this.repository.persistUserDecision({
19
+ ignoredVersions: remaining,
20
+ remindMeLaterUntil
21
+ });
22
+ }
23
+ }
24
+ //# sourceMappingURL=ResetIgnoredVersionsUseCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ResetIgnoredVersionsUseCase","constructor","repository","execute","versions","current","getUserDecision","remindMeLaterUntil","length","persistUserDecision","ignoredVersions","remaining","filter","v","includes"],"sourceRoot":"../../../../src","sources":["domain/usecases/ResetIgnoredVersionsUseCase.ts"],"mappings":";;AAEA,OAAO,MAAMA,2BAA2B,CAAC;EACvCC,WAAWA,CAAkBC,UAA8B,EAAE;IAAA,KAAhCA,UAA8B,GAA9BA,UAA8B;EAAG;EAE9D,MAAMC,OAAOA,CAACC,QAA4B,EAAiB;IACzD,MAAMC,OAAO,GAAG,MAAM,IAAI,CAACH,UAAU,CAACI,eAAe,CAAC,CAAC;IACvD,MAAMC,kBAAkB,GAAGF,OAAO,EAAEE,kBAAkB,IAAI,IAAI;IAE9D,IAAI,CAACH,QAAQ,IAAIA,QAAQ,CAACI,MAAM,KAAK,CAAC,EAAE;MACtC,MAAM,IAAI,CAACN,UAAU,CAACO,mBAAmB,CAAC;QACxCC,eAAe,EAAE,EAAE;QACnBH;MACF,CAAC,CAAC;MACF;IACF;IAEA,MAAMI,SAAS,GAAG,CAACN,OAAO,EAAEK,eAAe,IAAI,EAAE,EAAEE,MAAM,CACtDC,CAAC,IAAK,CAACT,QAAQ,CAACU,QAAQ,CAACD,CAAC,CAC7B,CAAC;IACD,MAAM,IAAI,CAACX,UAAU,CAACO,mBAAmB,CAAC;MACxCC,eAAe,EAAEC,SAAS;MAC1BJ;IACF,CAAC,CAAC;EACJ;AACF","ignoreList":[]}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+
3
+ // Public API entry point (core only — no React/UI code reachable from this path,
4
+ // see src/ui.tsx for the Hooks adapter). Prompt 2.
5
+
6
+ export { VersionManager, VersionManagerBuilder } from "./publicApi.js";
7
+ export { ActionType } from "./domain/models/ActionPlan.js";
8
+ export { LifecycleState } from "./domain/models/LifecycleState.js";
9
+ export { AppNotFoundException, BoundaryValidationException, CacheCorruptionException, CacheException, CacheWriteException, ConfigSizeLimitExceededException, EnvironmentOverrideConflictException, InvalidConfigException, InvalidVersionFormatException, NetworkException, NotInitializedException, NotReadyException, OfflineException, PlatformBridgeException, PolicyEvaluationException, RateLimitException, RequestTimeoutException, SchemaValidationException, SignatureVerificationException, StorePermissionException, StoreProviderException, StoreResponseParseException, TlsHandshakeException, UnknownVersionManagerException, UnsupportedStoreException, UntrustedKeyIdException, VersionManagerException } from "./domain/errors/VersionManagerException.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["VersionManager","VersionManagerBuilder","ActionType","LifecycleState","AppNotFoundException","BoundaryValidationException","CacheCorruptionException","CacheException","CacheWriteException","ConfigSizeLimitExceededException","EnvironmentOverrideConflictException","InvalidConfigException","InvalidVersionFormatException","NetworkException","NotInitializedException","NotReadyException","OfflineException","PlatformBridgeException","PolicyEvaluationException","RateLimitException","RequestTimeoutException","SchemaValidationException","SignatureVerificationException","StorePermissionException","StoreProviderException","StoreResponseParseException","TlsHandshakeException","UnknownVersionManagerException","UnsupportedStoreException","UntrustedKeyIdException","VersionManagerException"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA;AACA;;AAEA,SAASA,cAAc,EAAEC,qBAAqB,QAAQ,gBAAa;AAQnE,SAASC,UAAU,QAAQ,+BAA4B;AAGvD,SAASC,cAAc,QAAQ,mCAAgC;AAwC/D,SACEC,oBAAoB,EACpBC,2BAA2B,EAC3BC,wBAAwB,EACxBC,cAAc,EACdC,mBAAmB,EACnBC,gCAAgC,EAChCC,oCAAoC,EACpCC,sBAAsB,EACtBC,6BAA6B,EAC7BC,gBAAgB,EAChBC,uBAAuB,EACvBC,iBAAiB,EACjBC,gBAAgB,EAChBC,uBAAuB,EACvBC,yBAAyB,EACzBC,kBAAkB,EAClBC,uBAAuB,EACvBC,yBAAyB,EACzBC,8BAA8B,EAC9BC,wBAAwB,EACxBC,sBAAsB,EACtBC,2BAA2B,EAC3BC,qBAAqB,EACrBC,8BAA8B,EAC9BC,yBAAyB,EACzBC,uBAAuB,EACvBC,uBAAuB,QAClB,4CAAyC","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=IPlatformBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../../src","sources":["platform/contracts/IPlatformBridge.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ import { WebPlatformBridge } from "./web/WebPlatformBridge.js";
4
+
5
+ /**
6
+ * Web/default implementation. Metro (React Native's bundler) prefers
7
+ * createPlatformBridge.native.ts for iOS/Android builds; Vite (the web build, see
8
+ * example/vite.config.mjs) has no such resolution rule and always resolves this file
9
+ * — the same convention already used by src/multiply.tsx / multiply.native.tsx. This
10
+ * indirection matters: NativePlatformBridge.ts imports NativeVersionCheck, whose
11
+ * top-level TurboModuleRegistry.getEnforcing() call would throw if ever evaluated on
12
+ * Web, so the native module must never even be imported into a web bundle.
13
+ */
14
+ export function createPlatformBridge() {
15
+ return new WebPlatformBridge();
16
+ }
17
+ //# sourceMappingURL=createPlatformBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["WebPlatformBridge","createPlatformBridge"],"sourceRoot":"../../../src","sources":["platform/createPlatformBridge.ts"],"mappings":";;AACA,SAASA,iBAAiB,QAAQ,4BAAyB;;AAE3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,oBAAoBA,CAAA,EAAoB;EACtD,OAAO,IAAID,iBAAiB,CAAC,CAAC;AAChC","ignoreList":[]}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ import { NativePlatformBridge } from "./native/NativePlatformBridge.js";
4
+
5
+ /** iOS/Android implementation — see createPlatformBridge.ts for why this is a separate file. */
6
+ export function createPlatformBridge() {
7
+ return new NativePlatformBridge();
8
+ }
9
+ //# sourceMappingURL=createPlatformBridge.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NativePlatformBridge","createPlatformBridge"],"sourceRoot":"../../../src","sources":["platform/createPlatformBridge.native.ts"],"mappings":";;AACA,SAASA,oBAAoB,QAAQ,kCAA+B;;AAEpE;AACA,OAAO,SAASC,oBAAoBA,CAAA,EAAoB;EACtD,OAAO,IAAID,oBAAoB,CAAC,CAAC;AACnC","ignoreList":[]}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+
3
+ import { AppState, Platform } from 'react-native';
4
+ import { OfflineException, RequestTimeoutException } from "../../domain/errors/VersionManagerException.js";
5
+ import NativeVersionCheck from "./NativeVersionCheck.js";
6
+ class RnHttpClient {
7
+ async request(req) {
8
+ const controller = new AbortController();
9
+ const timeout = setTimeout(() => controller.abort(), req.timeoutMs);
10
+ try {
11
+ const response = await fetch(req.url, {
12
+ method: req.method,
13
+ headers: req.headers,
14
+ body: req.body,
15
+ signal: controller.signal
16
+ });
17
+ const headers = {};
18
+ response.headers.forEach((value, key) => {
19
+ headers[key] = value;
20
+ });
21
+ const body = await response.text();
22
+ return {
23
+ status: response.status,
24
+ headers,
25
+ body
26
+ };
27
+ } catch (error) {
28
+ if (error instanceof Error && error.name === 'AbortError') {
29
+ throw new RequestTimeoutException({
30
+ message: `Request to "${req.url}" timed out after ${req.timeoutMs}ms`,
31
+ cause: error
32
+ });
33
+ }
34
+ throw new OfflineException({
35
+ message: `Request to "${req.url}" failed`,
36
+ cause: error
37
+ });
38
+ } finally {
39
+ clearTimeout(timeout);
40
+ }
41
+ }
42
+ }
43
+ class RnKeyValueStorage {
44
+ async get(key) {
45
+ return NativeVersionCheck().storageGet(key);
46
+ }
47
+ async set(key, value) {
48
+ await NativeVersionCheck().storageSet(key, value);
49
+ }
50
+ async remove(key) {
51
+ await NativeVersionCheck().storageRemove(key);
52
+ }
53
+ }
54
+ class RnSecureStorage {
55
+ async getItem(key) {
56
+ return NativeVersionCheck().secureStorageGet(key);
57
+ }
58
+ async setItem(key, value) {
59
+ await NativeVersionCheck().secureStorageSet(key, value);
60
+ }
61
+ async removeItem(key) {
62
+ await NativeVersionCheck().secureStorageRemove(key);
63
+ }
64
+ }
65
+ class RnAppInfoProvider {
66
+ async getCurrentVersion() {
67
+ return NativeVersionCheck().getCurrentAppVersion();
68
+ }
69
+ async getBuildNumber() {
70
+ return NativeVersionCheck().getBuildNumber();
71
+ }
72
+ async getBundleId() {
73
+ return NativeVersionCheck().getBundleId();
74
+ }
75
+ }
76
+ class RnDeviceInfoProvider {
77
+ async getOsVersion() {
78
+ return NativeVersionCheck().getOsVersion();
79
+ }
80
+ async getDeviceModel() {
81
+ return NativeVersionCheck().getDeviceModel();
82
+ }
83
+ async getLocale() {
84
+ return NativeVersionCheck().getLocale();
85
+ }
86
+ }
87
+
88
+ /**
89
+ * True OS-scheduled background execution (BGTaskScheduler/WorkManager, Prompt 26) is
90
+ * not implemented in this pass. schedule()/cancel() log a warning rather than silently
91
+ * pretending to work — see the equivalent, identically-scoped note on WebBackgroundScheduler.
92
+ */
93
+ class RnBackgroundScheduler {
94
+ async schedule(task) {
95
+ console.warn(`[VersionManager] Background scheduling ("${task.taskId}") is not implemented on ${Platform.OS} yet (Prompt 26).`);
96
+ }
97
+ async cancel(_taskId) {
98
+ // no-op — nothing was ever scheduled, see schedule() above.
99
+ }
100
+ }
101
+ class RnAppLifecycleObserver {
102
+ onForeground(cb) {
103
+ const sub = AppState.addEventListener('change', state => {
104
+ if (state === 'active') cb();
105
+ });
106
+ return () => sub.remove();
107
+ }
108
+ onBackground(cb) {
109
+ const sub = AppState.addEventListener('change', state => {
110
+ if (state === 'background') cb();
111
+ });
112
+ return () => sub.remove();
113
+ }
114
+ }
115
+
116
+ /**
117
+ * Doc 03 §3.4 — delegates to the native TurboModule, which resolves `keyId` to
118
+ * build-time-embedded key material (iOS CommonCrypto/CryptoKit, Android
119
+ * java.security/javax.crypto) and never exposes key material to JS.
120
+ */
121
+ class RnCryptoProvider {
122
+ async verifyEd25519(keyId, messageBase64, signatureBase64) {
123
+ return NativeVersionCheck().verifyEd25519(keyId, messageBase64, signatureBase64);
124
+ }
125
+ async verifyHmacSha256(keyId, messageBase64, macBase64) {
126
+ return NativeVersionCheck().verifyHmacSha256(keyId, messageBase64, macBase64);
127
+ }
128
+ }
129
+ export class NativePlatformBridge {
130
+ platform = Platform.OS === 'ios' ? 'ios' : 'android';
131
+ http = new RnHttpClient();
132
+ storage = new RnKeyValueStorage();
133
+ secureStorage = new RnSecureStorage();
134
+ appInfo = new RnAppInfoProvider();
135
+ deviceInfo = new RnDeviceInfoProvider();
136
+ scheduler = new RnBackgroundScheduler();
137
+ clock = {
138
+ now: () => Date.now()
139
+ };
140
+ lifecycle = new RnAppLifecycleObserver();
141
+ crypto = new RnCryptoProvider();
142
+ }
143
+ //# sourceMappingURL=NativePlatformBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["AppState","Platform","OfflineException","RequestTimeoutException","NativeVersionCheck","RnHttpClient","request","req","controller","AbortController","timeout","setTimeout","abort","timeoutMs","response","fetch","url","method","headers","body","signal","forEach","value","key","text","status","error","Error","name","message","cause","clearTimeout","RnKeyValueStorage","get","storageGet","set","storageSet","remove","storageRemove","RnSecureStorage","getItem","secureStorageGet","setItem","secureStorageSet","removeItem","secureStorageRemove","RnAppInfoProvider","getCurrentVersion","getCurrentAppVersion","getBuildNumber","getBundleId","RnDeviceInfoProvider","getOsVersion","getDeviceModel","getLocale","RnBackgroundScheduler","schedule","task","console","warn","taskId","OS","cancel","_taskId","RnAppLifecycleObserver","onForeground","cb","sub","addEventListener","state","onBackground","RnCryptoProvider","verifyEd25519","keyId","messageBase64","signatureBase64","verifyHmacSha256","macBase64","NativePlatformBridge","platform","http","storage","secureStorage","appInfo","deviceInfo","scheduler","clock","now","Date","lifecycle","crypto"],"sourceRoot":"../../../../src","sources":["platform/native/NativePlatformBridge.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+
3
+ import { TurboModuleRegistry } from 'react-native';
4
+
5
+ /**
6
+ * TurboModule Codegen spec. Deliberately small: HTTP (global `fetch`), the clock
7
+ * (`Date.now()`), and app-lifecycle (`AppState`) are already available in pure JS via
8
+ * React Native itself and do not need a custom native surface (Prompt 1 §4.1 revised
9
+ * during implementation — the design doc's per-target table listed a native `http`
10
+ * bridge conceptually, but RN's own Networking module already satisfies IHttpClient
11
+ * without new native code). What genuinely requires native code — reading the app's
12
+ * own version/bundle id and persisting key-value pairs via UserDefaults/Keychain or
13
+ * SharedPreferences/Keystore — is exactly what's declared here.
14
+ */
15
+
16
+ let cachedModule = null;
17
+
18
+ /**
19
+ * Lazily resolved rather than the usual top-level
20
+ * `TurboModuleRegistry.getEnforcing<Spec>(...)` pattern, so importing this module (or
21
+ * anything that transitively imports it, e.g. src/di/container.ts) never throws in
22
+ * environments where the native module isn't registered — Jest's simulated native
23
+ * platform resolution, or a caller who supplies VersionManagerOptions.platformBridge
24
+ * and therefore never actually needs it. The registry lookup only happens the first
25
+ * time a method is actually called.
26
+ */
27
+ export default function getNativeVersionCheck() {
28
+ if (!cachedModule) {
29
+ cachedModule = TurboModuleRegistry.getEnforcing('VersionCheck');
30
+ }
31
+ return cachedModule;
32
+ }
33
+ //# sourceMappingURL=NativeVersionCheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["TurboModuleRegistry","cachedModule","getNativeVersionCheck","getEnforcing"],"sourceRoot":"../../../../src","sources":["platform/native/NativeVersionCheck.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAA0B,cAAc;;AAEpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAoCA,IAAIC,YAAyB,GAAG,IAAI;;AAEpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,qBAAqBA,CAAA,EAAS;EACpD,IAAI,CAACD,YAAY,EAAE;IACjBA,YAAY,GAAGD,mBAAmB,CAACG,YAAY,CAAO,cAAc,CAAC;EACvE;EACA,OAAOF,YAAY;AACrB","ignoreList":[]}
@@ -0,0 +1,228 @@
1
+ "use strict";
2
+
3
+ import { OfflineException, RequestTimeoutException } from "../../domain/errors/VersionManagerException.js";
4
+
5
+ /**
6
+ * This project's tsconfig deliberately omits the "DOM" lib (it collides with React
7
+ * Native's own global fetch/console typings — Prompt 1 constraint). The small subset
8
+ * of browser globals this bridge needs is declared locally instead of pulling in the
9
+ * full lib.dom.d.ts surface, and accessed through a single typed cast of globalThis.
10
+ */
11
+
12
+ const webGlobal = globalThis;
13
+ function base64ToBytes(base64) {
14
+ if (typeof atob === 'function') {
15
+ const binary = atob(base64);
16
+ const bytes = new Uint8Array(binary.length);
17
+ for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
18
+ return bytes;
19
+ }
20
+ throw new Error('No base64 decoder available in this environment');
21
+ }
22
+
23
+ /**
24
+ * Doc 03 §3.4 crypto port, Web target — uses browser-native SubtleCrypto exclusively
25
+ * (Prompt 1 §9.3: no third-party crypto library). HMAC-SHA256 has broad browser
26
+ * support; Ed25519 support via WebCrypto is newer (Chrome 129+/Safari 17+) and this
27
+ * method throws a clear, caught error on unsupported browsers rather than silently
28
+ * failing — SignatureVerifier surfaces that as a normal SignatureVerificationException.
29
+ */
30
+ class WebCryptoProvider {
31
+ async verifyEd25519(keyId, messageBase64, signatureBase64) {
32
+ const subtle = webGlobal.crypto?.subtle;
33
+ const keyMaterial = webGlobal.__VM_TRUSTED_KEYS__?.[keyId];
34
+ if (!subtle || !keyMaterial) return false;
35
+ const key = await subtle.importKey('raw', base64ToBytes(keyMaterial), {
36
+ name: 'Ed25519'
37
+ }, false, ['verify']);
38
+ return subtle.verify({
39
+ name: 'Ed25519'
40
+ }, key, base64ToBytes(signatureBase64), base64ToBytes(messageBase64));
41
+ }
42
+ async verifyHmacSha256(keyId, messageBase64, macBase64) {
43
+ const subtle = webGlobal.crypto?.subtle;
44
+ const keyMaterial = webGlobal.__VM_TRUSTED_KEYS__?.[keyId];
45
+ if (!subtle || !keyMaterial) return false;
46
+ const key = await subtle.importKey('raw', base64ToBytes(keyMaterial), {
47
+ name: 'HMAC',
48
+ hash: 'SHA-256'
49
+ }, false, ['sign']);
50
+ const computed = await subtle.sign({
51
+ name: 'HMAC'
52
+ }, key, base64ToBytes(messageBase64));
53
+ const computedBytes = new Uint8Array(computed);
54
+ const expectedBytes = base64ToBytes(macBase64);
55
+ if (computedBytes.length !== expectedBytes.length) return false;
56
+ let diff = 0;
57
+ for (let i = 0; i < computedBytes.length; i++) {
58
+ diff |= computedBytes[i] ^ expectedBytes[i];
59
+ }
60
+ return diff === 0;
61
+ }
62
+ }
63
+ class WebHttpClient {
64
+ async request(req) {
65
+ const controller = new webGlobal.AbortController();
66
+ const timeout = setTimeout(() => controller.abort(), req.timeoutMs);
67
+ try {
68
+ const response = await webGlobal.fetch(req.url, {
69
+ method: req.method,
70
+ headers: req.headers,
71
+ body: req.body,
72
+ signal: controller.signal
73
+ });
74
+ const headers = {};
75
+ response.headers.forEach((value, key) => {
76
+ headers[key] = value;
77
+ });
78
+ const body = await response.text();
79
+ return {
80
+ status: response.status,
81
+ headers,
82
+ body
83
+ };
84
+ } catch (error) {
85
+ if (error instanceof Error && error.name === 'AbortError') {
86
+ throw new RequestTimeoutException({
87
+ message: `Request to "${req.url}" timed out after ${req.timeoutMs}ms`,
88
+ cause: error
89
+ });
90
+ }
91
+ throw new OfflineException({
92
+ message: `Request to "${req.url}" failed`,
93
+ cause: error
94
+ });
95
+ } finally {
96
+ clearTimeout(timeout);
97
+ }
98
+ }
99
+ }
100
+ class WebKeyValueStorage {
101
+ async get(key) {
102
+ return webGlobal.localStorage.getItem(key);
103
+ }
104
+ async set(key, value) {
105
+ webGlobal.localStorage.setItem(key, value);
106
+ }
107
+ async remove(key) {
108
+ webGlobal.localStorage.removeItem(key);
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Backed by localStorage under a distinct key prefix. This is functionally complete
114
+ * (satisfies ISecureStorage) but is NOT encrypted at rest — true SubtleCrypto-based
115
+ * encryption-at-rest for the Web target (Prompt 1 §4.1's documented design) is a
116
+ * follow-up hardening item, not implemented in this pass.
117
+ */
118
+ class WebSecureStorage {
119
+ static PREFIX = 'vm_secure_';
120
+ async getItem(key) {
121
+ return webGlobal.localStorage.getItem(WebSecureStorage.PREFIX + key);
122
+ }
123
+ async setItem(key, value) {
124
+ webGlobal.localStorage.setItem(WebSecureStorage.PREFIX + key, value);
125
+ }
126
+ async removeItem(key) {
127
+ webGlobal.localStorage.removeItem(WebSecureStorage.PREFIX + key);
128
+ }
129
+ }
130
+
131
+ /**
132
+ * The Web target has no OS bundle to read a version/build number from. These should be
133
+ * injected at build time (e.g. a Vite `define`); absent that, callers are expected to
134
+ * supply `VersionManagerOptions.appVersion` explicitly, which Core prefers over this
135
+ * bridge (see VersionManagerCore.resolveCurrentVersion()).
136
+ */
137
+ class WebAppInfoProvider {
138
+ async getCurrentVersion() {
139
+ return '0.0.0';
140
+ }
141
+ async getBuildNumber() {
142
+ return '0';
143
+ }
144
+ async getBundleId() {
145
+ return 'web';
146
+ }
147
+ }
148
+ class WebDeviceInfoProvider {
149
+ async getOsVersion() {
150
+ return webGlobal.navigator.userAgent;
151
+ }
152
+ async getDeviceModel() {
153
+ return 'web';
154
+ }
155
+ async getLocale() {
156
+ return webGlobal.navigator.language;
157
+ }
158
+ }
159
+
160
+ /**
161
+ * True Service Worker `periodicSync` requires a registered service worker the host app
162
+ * controls (feature-detected, narrow browser support) and is out of this pass's scope —
163
+ * see the class-level fallback doc 01 §4.1 explicitly names: "visibility-change
164
+ * fallback." This implements exactly that fallback for real: a `setInterval` gated so
165
+ * the callback only actually fires while the tab is visible (`document.visibilityState
166
+ * === 'visible'`), which is the best a page can do without its own registered SW.
167
+ * `minIntervalMs` is honored as a floor, not a guarantee — like all browser timers, it
168
+ * is throttled/paused while backgrounded, which is the whole reason for the visibility
169
+ * gate (avoid firing a burst of missed intervals the instant the tab regains focus).
170
+ */
171
+ class WebBackgroundScheduler {
172
+ timers = new Map();
173
+ callbacks = new Map();
174
+ async schedule(task) {
175
+ this.cancelInternal(task.taskId);
176
+ const timer = setInterval(() => {
177
+ if (webGlobal.document.visibilityState !== 'visible') return;
178
+ this.callbacks.get(task.taskId)?.();
179
+ }, task.minIntervalMs);
180
+ this.timers.set(task.taskId, timer);
181
+ }
182
+ async cancel(taskId) {
183
+ this.cancelInternal(taskId);
184
+ }
185
+
186
+ /** Registers the function a scheduled task actually invokes when it fires (wired by src/di/container.ts, not part of IBackgroundScheduler's public port shape). */
187
+ setCallback(taskId, cb) {
188
+ this.callbacks.set(taskId, cb);
189
+ }
190
+ cancelInternal(taskId) {
191
+ const existing = this.timers.get(taskId);
192
+ if (existing !== undefined) {
193
+ clearInterval(existing);
194
+ this.timers.delete(taskId);
195
+ }
196
+ }
197
+ }
198
+ class WebAppLifecycleObserver {
199
+ onForeground(cb) {
200
+ const handler = () => {
201
+ if (webGlobal.document.visibilityState === 'visible') cb();
202
+ };
203
+ webGlobal.document.addEventListener('visibilitychange', handler);
204
+ return () => webGlobal.document.removeEventListener('visibilitychange', handler);
205
+ }
206
+ onBackground(cb) {
207
+ const handler = () => {
208
+ if (webGlobal.document.visibilityState === 'hidden') cb();
209
+ };
210
+ webGlobal.document.addEventListener('visibilitychange', handler);
211
+ return () => webGlobal.document.removeEventListener('visibilitychange', handler);
212
+ }
213
+ }
214
+ export class WebPlatformBridge {
215
+ platform = 'web';
216
+ http = new WebHttpClient();
217
+ storage = new WebKeyValueStorage();
218
+ secureStorage = new WebSecureStorage();
219
+ appInfo = new WebAppInfoProvider();
220
+ deviceInfo = new WebDeviceInfoProvider();
221
+ scheduler = new WebBackgroundScheduler();
222
+ clock = {
223
+ now: () => Date.now()
224
+ };
225
+ lifecycle = new WebAppLifecycleObserver();
226
+ crypto = new WebCryptoProvider();
227
+ }
228
+ //# sourceMappingURL=WebPlatformBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["OfflineException","RequestTimeoutException","webGlobal","globalThis","base64ToBytes","base64","atob","binary","bytes","Uint8Array","length","i","charCodeAt","Error","WebCryptoProvider","verifyEd25519","keyId","messageBase64","signatureBase64","subtle","crypto","keyMaterial","__VM_TRUSTED_KEYS__","key","importKey","name","verify","verifyHmacSha256","macBase64","hash","computed","sign","computedBytes","expectedBytes","diff","WebHttpClient","request","req","controller","AbortController","timeout","setTimeout","abort","timeoutMs","response","fetch","url","method","headers","body","signal","forEach","value","text","status","error","message","cause","clearTimeout","WebKeyValueStorage","get","localStorage","getItem","set","setItem","remove","removeItem","WebSecureStorage","PREFIX","WebAppInfoProvider","getCurrentVersion","getBuildNumber","getBundleId","WebDeviceInfoProvider","getOsVersion","navigator","userAgent","getDeviceModel","getLocale","language","WebBackgroundScheduler","timers","Map","callbacks","schedule","task","cancelInternal","taskId","timer","setInterval","document","visibilityState","minIntervalMs","cancel","setCallback","cb","existing","undefined","clearInterval","delete","WebAppLifecycleObserver","onForeground","handler","addEventListener","removeEventListener","onBackground","WebPlatformBridge","platform","http","storage","secureStorage","appInfo","deviceInfo","scheduler","clock","now","Date","lifecycle"],"sourceRoot":"../../../../src","sources":["platform/web/WebPlatformBridge.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+
3
+ import { Modal, Pressable, StyleSheet, Text, View } from 'react-native';
4
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
+ /** Full-screen, non-dismissible lockout (Prompt 1 §5.3; UI copy detail is Prompt 19). */
6
+ export function ForceUpdateScreen({
7
+ updateInfo,
8
+ onUpdatePress,
9
+ title = 'Update Required',
10
+ message = `Version ${updateInfo.latestVersion} is available. You must update to continue.`,
11
+ updateButtonLabel = 'Update Now'
12
+ }) {
13
+ return /*#__PURE__*/_jsx(Modal, {
14
+ visible: true,
15
+ animationType: "fade",
16
+ transparent: false,
17
+ onRequestClose: () => undefined,
18
+ children: /*#__PURE__*/_jsxs(View, {
19
+ style: styles.container,
20
+ children: [/*#__PURE__*/_jsx(Text, {
21
+ style: styles.title,
22
+ children: title
23
+ }), /*#__PURE__*/_jsx(Text, {
24
+ style: styles.message,
25
+ children: message
26
+ }), /*#__PURE__*/_jsx(Pressable, {
27
+ style: styles.button,
28
+ onPress: onUpdatePress,
29
+ accessibilityRole: "button",
30
+ children: /*#__PURE__*/_jsx(Text, {
31
+ style: styles.buttonLabel,
32
+ children: updateButtonLabel
33
+ })
34
+ })]
35
+ })
36
+ });
37
+ }
38
+ const styles = StyleSheet.create({
39
+ container: {
40
+ flex: 1,
41
+ alignItems: 'center',
42
+ justifyContent: 'center',
43
+ padding: 24
44
+ },
45
+ title: {
46
+ fontSize: 20,
47
+ fontWeight: '700',
48
+ marginBottom: 12,
49
+ textAlign: 'center'
50
+ },
51
+ message: {
52
+ fontSize: 15,
53
+ textAlign: 'center',
54
+ marginBottom: 24
55
+ },
56
+ button: {
57
+ paddingVertical: 12,
58
+ paddingHorizontal: 24,
59
+ borderRadius: 8,
60
+ backgroundColor: '#2563eb'
61
+ },
62
+ buttonLabel: {
63
+ color: '#ffffff',
64
+ fontSize: 16,
65
+ fontWeight: '600'
66
+ }
67
+ });
68
+ //# sourceMappingURL=ForceUpdateScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Modal","Pressable","StyleSheet","Text","View","jsx","_jsx","jsxs","_jsxs","ForceUpdateScreen","updateInfo","onUpdatePress","title","message","latestVersion","updateButtonLabel","visible","animationType","transparent","onRequestClose","undefined","children","style","styles","container","button","onPress","accessibilityRole","buttonLabel","create","flex","alignItems","justifyContent","padding","fontSize","fontWeight","marginBottom","textAlign","paddingVertical","paddingHorizontal","borderRadius","backgroundColor","color"],"sourceRoot":"../../../../src","sources":["presentation/components/ForceUpdateScreen.tsx"],"mappings":";;AAAA,SAASA,KAAK,EAAEC,SAAS,EAAEC,UAAU,EAAEC,IAAI,EAAEC,IAAI,QAAQ,cAAc;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAYxE;AACA,OAAO,SAASC,iBAAiBA,CAAC;EAChCC,UAAU;EACVC,aAAa;EACbC,KAAK,GAAG,iBAAiB;EACzBC,OAAO,GAAG,WAAWH,UAAU,CAACI,aAAa,6CAA6C;EAC1FC,iBAAiB,GAAG;AACE,CAAC,EAAgB;EACvC,oBACET,IAAA,CAACN,KAAK;IACJgB,OAAO;IACPC,aAAa,EAAC,MAAM;IACpBC,WAAW,EAAE,KAAM;IACnBC,cAAc,EAAEA,CAAA,KAAMC,SAAU;IAAAC,QAAA,eAEhCb,KAAA,CAACJ,IAAI;MAACkB,KAAK,EAAEC,MAAM,CAACC,SAAU;MAAAH,QAAA,gBAC5Bf,IAAA,CAACH,IAAI;QAACmB,KAAK,EAAEC,MAAM,CAACX,KAAM;QAAAS,QAAA,EAAET;MAAK,CAAO,CAAC,eACzCN,IAAA,CAACH,IAAI;QAACmB,KAAK,EAAEC,MAAM,CAACV,OAAQ;QAAAQ,QAAA,EAAER;MAAO,CAAO,CAAC,eAC7CP,IAAA,CAACL,SAAS;QACRqB,KAAK,EAAEC,MAAM,CAACE,MAAO;QACrBC,OAAO,EAAEf,aAAc;QACvBgB,iBAAiB,EAAC,QAAQ;QAAAN,QAAA,eAE1Bf,IAAA,CAACH,IAAI;UAACmB,KAAK,EAAEC,MAAM,CAACK,WAAY;UAAAP,QAAA,EAAEN;QAAiB,CAAO;MAAC,CAClD,CAAC;IAAA,CACR;EAAC,CACF,CAAC;AAEZ;AAEA,MAAMQ,MAAM,GAAGrB,UAAU,CAAC2B,MAAM,CAAC;EAC/BL,SAAS,EAAE;IACTM,IAAI,EAAE,CAAC;IACPC,UAAU,EAAE,QAAQ;IACpBC,cAAc,EAAE,QAAQ;IACxBC,OAAO,EAAE;EACX,CAAC;EACDrB,KAAK,EAAE;IACLsB,QAAQ,EAAE,EAAE;IACZC,UAAU,EAAE,KAAK;IACjBC,YAAY,EAAE,EAAE;IAChBC,SAAS,EAAE;EACb,CAAC;EACDxB,OAAO,EAAE;IAAEqB,QAAQ,EAAE,EAAE;IAAEG,SAAS,EAAE,QAAQ;IAAED,YAAY,EAAE;EAAG,CAAC;EAChEX,MAAM,EAAE;IACNa,eAAe,EAAE,EAAE;IACnBC,iBAAiB,EAAE,EAAE;IACrBC,YAAY,EAAE,CAAC;IACfC,eAAe,EAAE;EACnB,CAAC;EACDb,WAAW,EAAE;IAAEc,KAAK,EAAE,SAAS;IAAER,QAAQ,EAAE,EAAE;IAAEC,UAAU,EAAE;EAAM;AACnE,CAAC,CAAC","ignoreList":[]}