@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.
- package/LICENSE +20 -0
- package/README.md +256 -0
- package/VersionCheck.podspec +20 -0
- package/android/build.gradle +56 -0
- package/android/src/main/AndroidManifest.xml +9 -0
- package/android/src/main/java/com/rsnativekit/versioncheck/SecureStorageCipher.kt +57 -0
- package/android/src/main/java/com/rsnativekit/versioncheck/VersionCheckHeadlessTaskService.kt +31 -0
- package/android/src/main/java/com/rsnativekit/versioncheck/VersionCheckModule.kt +215 -0
- package/android/src/main/java/com/rsnativekit/versioncheck/VersionCheckPackage.kt +31 -0
- package/android/src/main/java/com/rsnativekit/versioncheck/VersionCheckWorker.kt +29 -0
- package/ios/PlatformBridge/Ed25519Verifier.swift +19 -0
- package/ios/VersionCheck.h +5 -0
- package/ios/VersionCheck.mm +278 -0
- package/lib/module/data/cache/MemoryCacheStore.js +30 -0
- package/lib/module/data/cache/MemoryCacheStore.js.map +1 -0
- package/lib/module/data/cache/PersistentCacheStore.js +56 -0
- package/lib/module/data/cache/PersistentCacheStore.js.map +1 -0
- package/lib/module/data/config/ConfigCache.js +29 -0
- package/lib/module/data/config/ConfigCache.js.map +1 -0
- package/lib/module/data/config/ConfigDocumentValidator.js +185 -0
- package/lib/module/data/config/ConfigDocumentValidator.js.map +1 -0
- package/lib/module/data/config/ConfigLoader.js +82 -0
- package/lib/module/data/config/ConfigLoader.js.map +1 -0
- package/lib/module/data/config/ConfigProvider.js +58 -0
- package/lib/module/data/config/ConfigProvider.js.map +1 -0
- package/lib/module/data/config/ConfigResolutionPipeline.js +268 -0
- package/lib/module/data/config/ConfigResolutionPipeline.js.map +1 -0
- package/lib/module/data/config/ConfigValidator.js +69 -0
- package/lib/module/data/config/ConfigValidator.js.map +1 -0
- package/lib/module/data/config/SignatureVerifier.js +80 -0
- package/lib/module/data/config/SignatureVerifier.js.map +1 -0
- package/lib/module/data/config/canonicalize.js +88 -0
- package/lib/module/data/config/canonicalize.js.map +1 -0
- package/lib/module/data/config/sources/EnvironmentOverrideSource.js +20 -0
- package/lib/module/data/config/sources/EnvironmentOverrideSource.js.map +1 -0
- package/lib/module/data/config/sources/LocalConfigSource.js +22 -0
- package/lib/module/data/config/sources/LocalConfigSource.js.map +1 -0
- package/lib/module/data/config/sources/RemoteConfigSource.js +38 -0
- package/lib/module/data/config/sources/RemoteConfigSource.js.map +1 -0
- package/lib/module/data/providers/amazon/AmazonAppstoreProvider.js +13 -0
- package/lib/module/data/providers/amazon/AmazonAppstoreProvider.js.map +1 -0
- package/lib/module/data/providers/apple/AppleStoreProvider.js +67 -0
- package/lib/module/data/providers/apple/AppleStoreProvider.js.map +1 -0
- package/lib/module/data/providers/custom-api/CustomApiProvider.js +51 -0
- package/lib/module/data/providers/custom-api/CustomApiProvider.js.map +1 -0
- package/lib/module/data/providers/firebase-remote-config/FirebaseRemoteConfigProvider.js +13 -0
- package/lib/module/data/providers/firebase-remote-config/FirebaseRemoteConfigProvider.js.map +1 -0
- package/lib/module/data/providers/google-play/GooglePlayProvider.js +62 -0
- package/lib/module/data/providers/google-play/GooglePlayProvider.js.map +1 -0
- package/lib/module/data/providers/huawei/HuaweiAppGalleryProvider.js +18 -0
- package/lib/module/data/providers/huawei/HuaweiAppGalleryProvider.js.map +1 -0
- package/lib/module/data/repositories/VersionRepositoryImpl.js +69 -0
- package/lib/module/data/repositories/VersionRepositoryImpl.js.map +1 -0
- package/lib/module/di/container.js +80 -0
- package/lib/module/di/container.js.map +1 -0
- package/lib/module/domain/IVersionManagerCore.js +4 -0
- package/lib/module/domain/IVersionManagerCore.js.map +1 -0
- package/lib/module/domain/VersionManagerCore.js +276 -0
- package/lib/module/domain/VersionManagerCore.js.map +1 -0
- package/lib/module/domain/engines/decision/DecisionEngine.js +40 -0
- package/lib/module/domain/engines/decision/DecisionEngine.js.map +1 -0
- package/lib/module/domain/engines/policy/IUpdatePolicyEngine.js +4 -0
- package/lib/module/domain/engines/policy/IUpdatePolicyEngine.js.map +1 -0
- package/lib/module/domain/engines/policy/PolicyEngine.js +42 -0
- package/lib/module/domain/engines/policy/PolicyEngine.js.map +1 -0
- package/lib/module/domain/engines/semver/IVersionComparator.js +4 -0
- package/lib/module/domain/engines/semver/IVersionComparator.js.map +1 -0
- package/lib/module/domain/engines/semver/SemVerEngine.js +176 -0
- package/lib/module/domain/engines/semver/SemVerEngine.js.map +1 -0
- package/lib/module/domain/errors/VersionManagerException.js +104 -0
- package/lib/module/domain/errors/VersionManagerException.js.map +1 -0
- package/lib/module/domain/models/ActionPlan.js +9 -0
- package/lib/module/domain/models/ActionPlan.js.map +1 -0
- package/lib/module/domain/models/ConfigDocument.js +4 -0
- package/lib/module/domain/models/ConfigDocument.js.map +1 -0
- package/lib/module/domain/models/Events.js +4 -0
- package/lib/module/domain/models/Events.js.map +1 -0
- package/lib/module/domain/models/LifecycleState.js +29 -0
- package/lib/module/domain/models/LifecycleState.js.map +1 -0
- package/lib/module/domain/models/ParsedVersion.js +2 -0
- package/lib/module/domain/models/ParsedVersion.js.map +1 -0
- package/lib/module/domain/models/PlatformId.js +2 -0
- package/lib/module/domain/models/PlatformId.js.map +1 -0
- package/lib/module/domain/models/PublicApiOptions.js +2 -0
- package/lib/module/domain/models/PublicApiOptions.js.map +1 -0
- package/lib/module/domain/models/RemoteVersionInfo.js +4 -0
- package/lib/module/domain/models/RemoteVersionInfo.js.map +1 -0
- package/lib/module/domain/models/StoreLookup.js +2 -0
- package/lib/module/domain/models/StoreLookup.js.map +1 -0
- package/lib/module/domain/models/Unsubscribe.js +2 -0
- package/lib/module/domain/models/Unsubscribe.js.map +1 -0
- package/lib/module/domain/models/UpdateInfo.js +4 -0
- package/lib/module/domain/models/UpdateInfo.js.map +1 -0
- package/lib/module/domain/models/VersionManagerOptions.js +4 -0
- package/lib/module/domain/models/VersionManagerOptions.js.map +1 -0
- package/lib/module/domain/ports/ICacheStore.js +2 -0
- package/lib/module/domain/ports/ICacheStore.js.map +1 -0
- package/lib/module/domain/ports/IClock.js +2 -0
- package/lib/module/domain/ports/IClock.js.map +1 -0
- package/lib/module/domain/ports/IConfigProvider.js +4 -0
- package/lib/module/domain/ports/IConfigProvider.js.map +1 -0
- package/lib/module/domain/ports/IConfigSources.js +4 -0
- package/lib/module/domain/ports/IConfigSources.js.map +1 -0
- package/lib/module/domain/ports/IPlatformBridge.js +4 -0
- package/lib/module/domain/ports/IPlatformBridge.js.map +1 -0
- package/lib/module/domain/ports/IStoreProvider.js +4 -0
- package/lib/module/domain/ports/IStoreProvider.js.map +1 -0
- package/lib/module/domain/ports/IVersionRepository.js +4 -0
- package/lib/module/domain/ports/IVersionRepository.js.map +1 -0
- package/lib/module/domain/statemachine/LifecycleStateMachine.js +55 -0
- package/lib/module/domain/statemachine/LifecycleStateMachine.js.map +1 -0
- package/lib/module/domain/usecases/CheckForUpdatesUseCase.js +31 -0
- package/lib/module/domain/usecases/CheckForUpdatesUseCase.js.map +1 -0
- package/lib/module/domain/usecases/ForceTriggerUpdateUseCase.js +20 -0
- package/lib/module/domain/usecases/ForceTriggerUpdateUseCase.js.map +1 -0
- package/lib/module/domain/usecases/ResetIgnoredVersionsUseCase.js +24 -0
- package/lib/module/domain/usecases/ResetIgnoredVersionsUseCase.js.map +1 -0
- package/lib/module/index.js +10 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/platform/contracts/IPlatformBridge.js +2 -0
- package/lib/module/platform/contracts/IPlatformBridge.js.map +1 -0
- package/lib/module/platform/createPlatformBridge.js +17 -0
- package/lib/module/platform/createPlatformBridge.js.map +1 -0
- package/lib/module/platform/createPlatformBridge.native.js +9 -0
- package/lib/module/platform/createPlatformBridge.native.js.map +1 -0
- package/lib/module/platform/native/NativePlatformBridge.js +143 -0
- package/lib/module/platform/native/NativePlatformBridge.js.map +1 -0
- package/lib/module/platform/native/NativeVersionCheck.js +33 -0
- package/lib/module/platform/native/NativeVersionCheck.js.map +1 -0
- package/lib/module/platform/web/WebPlatformBridge.js +228 -0
- package/lib/module/platform/web/WebPlatformBridge.js.map +1 -0
- package/lib/module/presentation/components/ForceUpdateScreen.js +68 -0
- package/lib/module/presentation/components/ForceUpdateScreen.js.map +1 -0
- package/lib/module/presentation/components/OptionalUpdateBanner.js +69 -0
- package/lib/module/presentation/components/OptionalUpdateBanner.js.map +1 -0
- package/lib/module/presentation/components/SoftUpdateDialog.js +101 -0
- package/lib/module/presentation/components/SoftUpdateDialog.js.map +1 -0
- package/lib/module/presentation/hooks/VersionManagerProvider.js +18 -0
- package/lib/module/presentation/hooks/VersionManagerProvider.js.map +1 -0
- package/lib/module/presentation/hooks/context.js +5 -0
- package/lib/module/presentation/hooks/context.js.map +1 -0
- package/lib/module/presentation/hooks/useUpdateState.js +26 -0
- package/lib/module/presentation/hooks/useUpdateState.js.map +1 -0
- package/lib/module/presentation/hooks/useVersionManager.js +33 -0
- package/lib/module/presentation/hooks/useVersionManager.js.map +1 -0
- package/lib/module/presentation/state/VersionManagerStore.js +47 -0
- package/lib/module/presentation/state/VersionManagerStore.js.map +1 -0
- package/lib/module/publicApi.js +114 -0
- package/lib/module/publicApi.js.map +1 -0
- package/lib/module/shared/eventbus/EventBus.js +34 -0
- package/lib/module/shared/eventbus/EventBus.js.map +1 -0
- package/lib/module/shared/logging/Logger.js +56 -0
- package/lib/module/shared/logging/Logger.js.map +1 -0
- package/lib/module/ui.js +13 -0
- package/lib/module/ui.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/data/cache/MemoryCacheStore.d.ts +12 -0
- package/lib/typescript/src/data/cache/MemoryCacheStore.d.ts.map +1 -0
- package/lib/typescript/src/data/cache/PersistentCacheStore.d.ts +14 -0
- package/lib/typescript/src/data/cache/PersistentCacheStore.d.ts.map +1 -0
- package/lib/typescript/src/data/config/ConfigCache.d.ts +15 -0
- package/lib/typescript/src/data/config/ConfigCache.d.ts.map +1 -0
- package/lib/typescript/src/data/config/ConfigDocumentValidator.d.ts +20 -0
- package/lib/typescript/src/data/config/ConfigDocumentValidator.d.ts.map +1 -0
- package/lib/typescript/src/data/config/ConfigLoader.d.ts +28 -0
- package/lib/typescript/src/data/config/ConfigLoader.d.ts.map +1 -0
- package/lib/typescript/src/data/config/ConfigProvider.d.ts +30 -0
- package/lib/typescript/src/data/config/ConfigProvider.d.ts.map +1 -0
- package/lib/typescript/src/data/config/ConfigResolutionPipeline.d.ts +49 -0
- package/lib/typescript/src/data/config/ConfigResolutionPipeline.d.ts.map +1 -0
- package/lib/typescript/src/data/config/ConfigValidator.d.ts +10 -0
- package/lib/typescript/src/data/config/ConfigValidator.d.ts.map +1 -0
- package/lib/typescript/src/data/config/SignatureVerifier.d.ts +16 -0
- package/lib/typescript/src/data/config/SignatureVerifier.d.ts.map +1 -0
- package/lib/typescript/src/data/config/canonicalize.d.ts +13 -0
- package/lib/typescript/src/data/config/canonicalize.d.ts.map +1 -0
- package/lib/typescript/src/data/config/sources/EnvironmentOverrideSource.d.ts +17 -0
- package/lib/typescript/src/data/config/sources/EnvironmentOverrideSource.d.ts.map +1 -0
- package/lib/typescript/src/data/config/sources/LocalConfigSource.d.ts +19 -0
- package/lib/typescript/src/data/config/sources/LocalConfigSource.d.ts.map +1 -0
- package/lib/typescript/src/data/config/sources/RemoteConfigSource.d.ts +10 -0
- package/lib/typescript/src/data/config/sources/RemoteConfigSource.d.ts.map +1 -0
- package/lib/typescript/src/data/providers/amazon/AmazonAppstoreProvider.d.ts +9 -0
- package/lib/typescript/src/data/providers/amazon/AmazonAppstoreProvider.d.ts.map +1 -0
- package/lib/typescript/src/data/providers/apple/AppleStoreProvider.d.ts +19 -0
- package/lib/typescript/src/data/providers/apple/AppleStoreProvider.d.ts.map +1 -0
- package/lib/typescript/src/data/providers/custom-api/CustomApiProvider.d.ts +14 -0
- package/lib/typescript/src/data/providers/custom-api/CustomApiProvider.d.ts.map +1 -0
- package/lib/typescript/src/data/providers/firebase-remote-config/FirebaseRemoteConfigProvider.d.ts +9 -0
- package/lib/typescript/src/data/providers/firebase-remote-config/FirebaseRemoteConfigProvider.d.ts.map +1 -0
- package/lib/typescript/src/data/providers/google-play/GooglePlayProvider.d.ts +22 -0
- package/lib/typescript/src/data/providers/google-play/GooglePlayProvider.d.ts.map +1 -0
- package/lib/typescript/src/data/providers/huawei/HuaweiAppGalleryProvider.d.ts +14 -0
- package/lib/typescript/src/data/providers/huawei/HuaweiAppGalleryProvider.d.ts.map +1 -0
- package/lib/typescript/src/data/repositories/VersionRepositoryImpl.d.ts +23 -0
- package/lib/typescript/src/data/repositories/VersionRepositoryImpl.d.ts.map +1 -0
- package/lib/typescript/src/di/container.d.ts +12 -0
- package/lib/typescript/src/di/container.d.ts.map +1 -0
- package/lib/typescript/src/domain/IVersionManagerCore.d.ts +30 -0
- package/lib/typescript/src/domain/IVersionManagerCore.d.ts.map +1 -0
- package/lib/typescript/src/domain/VersionManagerCore.d.ts +94 -0
- package/lib/typescript/src/domain/VersionManagerCore.d.ts.map +1 -0
- package/lib/typescript/src/domain/engines/decision/DecisionEngine.d.ts +16 -0
- package/lib/typescript/src/domain/engines/decision/DecisionEngine.d.ts.map +1 -0
- package/lib/typescript/src/domain/engines/policy/IUpdatePolicyEngine.d.ts +17 -0
- package/lib/typescript/src/domain/engines/policy/IUpdatePolicyEngine.d.ts.map +1 -0
- package/lib/typescript/src/domain/engines/policy/PolicyEngine.d.ts +16 -0
- package/lib/typescript/src/domain/engines/policy/PolicyEngine.d.ts.map +1 -0
- package/lib/typescript/src/domain/engines/semver/IVersionComparator.d.ts +7 -0
- package/lib/typescript/src/domain/engines/semver/IVersionComparator.d.ts.map +1 -0
- package/lib/typescript/src/domain/engines/semver/SemVerEngine.d.ts +11 -0
- package/lib/typescript/src/domain/engines/semver/SemVerEngine.d.ts.map +1 -0
- package/lib/typescript/src/domain/errors/VersionManagerException.d.ts +97 -0
- package/lib/typescript/src/domain/errors/VersionManagerException.d.ts.map +1 -0
- package/lib/typescript/src/domain/models/ActionPlan.d.ts +15 -0
- package/lib/typescript/src/domain/models/ActionPlan.d.ts.map +1 -0
- package/lib/typescript/src/domain/models/ConfigDocument.d.ts +86 -0
- package/lib/typescript/src/domain/models/ConfigDocument.d.ts.map +1 -0
- package/lib/typescript/src/domain/models/Events.d.ts +39 -0
- package/lib/typescript/src/domain/models/Events.d.ts.map +1 -0
- package/lib/typescript/src/domain/models/LifecycleState.d.ts +18 -0
- package/lib/typescript/src/domain/models/LifecycleState.d.ts.map +1 -0
- package/lib/typescript/src/domain/models/ParsedVersion.d.ts +9 -0
- package/lib/typescript/src/domain/models/ParsedVersion.d.ts.map +1 -0
- package/lib/typescript/src/domain/models/PlatformId.d.ts +3 -0
- package/lib/typescript/src/domain/models/PlatformId.d.ts.map +1 -0
- package/lib/typescript/src/domain/models/PublicApiOptions.d.ts +13 -0
- package/lib/typescript/src/domain/models/PublicApiOptions.d.ts.map +1 -0
- package/lib/typescript/src/domain/models/RemoteVersionInfo.d.ts +21 -0
- package/lib/typescript/src/domain/models/RemoteVersionInfo.d.ts.map +1 -0
- package/lib/typescript/src/domain/models/StoreLookup.d.ts +12 -0
- package/lib/typescript/src/domain/models/StoreLookup.d.ts.map +1 -0
- package/lib/typescript/src/domain/models/Unsubscribe.d.ts +2 -0
- package/lib/typescript/src/domain/models/Unsubscribe.d.ts.map +1 -0
- package/lib/typescript/src/domain/models/UpdateInfo.d.ts +11 -0
- package/lib/typescript/src/domain/models/UpdateInfo.d.ts.map +1 -0
- package/lib/typescript/src/domain/models/VersionManagerOptions.d.ts +149 -0
- package/lib/typescript/src/domain/models/VersionManagerOptions.d.ts.map +1 -0
- package/lib/typescript/src/domain/ports/ICacheStore.d.ts +6 -0
- package/lib/typescript/src/domain/ports/ICacheStore.d.ts.map +1 -0
- package/lib/typescript/src/domain/ports/IClock.d.ts +4 -0
- package/lib/typescript/src/domain/ports/IClock.d.ts.map +1 -0
- package/lib/typescript/src/domain/ports/IConfigProvider.d.ts +11 -0
- package/lib/typescript/src/domain/ports/IConfigProvider.d.ts.map +1 -0
- package/lib/typescript/src/domain/ports/IConfigSources.d.ts +25 -0
- package/lib/typescript/src/domain/ports/IConfigSources.d.ts.map +1 -0
- package/lib/typescript/src/domain/ports/IPlatformBridge.d.ts +77 -0
- package/lib/typescript/src/domain/ports/IPlatformBridge.d.ts.map +1 -0
- package/lib/typescript/src/domain/ports/IStoreProvider.d.ts +7 -0
- package/lib/typescript/src/domain/ports/IStoreProvider.d.ts.map +1 -0
- package/lib/typescript/src/domain/ports/IVersionRepository.d.ts +8 -0
- package/lib/typescript/src/domain/ports/IVersionRepository.d.ts.map +1 -0
- package/lib/typescript/src/domain/statemachine/LifecycleStateMachine.d.ts +25 -0
- package/lib/typescript/src/domain/statemachine/LifecycleStateMachine.d.ts.map +1 -0
- package/lib/typescript/src/domain/usecases/CheckForUpdatesUseCase.d.ts +30 -0
- package/lib/typescript/src/domain/usecases/CheckForUpdatesUseCase.d.ts.map +1 -0
- package/lib/typescript/src/domain/usecases/ForceTriggerUpdateUseCase.d.ts +17 -0
- package/lib/typescript/src/domain/usecases/ForceTriggerUpdateUseCase.d.ts.map +1 -0
- package/lib/typescript/src/domain/usecases/ResetIgnoredVersionsUseCase.d.ts +7 -0
- package/lib/typescript/src/domain/usecases/ResetIgnoredVersionsUseCase.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +17 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/platform/contracts/IPlatformBridge.d.ts +2 -0
- package/lib/typescript/src/platform/contracts/IPlatformBridge.d.ts.map +1 -0
- package/lib/typescript/src/platform/createPlatformBridge.d.ts +12 -0
- package/lib/typescript/src/platform/createPlatformBridge.d.ts.map +1 -0
- package/lib/typescript/src/platform/createPlatformBridge.native.d.ts +4 -0
- package/lib/typescript/src/platform/createPlatformBridge.native.d.ts.map +1 -0
- package/lib/typescript/src/platform/native/NativePlatformBridge.d.ts +17 -0
- package/lib/typescript/src/platform/native/NativePlatformBridge.d.ts.map +1 -0
- package/lib/typescript/src/platform/native/NativeVersionCheck.d.ts +45 -0
- package/lib/typescript/src/platform/native/NativeVersionCheck.d.ts.map +1 -0
- package/lib/typescript/src/platform/web/WebPlatformBridge.d.ts +17 -0
- package/lib/typescript/src/platform/web/WebPlatformBridge.d.ts.map +1 -0
- package/lib/typescript/src/presentation/components/ForceUpdateScreen.d.ts +12 -0
- package/lib/typescript/src/presentation/components/ForceUpdateScreen.d.ts.map +1 -0
- package/lib/typescript/src/presentation/components/OptionalUpdateBanner.d.ts +12 -0
- package/lib/typescript/src/presentation/components/OptionalUpdateBanner.d.ts.map +1 -0
- package/lib/typescript/src/presentation/components/SoftUpdateDialog.d.ts +14 -0
- package/lib/typescript/src/presentation/components/SoftUpdateDialog.d.ts.map +1 -0
- package/lib/typescript/src/presentation/hooks/VersionManagerProvider.d.ts +9 -0
- package/lib/typescript/src/presentation/hooks/VersionManagerProvider.d.ts.map +1 -0
- package/lib/typescript/src/presentation/hooks/context.d.ts +3 -0
- package/lib/typescript/src/presentation/hooks/context.d.ts.map +1 -0
- package/lib/typescript/src/presentation/hooks/useUpdateState.d.ts +17 -0
- package/lib/typescript/src/presentation/hooks/useUpdateState.d.ts.map +1 -0
- package/lib/typescript/src/presentation/hooks/useVersionManager.d.ts +22 -0
- package/lib/typescript/src/presentation/hooks/useVersionManager.d.ts.map +1 -0
- package/lib/typescript/src/presentation/state/VersionManagerStore.d.ts +28 -0
- package/lib/typescript/src/presentation/state/VersionManagerStore.d.ts.map +1 -0
- package/lib/typescript/src/publicApi.d.ts +24 -0
- package/lib/typescript/src/publicApi.d.ts.map +1 -0
- package/lib/typescript/src/shared/eventbus/EventBus.d.ts +21 -0
- package/lib/typescript/src/shared/eventbus/EventBus.d.ts.map +1 -0
- package/lib/typescript/src/shared/logging/Logger.d.ts +17 -0
- package/lib/typescript/src/shared/logging/Logger.d.ts.map +1 -0
- package/lib/typescript/src/ui.d.ts +15 -0
- package/lib/typescript/src/ui.d.ts.map +1 -0
- package/package.json +192 -0
- package/src/data/cache/MemoryCacheStore.ts +36 -0
- package/src/data/cache/PersistentCacheStore.ts +63 -0
- package/src/data/config/ConfigCache.ts +30 -0
- package/src/data/config/ConfigDocumentValidator.ts +309 -0
- package/src/data/config/ConfigLoader.ts +105 -0
- package/src/data/config/ConfigProvider.ts +84 -0
- package/src/data/config/ConfigResolutionPipeline.ts +424 -0
- package/src/data/config/ConfigValidator.ts +79 -0
- package/src/data/config/SignatureVerifier.ts +90 -0
- package/src/data/config/canonicalize.ts +111 -0
- package/src/data/config/sources/EnvironmentOverrideSource.ts +22 -0
- package/src/data/config/sources/LocalConfigSource.ts +24 -0
- package/src/data/config/sources/RemoteConfigSource.ts +41 -0
- package/src/data/providers/amazon/AmazonAppstoreProvider.ts +16 -0
- package/src/data/providers/apple/AppleStoreProvider.ts +94 -0
- package/src/data/providers/custom-api/CustomApiProvider.ts +75 -0
- package/src/data/providers/firebase-remote-config/FirebaseRemoteConfigProvider.ts +16 -0
- package/src/data/providers/google-play/GooglePlayProvider.ts +75 -0
- package/src/data/providers/huawei/HuaweiAppGalleryProvider.ts +21 -0
- package/src/data/repositories/VersionRepositoryImpl.ts +90 -0
- package/src/di/container.ts +128 -0
- package/src/domain/IVersionManagerCore.ts +54 -0
- package/src/domain/VersionManagerCore.ts +425 -0
- package/src/domain/engines/decision/DecisionEngine.ts +47 -0
- package/src/domain/engines/policy/IUpdatePolicyEngine.ts +18 -0
- package/src/domain/engines/policy/PolicyEngine.ts +60 -0
- package/src/domain/engines/semver/IVersionComparator.ts +7 -0
- package/src/domain/engines/semver/SemVerEngine.ts +200 -0
- package/src/domain/errors/VersionManagerException.ts +166 -0
- package/src/domain/models/ActionPlan.ts +17 -0
- package/src/domain/models/ConfigDocument.ts +97 -0
- package/src/domain/models/Events.ts +48 -0
- package/src/domain/models/LifecycleState.ts +50 -0
- package/src/domain/models/ParsedVersion.ts +8 -0
- package/src/domain/models/PlatformId.ts +9 -0
- package/src/domain/models/PublicApiOptions.ts +14 -0
- package/src/domain/models/RemoteVersionInfo.ts +23 -0
- package/src/domain/models/StoreLookup.ts +12 -0
- package/src/domain/models/Unsubscribe.ts +1 -0
- package/src/domain/models/UpdateInfo.ts +11 -0
- package/src/domain/models/VersionManagerOptions.ts +150 -0
- package/src/domain/ports/ICacheStore.ts +5 -0
- package/src/domain/ports/IClock.ts +3 -0
- package/src/domain/ports/IConfigProvider.ts +18 -0
- package/src/domain/ports/IConfigSources.ts +44 -0
- package/src/domain/ports/IPlatformBridge.ts +97 -0
- package/src/domain/ports/IStoreProvider.ts +12 -0
- package/src/domain/ports/IVersionRepository.ts +14 -0
- package/src/domain/statemachine/LifecycleStateMachine.ts +76 -0
- package/src/domain/usecases/CheckForUpdatesUseCase.ts +63 -0
- package/src/domain/usecases/ForceTriggerUpdateUseCase.ts +35 -0
- package/src/domain/usecases/ResetIgnoredVersionsUseCase.ts +26 -0
- package/src/index.tsx +84 -0
- package/src/platform/contracts/IPlatformBridge.ts +14 -0
- package/src/platform/createPlatformBridge.native.ts +7 -0
- package/src/platform/createPlatformBridge.ts +15 -0
- package/src/platform/native/NativePlatformBridge.ts +179 -0
- package/src/platform/native/NativeVersionCheck.ts +64 -0
- package/src/platform/web/WebPlatformBridge.ts +347 -0
- package/src/presentation/components/ForceUpdateScreen.tsx +64 -0
- package/src/presentation/components/OptionalUpdateBanner.tsx +53 -0
- package/src/presentation/components/SoftUpdateDialog.tsx +84 -0
- package/src/presentation/hooks/VersionManagerProvider.tsx +23 -0
- package/src/presentation/hooks/context.ts +6 -0
- package/src/presentation/hooks/useUpdateState.ts +50 -0
- package/src/presentation/hooks/useVersionManager.ts +68 -0
- package/src/presentation/state/VersionManagerStore.ts +72 -0
- package/src/publicApi.ts +126 -0
- package/src/shared/eventbus/EventBus.ts +56 -0
- package/src/shared/logging/Logger.ts +70 -0
- 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 @@
|
|
|
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":";;AAAA,SACEA,gBAAgB,EAChBC,uBAAuB,QAClB,gDAA6C;;AAkBpD;AACA;AACA;AACA;AACA;AACA;;AA8EA,MAAMC,SAAS,GAAGC,UAAmC;AAErD,SAASC,aAAaA,CAACC,MAAc,EAAc;EACjD,IAAI,OAAOC,IAAI,KAAK,UAAU,EAAE;IAC9B,MAAMC,MAAM,GAAGD,IAAI,CAACD,MAAM,CAAC;IAC3B,MAAMG,KAAK,GAAG,IAAIC,UAAU,CAACF,MAAM,CAACG,MAAM,CAAC;IAC3C,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,MAAM,CAACG,MAAM,EAAEC,CAAC,EAAE,EAAEH,KAAK,CAACG,CAAC,CAAC,GAAGJ,MAAM,CAACK,UAAU,CAACD,CAAC,CAAC;IACvE,OAAOH,KAAK;EACd;EACA,MAAM,IAAIK,KAAK,CAAC,iDAAiD,CAAC;AACpE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,iBAAiB,CAA4B;EACjD,MAAMC,aAAaA,CACjBC,KAAa,EACbC,aAAqB,EACrBC,eAAuB,EACL;IAClB,MAAMC,MAAM,GAAGjB,SAAS,CAACkB,MAAM,EAAED,MAAM;IACvC,MAAME,WAAW,GAAGnB,SAAS,CAACoB,mBAAmB,GAAGN,KAAK,CAAC;IAC1D,IAAI,CAACG,MAAM,IAAI,CAACE,WAAW,EAAE,OAAO,KAAK;IACzC,MAAME,GAAG,GAAG,MAAMJ,MAAM,CAACK,SAAS,CAChC,KAAK,EACLpB,aAAa,CAACiB,WAAW,CAAC,EAC1B;MAAEI,IAAI,EAAE;IAAU,CAAC,EACnB,KAAK,EACL,CAAC,QAAQ,CACX,CAAC;IACD,OAAON,MAAM,CAACO,MAAM,CAClB;MAAED,IAAI,EAAE;IAAU,CAAC,EACnBF,GAAG,EACHnB,aAAa,CAACc,eAAe,CAAC,EAC9Bd,aAAa,CAACa,aAAa,CAC7B,CAAC;EACH;EAEA,MAAMU,gBAAgBA,CACpBX,KAAa,EACbC,aAAqB,EACrBW,SAAiB,EACC;IAClB,MAAMT,MAAM,GAAGjB,SAAS,CAACkB,MAAM,EAAED,MAAM;IACvC,MAAME,WAAW,GAAGnB,SAAS,CAACoB,mBAAmB,GAAGN,KAAK,CAAC;IAC1D,IAAI,CAACG,MAAM,IAAI,CAACE,WAAW,EAAE,OAAO,KAAK;IACzC,MAAME,GAAG,GAAG,MAAMJ,MAAM,CAACK,SAAS,CAChC,KAAK,EACLpB,aAAa,CAACiB,WAAW,CAAC,EAC1B;MAAEI,IAAI,EAAE,MAAM;MAAEI,IAAI,EAAE;IAAU,CAAC,EACjC,KAAK,EACL,CAAC,MAAM,CACT,CAAC;IACD,MAAMC,QAAQ,GAAG,MAAMX,MAAM,CAACY,IAAI,CAChC;MAAEN,IAAI,EAAE;IAAO,CAAC,EAChBF,GAAG,EACHnB,aAAa,CAACa,aAAa,CAC7B,CAAC;IACD,MAAMe,aAAa,GAAG,IAAIvB,UAAU,CAACqB,QAAuB,CAAC;IAC7D,MAAMG,aAAa,GAAG7B,aAAa,CAACwB,SAAS,CAAC;IAC9C,IAAII,aAAa,CAACtB,MAAM,KAAKuB,aAAa,CAACvB,MAAM,EAAE,OAAO,KAAK;IAC/D,IAAIwB,IAAI,GAAG,CAAC;IACZ,KAAK,IAAIvB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGqB,aAAa,CAACtB,MAAM,EAAEC,CAAC,EAAE,EAAE;MAC7CuB,IAAI,IAAKF,aAAa,CAACrB,CAAC,CAAC,GAAesB,aAAa,CAACtB,CAAC,CAAY;IACrE;IACA,OAAOuB,IAAI,KAAK,CAAC;EACnB;AACF;AAEA,MAAMC,aAAa,CAAwB;EACzC,MAAMC,OAAOA,CAACC,GAAgB,EAAyB;IACrD,MAAMC,UAAU,GAAG,IAAIpC,SAAS,CAACqC,eAAe,CAAC,CAAC;IAClD,MAAMC,OAAO,GAAGC,UAAU,CAAC,MAAMH,UAAU,CAACI,KAAK,CAAC,CAAC,EAAEL,GAAG,CAACM,SAAS,CAAC;IACnE,IAAI;MACF,MAAMC,QAAQ,GAAG,MAAM1C,SAAS,CAAC2C,KAAK,CAACR,GAAG,CAACS,GAAG,EAAE;QAC9CC,MAAM,EAAEV,GAAG,CAACU,MAAM;QAClBC,OAAO,EAAEX,GAAG,CAACW,OAA6C;QAC1DC,IAAI,EAAEZ,GAAG,CAACY,IAAI;QACdC,MAAM,EAAEZ,UAAU,CAACY;MACrB,CAAC,CAAC;MACF,MAAMF,OAA+B,GAAG,CAAC,CAAC;MAC1CJ,QAAQ,CAACI,OAAO,CAACG,OAAO,CAAC,CAACC,KAAK,EAAE7B,GAAG,KAAK;QACvCyB,OAAO,CAACzB,GAAG,CAAC,GAAG6B,KAAK;MACtB,CAAC,CAAC;MACF,MAAMH,IAAI,GAAG,MAAML,QAAQ,CAACS,IAAI,CAAC,CAAC;MAClC,OAAO;QAAEC,MAAM,EAAEV,QAAQ,CAACU,MAAM;QAAEN,OAAO;QAAEC;MAAK,CAAC;IACnD,CAAC,CAAC,OAAOM,KAAK,EAAE;MACd,IAAIA,KAAK,YAAY1C,KAAK,IAAI0C,KAAK,CAAC9B,IAAI,KAAK,YAAY,EAAE;QACzD,MAAM,IAAIxB,uBAAuB,CAAC;UAChCuD,OAAO,EAAE,eAAenB,GAAG,CAACS,GAAG,qBAAqBT,GAAG,CAACM,SAAS,IAAI;UACrEc,KAAK,EAAEF;QACT,CAAC,CAAC;MACJ;MACA,MAAM,IAAIvD,gBAAgB,CAAC;QACzBwD,OAAO,EAAE,eAAenB,GAAG,CAACS,GAAG,UAAU;QACzCW,KAAK,EAAEF;MACT,CAAC,CAAC;IACJ,CAAC,SAAS;MACRG,YAAY,CAAClB,OAAO,CAAC;IACvB;EACF;AACF;AAEA,MAAMmB,kBAAkB,CAA6B;EACnD,MAAMC,GAAGA,CAACrC,GAAW,EAA0B;IAC7C,OAAOrB,SAAS,CAAC2D,YAAY,CAACC,OAAO,CAACvC,GAAG,CAAC;EAC5C;EACA,MAAMwC,GAAGA,CAACxC,GAAW,EAAE6B,KAAa,EAAiB;IACnDlD,SAAS,CAAC2D,YAAY,CAACG,OAAO,CAACzC,GAAG,EAAE6B,KAAK,CAAC;EAC5C;EACA,MAAMa,MAAMA,CAAC1C,GAAW,EAAiB;IACvCrB,SAAS,CAAC2D,YAAY,CAACK,UAAU,CAAC3C,GAAG,CAAC;EACxC;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM4C,gBAAgB,CAA2B;EAC/C,OAAwBC,MAAM,GAAG,YAAY;EAC7C,MAAMN,OAAOA,CAACvC,GAAW,EAA0B;IACjD,OAAOrB,SAAS,CAAC2D,YAAY,CAACC,OAAO,CAACK,gBAAgB,CAACC,MAAM,GAAG7C,GAAG,CAAC;EACtE;EACA,MAAMyC,OAAOA,CAACzC,GAAW,EAAE6B,KAAa,EAAiB;IACvDlD,SAAS,CAAC2D,YAAY,CAACG,OAAO,CAACG,gBAAgB,CAACC,MAAM,GAAG7C,GAAG,EAAE6B,KAAK,CAAC;EACtE;EACA,MAAMc,UAAUA,CAAC3C,GAAW,EAAiB;IAC3CrB,SAAS,CAAC2D,YAAY,CAACK,UAAU,CAACC,gBAAgB,CAACC,MAAM,GAAG7C,GAAG,CAAC;EAClE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM8C,kBAAkB,CAA6B;EACnD,MAAMC,iBAAiBA,CAAA,EAAoB;IACzC,OAAO,OAAO;EAChB;EACA,MAAMC,cAAcA,CAAA,EAAoB;IACtC,OAAO,GAAG;EACZ;EACA,MAAMC,WAAWA,CAAA,EAAoB;IACnC,OAAO,KAAK;EACd;AACF;AAEA,MAAMC,qBAAqB,CAAgC;EACzD,MAAMC,YAAYA,CAAA,EAAoB;IACpC,OAAOxE,SAAS,CAACyE,SAAS,CAACC,SAAS;EACtC;EACA,MAAMC,cAAcA,CAAA,EAAoB;IACtC,OAAO,KAAK;EACd;EACA,MAAMC,SAASA,CAAA,EAAoB;IACjC,OAAO5E,SAAS,CAACyE,SAAS,CAACI,QAAQ;EACrC;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,sBAAsB,CAAiC;EAC1CC,MAAM,GAAG,IAAIC,GAAG,CAAyC,CAAC;EAC1DC,SAAS,GAAG,IAAID,GAAG,CAAqB,CAAC;EAE1D,MAAME,QAAQA,CAACC,IAA8B,EAAiB;IAC5D,IAAI,CAACC,cAAc,CAACD,IAAI,CAACE,MAAM,CAAC;IAChC,MAAMC,KAAK,GAAGC,WAAW,CAAC,MAAM;MAC9B,IAAIvF,SAAS,CAACwF,QAAQ,CAACC,eAAe,KAAK,SAAS,EAAE;MACtD,IAAI,CAACR,SAAS,CAACvB,GAAG,CAACyB,IAAI,CAACE,MAAM,CAAC,GAAG,CAAC;IACrC,CAAC,EAAEF,IAAI,CAACO,aAAa,CAAC;IACtB,IAAI,CAACX,MAAM,CAAClB,GAAG,CAACsB,IAAI,CAACE,MAAM,EAAEC,KAAK,CAAC;EACrC;EAEA,MAAMK,MAAMA,CAACN,MAAc,EAAiB;IAC1C,IAAI,CAACD,cAAc,CAACC,MAAM,CAAC;EAC7B;;EAEA;EACAO,WAAWA,CAACP,MAAc,EAAEQ,EAAc,EAAQ;IAChD,IAAI,CAACZ,SAAS,CAACpB,GAAG,CAACwB,MAAM,EAAEQ,EAAE,CAAC;EAChC;EAEQT,cAAcA,CAACC,MAAc,EAAQ;IAC3C,MAAMS,QAAQ,GAAG,IAAI,CAACf,MAAM,CAACrB,GAAG,CAAC2B,MAAM,CAAC;IACxC,IAAIS,QAAQ,KAAKC,SAAS,EAAE;MAC1BC,aAAa,CAACF,QAAQ,CAAC;MACvB,IAAI,CAACf,MAAM,CAACkB,MAAM,CAACZ,MAAM,CAAC;IAC5B;EACF;AACF;AAEA,MAAMa,uBAAuB,CAAkC;EAC7DC,YAAYA,CAACN,EAAc,EAAe;IACxC,MAAMO,OAAO,GAAGA,CAAA,KAAY;MAC1B,IAAIpG,SAAS,CAACwF,QAAQ,CAACC,eAAe,KAAK,SAAS,EAAEI,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD7F,SAAS,CAACwF,QAAQ,CAACa,gBAAgB,CAAC,kBAAkB,EAAED,OAAO,CAAC;IAChE,OAAO,MACLpG,SAAS,CAACwF,QAAQ,CAACc,mBAAmB,CAAC,kBAAkB,EAAEF,OAAO,CAAC;EACvE;EAEAG,YAAYA,CAACV,EAAc,EAAe;IACxC,MAAMO,OAAO,GAAGA,CAAA,KAAY;MAC1B,IAAIpG,SAAS,CAACwF,QAAQ,CAACC,eAAe,KAAK,QAAQ,EAAEI,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD7F,SAAS,CAACwF,QAAQ,CAACa,gBAAgB,CAAC,kBAAkB,EAAED,OAAO,CAAC;IAChE,OAAO,MACLpG,SAAS,CAACwF,QAAQ,CAACc,mBAAmB,CAAC,kBAAkB,EAAEF,OAAO,CAAC;EACvE;AACF;AAEA,OAAO,MAAMI,iBAAiB,CAA4B;EAC/CC,QAAQ,GAAe,KAAK;EAC5BC,IAAI,GAAgB,IAAIzE,aAAa,CAAC,CAAC;EACvC0E,OAAO,GAAqB,IAAIlD,kBAAkB,CAAC,CAAC;EACpDmD,aAAa,GAAmB,IAAI3C,gBAAgB,CAAC,CAAC;EACtD4C,OAAO,GAAqB,IAAI1C,kBAAkB,CAAC,CAAC;EACpD2C,UAAU,GAAwB,IAAIvC,qBAAqB,CAAC,CAAC;EAC7DwC,SAAS,GAAyB,IAAIjC,sBAAsB,CAAC,CAAC;EAC9DkC,KAAK,GAAG;IAAEC,GAAG,EAAEA,CAAA,KAAcC,IAAI,CAACD,GAAG,CAAC;EAAE,CAAC;EACzCE,SAAS,GAA0B,IAAIjB,uBAAuB,CAAC,CAAC;EAChEhF,MAAM,GAAoB,IAAIN,iBAAiB,CAAC,CAAC;AAC5D","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":[]}
|