@_nazmiforreal/flutter-ota 0.1.25 → 0.1.27

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 (256) hide show
  1. package/bin/flutter-ota-linux-x64 +0 -0
  2. package/bin/flutter-ota.js +12 -11
  3. package/dart-src/packages/cli-tools/lib/flutter_ota_kit_cli.dart +46 -13
  4. package/dart-src/packages/cli-tools/lib/src/backend.dart +6 -6
  5. package/dart-src/packages/cli-tools/lib/src/commands/build.dart +2 -0
  6. package/dart-src/packages/cli-tools/lib/src/commands/bundle.dart +7 -7
  7. package/dart-src/packages/cli-tools/lib/src/commands/deploy.dart +4 -1
  8. package/dart-src/packages/cli-tools/lib/src/commands/pocketbase.dart +1 -1
  9. package/dart-src/packages/cli-tools/lib/src/commands/rollback.dart +1 -1
  10. package/dart-src/packages/cli-tools/lib/src/config.dart +5 -5
  11. package/dart-src/packages/cli-tools/lib/src/operations.dart +2 -2
  12. package/dart-src/packages/cli-tools/pubspec.yaml +8 -21
  13. package/dart-src/packages/cli-tools/test/backends_test.dart +3 -3
  14. package/dart-src/packages/cli-tools/test/cli_test.dart +1 -1
  15. package/dart-src/packages/cli-tools/test/mocks/mock_aws_s3_client.dart +2 -2
  16. package/dart-src/packages/cli-tools/test/mocks/mock_d1_client.dart +2 -2
  17. package/dart-src/packages/cli-tools/test/mocks/mock_pocketbase_client.dart +4 -1
  18. package/dart-src/packages/cli-tools/test/mocks/mock_postgres_client.dart +2 -2
  19. package/dart-src/packages/cli-tools/test/pocketbase_smoke_test.dart +1 -1
  20. package/dart-src/root/README.md +394 -0
  21. package/dart-src/root/analysis_options.yaml +21 -0
  22. package/dart-src/root/android/build.gradle +116 -0
  23. package/dart-src/root/android/consumer-rules.pro +23 -0
  24. package/dart-src/root/android/settings.gradle +1 -0
  25. package/dart-src/root/android/src/main/AndroidManifest.xml +21 -0
  26. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/ApplyResult.kt +52 -0
  27. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/BlacklistStore.kt +154 -0
  28. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/BootDiagnosticStore.kt +150 -0
  29. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/CrashGuard.kt +271 -0
  30. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/FlutterPatcherApplication.kt +201 -0
  31. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/FlutterPatcherAutoInitProvider.kt +93 -0
  32. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/FlutterPatcherPlugin.kt +245 -0
  33. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/LoaderHook.kt +298 -0
  34. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/PatchManager.kt +1579 -0
  35. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/PatcherConfig.kt +173 -0
  36. package/dart-src/root/android/src/main/kotlin/com/flutter_patcher/flutter_patcher/SignatureVerifier.kt +177 -0
  37. package/dart-src/root/android/src/test/kotlin/com/flutter_patcher/flutter_patcher/CrashGuardTest.kt +61 -0
  38. package/dart-src/root/android/src/test/kotlin/com/flutter_patcher/flutter_patcher/LoaderHookTest.kt +25 -0
  39. package/dart-src/root/android/src/test/kotlin/com/flutter_patcher/flutter_patcher/PatchManagerTest.kt +401 -0
  40. package/dart-src/root/android/src/test/kotlin/com/flutter_patcher/flutter_patcher/PatcherConfigTest.kt +30 -0
  41. package/dart-src/root/bin/pack.dart +182 -0
  42. package/dart-src/root/lib/flutter_ota_kit.dart +1170 -0
  43. package/dart-src/root/lib/src/app_version_resolver.dart +36 -0
  44. package/dart-src/root/lib/src/aws_update_source.dart +97 -0
  45. package/dart-src/root/lib/src/blacklist.dart +54 -0
  46. package/dart-src/root/lib/src/boot_diagnostic.dart +138 -0
  47. package/dart-src/root/lib/src/cloudflare_update_source.dart +97 -0
  48. package/dart-src/root/lib/src/flutter_ota_app.dart +69 -0
  49. package/dart-src/root/lib/src/io.dart +48 -0
  50. package/dart-src/root/lib/src/io_stub.dart +19 -0
  51. package/dart-src/root/lib/src/ota_progress_overlay.dart +987 -0
  52. package/dart-src/root/lib/src/pack/pack.dart +434 -0
  53. package/dart-src/root/lib/src/patch_info.dart +12 -0
  54. package/dart-src/root/lib/src/patcher_channel.dart +160 -0
  55. package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_database.dart +1 -1
  56. package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_s3_client.dart +1 -1
  57. package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_storage.dart +1 -1
  58. package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_storage_profile.dart +1 -1
  59. package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/with_cloudfront_signed_url.dart +1 -1
  60. package/dart-src/root/lib/src/pkg/client/flutter_ota_kit_client.dart +1 -0
  61. package/dart-src/root/lib/src/pkg/client/src/server_update_source.dart +46 -0
  62. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/cloudflare_worker_database.dart +1 -1
  63. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/d1_build_where.dart +1 -1
  64. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/d1_bundle_mapper.dart +3 -3
  65. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/d1_database.dart +1 -1
  66. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/d1_database_plugin.dart +2 -2
  67. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/r2_s3_client.dart +1 -1
  68. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/r2_storage.dart +1 -1
  69. package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/r2_storage_profile.dart +1 -1
  70. package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/status.dart +1 -1
  71. package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/flutter_ota_kit_plugin_core.dart +1 -1
  72. package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/create_blob_database_plugin.dart +1 -1
  73. package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/filter_compatible_app_versions.dart +1 -1
  74. package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/get_update_info.dart +1 -1
  75. package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/request_update_bundle_state.dart +1 -1
  76. package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/resolve_update_info_from_bundles.dart +1 -1
  77. package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/types.dart +2 -2
  78. package/dart-src/{plugins/pocketbase/lib → root/lib/src/pkg/pocketbase}/src/pocketbase_bundle_mapper.dart +2 -2
  79. package/dart-src/{plugins/pocketbase/lib → root/lib/src/pkg/pocketbase}/src/pocketbase_database.dart +26 -15
  80. package/dart-src/{plugins/pocketbase/lib → root/lib/src/pkg/pocketbase}/src/pocketbase_storage.dart +1 -1
  81. package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/src/postgres_bundle_mapper.dart +2 -2
  82. package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/src/postgres_database.dart +2 -2
  83. package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/src/postgres_get_update_info.dart +2 -2
  84. package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/src/postgres_storage.dart +1 -1
  85. package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/src/postgres_types.dart +1 -1
  86. package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_bundle_mapper.dart +2 -2
  87. package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_database.dart +2 -2
  88. package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_edge_function_database.dart +1 -1
  89. package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_edge_function_storage.dart +1 -1
  90. package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_storage.dart +1 -1
  91. package/dart-src/root/lib/src/pocketbase_update_source.dart +107 -0
  92. package/dart-src/root/lib/src/postgres_update_source.dart +95 -0
  93. package/dart-src/root/lib/src/shared_update_check.dart +131 -0
  94. package/dart-src/root/lib/src/supabase_update_source.dart +93 -0
  95. package/dart-src/root/pubspec.yaml +54 -0
  96. package/package.json +2 -1
  97. package/scripts/postinstall.js +17 -13
  98. package/scripts/vendor.sh +22 -7
  99. package/dart-src/packages/core/CHANGELOG.md +0 -21
  100. package/dart-src/packages/core/README.md +0 -23
  101. package/dart-src/packages/core/example/lib/main.dart +0 -69
  102. package/dart-src/packages/core/pubspec.yaml +0 -13
  103. package/dart-src/packages/core/test/rollout_test.dart +0 -135
  104. package/dart-src/packages/core/test/semver_test.dart +0 -55
  105. package/dart-src/packages/core/test/semver_vectors.json +0 -1
  106. package/dart-src/packages/core/test/types_test.dart +0 -131
  107. package/dart-src/packages/core/test/uuid_test.dart +0 -40
  108. package/dart-src/packages/core/tool/dbg.dart +0 -7
  109. package/dart-src/plugins/aws/.gitkeep +0 -0
  110. package/dart-src/plugins/aws/CHANGELOG.md +0 -23
  111. package/dart-src/plugins/aws/LICENSE +0 -21
  112. package/dart-src/plugins/aws/README.md +0 -28
  113. package/dart-src/plugins/aws/example/lib/main.dart +0 -60
  114. package/dart-src/plugins/aws/pubspec.yaml +0 -30
  115. package/dart-src/plugins/aws/test/aws_database_test.dart +0 -161
  116. package/dart-src/plugins/aws/test/aws_storage_test.dart +0 -73
  117. package/dart-src/plugins/aws/test/mock_aws_s3_client.dart +0 -78
  118. package/dart-src/plugins/cloudflare/.gitkeep +0 -0
  119. package/dart-src/plugins/cloudflare/CHANGELOG.md +0 -23
  120. package/dart-src/plugins/cloudflare/LICENSE +0 -21
  121. package/dart-src/plugins/cloudflare/README.md +0 -25
  122. package/dart-src/plugins/cloudflare/example/lib/main.dart +0 -62
  123. package/dart-src/plugins/cloudflare/migrations/0001_hot-updater_init.sql +0 -16
  124. package/dart-src/plugins/cloudflare/migrations/0002_hot-updater_0.13.0.sql +0 -8
  125. package/dart-src/plugins/cloudflare/migrations/0003_hot-updater_0.18.0.sql +0 -38
  126. package/dart-src/plugins/cloudflare/migrations/0004_hot-updater_0.29.0.sql +0 -11
  127. package/dart-src/plugins/cloudflare/migrations/0005_hot-updater_0.31.0.sql +0 -24
  128. package/dart-src/plugins/cloudflare/pubspec.yaml +0 -28
  129. package/dart-src/plugins/cloudflare/sql/bundles.sql +0 -42
  130. package/dart-src/plugins/cloudflare/test/cloudflare_worker_database_test.dart +0 -126
  131. package/dart-src/plugins/cloudflare/test/d1_bundle_mapper_test.dart +0 -106
  132. package/dart-src/plugins/cloudflare/test/d1_database_test.dart +0 -200
  133. package/dart-src/plugins/cloudflare/test/mock_d1_client.dart +0 -261
  134. package/dart-src/plugins/cloudflare/test/mock_r2_client.dart +0 -78
  135. package/dart-src/plugins/cloudflare/test/r2_storage_test.dart +0 -74
  136. package/dart-src/plugins/plugin-core/CHANGELOG.md +0 -20
  137. package/dart-src/plugins/plugin-core/LICENSE +0 -21
  138. package/dart-src/plugins/plugin-core/README.md +0 -21
  139. package/dart-src/plugins/plugin-core/example/lib/main.dart +0 -61
  140. package/dart-src/plugins/plugin-core/pubspec.yaml +0 -23
  141. package/dart-src/plugins/plugin-core/test/asset_storage_layout_test.dart +0 -170
  142. package/dart-src/plugins/plugin-core/test/bundle_unit_of_work_store_test.dart +0 -74
  143. package/dart-src/plugins/plugin-core/test/bundle_unit_of_work_test.dart +0 -345
  144. package/dart-src/plugins/plugin-core/test/create_blob_database_plugin_test.dart +0 -843
  145. package/dart-src/plugins/plugin-core/test/create_database_plugin_test.dart +0 -298
  146. package/dart-src/plugins/plugin-core/test/create_storage_plugin_test.dart +0 -195
  147. package/dart-src/plugins/plugin-core/test/generate_min_bundle_id_test.dart +0 -56
  148. package/dart-src/plugins/plugin-core/test/get_update_info_test.dart +0 -1589
  149. package/dart-src/plugins/plugin-core/test/helpers_test.dart +0 -283
  150. package/dart-src/plugins/plugin-core/test/query_bundles_test.dart +0 -202
  151. package/dart-src/plugins/plugin-core/test/request_update_bundle_state_test.dart +0 -86
  152. package/dart-src/plugins/plugin-core/test/uuidv7_test.dart +0 -88
  153. package/dart-src/plugins/pocketbase/CHANGELOG.md +0 -23
  154. package/dart-src/plugins/pocketbase/LICENSE +0 -21
  155. package/dart-src/plugins/pocketbase/README.md +0 -54
  156. package/dart-src/plugins/pocketbase/example/lib/main.dart +0 -62
  157. package/dart-src/plugins/pocketbase/pubspec.yaml +0 -26
  158. package/dart-src/plugins/pocketbase/test/pb_uri_test.dart +0 -12
  159. package/dart-src/plugins/postgres/.gitkeep +0 -0
  160. package/dart-src/plugins/postgres/CHANGELOG.md +0 -23
  161. package/dart-src/plugins/postgres/LICENSE +0 -21
  162. package/dart-src/plugins/postgres/README.md +0 -29
  163. package/dart-src/plugins/postgres/example/lib/main.dart +0 -67
  164. package/dart-src/plugins/postgres/pubspec.yaml +0 -26
  165. package/dart-src/plugins/postgres/sql/bundles.sql +0 -45
  166. package/dart-src/plugins/postgres/sql/get_target_app_version_list.sql +0 -21
  167. package/dart-src/plugins/postgres/sql/get_update_info.spec.ts +0 -171
  168. package/dart-src/plugins/postgres/sql/get_update_info_by_app_version.sql +0 -126
  169. package/dart-src/plugins/postgres/sql/get_update_info_by_fingerprint_hash.sql +0 -125
  170. package/dart-src/plugins/postgres/sql/hash_user_id.sql +0 -30
  171. package/dart-src/plugins/postgres/sql/is_device_eligible.sql +0 -237
  172. package/dart-src/plugins/postgres/sql/prepareSql.ts +0 -11
  173. package/dart-src/plugins/postgres/test/mock_postgres_client.dart +0 -320
  174. package/dart-src/plugins/postgres/test/postgres_bundle_mapper_test.dart +0 -139
  175. package/dart-src/plugins/postgres/test/postgres_database_test.dart +0 -210
  176. package/dart-src/plugins/postgres/test/postgres_storage_runtime_test.dart +0 -60
  177. package/dart-src/plugins/supabase/CHANGELOG.md +0 -24
  178. package/dart-src/plugins/supabase/LICENSE +0 -21
  179. package/dart-src/plugins/supabase/README.md +0 -53
  180. package/dart-src/plugins/supabase/example/lib/main.dart +0 -63
  181. package/dart-src/plugins/supabase/pubspec.yaml +0 -27
  182. package/dart-src/plugins/supabase/supabase/edge-functions/index.ts +0 -44
  183. package/dart-src/plugins/supabase/supabase/edge-functions/runtime.docker.integration.spec.ts +0 -968
  184. package/dart-src/plugins/supabase/supabase/migrations/20250103114225_init.sql +0 -232
  185. package/dart-src/plugins/supabase/supabase/migrations/20250314000000_hot-updater_0.13.0.sql +0 -137
  186. package/dart-src/plugins/supabase/supabase/migrations/20250516000000_hot-updater_0.18.0.sql +0 -206
  187. package/dart-src/plugins/supabase/supabase/migrations/20251014000000_hot-updater_0.21.0.sql +0 -186
  188. package/dart-src/plugins/supabase/supabase/migrations/20260401000000_hot-updater_0.29.0.sql +0 -505
  189. package/dart-src/plugins/supabase/supabase/migrations/20260414000000_hot-updater_0.30.0.sql +0 -50
  190. package/dart-src/plugins/supabase/supabase/migrations/20260422000000_hot-updater_0.31.0.sql +0 -20
  191. package/dart-src/plugins/supabase/supabase/migrations/20260520014100_hot-updater_rls.sql +0 -75
  192. package/dart-src/plugins/supabase/test/mock_supabase_client.dart +0 -654
  193. package/dart-src/plugins/supabase/test/supabase_bundle_mapper_test.dart +0 -115
  194. package/dart-src/plugins/supabase/test/supabase_database_test.dart +0 -198
  195. package/dart-src/plugins/supabase/test/supabase_storage_test.dart +0 -168
  196. /package/dart-src/{packages/core → root}/LICENSE +0 -0
  197. /package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/flutter_ota_kit_aws.dart +0 -0
  198. /package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_cloudfront_client.dart +0 -0
  199. /package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_cloudfront_signer.dart +0 -0
  200. /package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_config.dart +0 -0
  201. /package/dart-src/{plugins/aws/lib → root/lib/src/pkg/aws}/src/aws_ssm_client.dart +0 -0
  202. /package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/flutter_ota_kit_cloudflare.dart +0 -0
  203. /package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/d1_client.dart +0 -0
  204. /package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/d1_config.dart +0 -0
  205. /package/dart-src/{plugins/cloudflare/lib → root/lib/src/pkg/cloudflare}/src/r2_config.dart +0 -0
  206. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/flutter_ota_kit_core.dart +0 -0
  207. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/app_update_info.dart +0 -0
  208. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/bundle.dart +0 -0
  209. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/bundle_artifacts.dart +0 -0
  210. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/bundle_patch_artifact.dart +0 -0
  211. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/changed_asset.dart +0 -0
  212. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/get_bundles_args.dart +0 -0
  213. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/metadata.dart +0 -0
  214. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/patch_info.dart +0 -0
  215. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/platform.dart +0 -0
  216. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/rollout.dart +0 -0
  217. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/semver.dart +0 -0
  218. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/semver_range.dart +0 -0
  219. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/semver_version.dart +0 -0
  220. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/strategy.dart +0 -0
  221. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/update_bundle_params.dart +0 -0
  222. /package/dart-src/{packages/core/lib → root/lib/src/pkg/core}/src/uuid.dart +0 -0
  223. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/asset_storage_layout.dart +0 -0
  224. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/bundle_helpers.dart +0 -0
  225. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/bundle_storage_layout.dart +0 -0
  226. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/bundle_unit_of_work.dart +0 -0
  227. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/bundle_unit_of_work_store.dart +0 -0
  228. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/calculate_pagination.dart +0 -0
  229. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/compression_format.dart +0 -0
  230. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/content_addressed_assets.dart +0 -0
  231. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/create_database_plugin.dart +0 -0
  232. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/create_storage_key_builder.dart +0 -0
  233. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/create_storage_plugin.dart +0 -0
  234. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/generate_min_bundle_id.dart +0 -0
  235. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/is_object.dart +0 -0
  236. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/legacy_asset_storage_layout.dart +0 -0
  237. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/paginate_bundles.dart +0 -0
  238. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/parse_storage_uri.dart +0 -0
  239. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/query_bundles.dart +0 -0
  240. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/storage_helpers.dart +0 -0
  241. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/storage_profile.dart +0 -0
  242. /package/dart-src/{plugins/plugin-core/lib → root/lib/src/pkg/plugin_core}/src/uuidv7.dart +0 -0
  243. /package/dart-src/{plugins/pocketbase/lib → root/lib/src/pkg/pocketbase}/flutter_ota_kit_pocketbase.dart +0 -0
  244. /package/dart-src/{plugins/pocketbase/lib → root/lib/src/pkg/pocketbase}/src/pocketbase_client.dart +0 -0
  245. /package/dart-src/{plugins/pocketbase/lib → root/lib/src/pkg/pocketbase}/src/pocketbase_config.dart +0 -0
  246. /package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/flutter_ota_kit_postgres.dart +0 -0
  247. /package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/src/postgres_client.dart +0 -0
  248. /package/dart-src/{plugins/postgres/lib → root/lib/src/pkg/postgres}/src/postgres_config.dart +0 -0
  249. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/edge.dart +0 -0
  250. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/flutter_ota_kit_supabase.dart +0 -0
  251. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/error_message.dart +0 -0
  252. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_client_adapter.dart +0 -0
  253. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_client_http.dart +0 -0
  254. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_config.dart +0 -0
  255. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/supabase_signed_url_batcher.dart +0 -0
  256. /package/dart-src/{plugins/supabase/lib → root/lib/src/pkg/supabase}/src/types.dart +0 -0
@@ -1,186 +0,0 @@
1
- DO $$ BEGIN DROP FUNCTION IF EXISTS get_update_info_by_fingerprint_hash(platforms, uuid, uuid, text, text); EXCEPTION WHEN undefined_function THEN NULL; END $$;
2
- DO $$ BEGIN DROP FUNCTION IF EXISTS get_update_info_by_fingerprint_hash(platforms, uuid, uuid, text, text, text); EXCEPTION WHEN undefined_function THEN NULL; END $$;
3
- DO $$ BEGIN DROP FUNCTION IF EXISTS get_update_info_by_app_version(platforms, text, uuid, uuid, text, text[]); EXCEPTION WHEN undefined_function THEN NULL; END $$;
4
- DO $$ BEGIN DROP FUNCTION IF EXISTS get_update_info_by_app_version(platforms, text, uuid, uuid, text, text[], text); EXCEPTION WHEN undefined_function THEN NULL; END $$;
5
-
6
- -- HotUpdater.get_update_info
7
- CREATE OR REPLACE FUNCTION get_update_info_by_fingerprint_hash (
8
- app_platform platforms,
9
- bundle_id uuid,
10
- min_bundle_id uuid,
11
- target_channel text,
12
- target_fingerprint_hash text
13
- )
14
- RETURNS TABLE (
15
- id uuid,
16
- should_force_update boolean,
17
- message text,
18
- status text,
19
- storage_uri text,
20
- file_hash text
21
- )
22
- LANGUAGE plpgsql
23
- AS
24
- $$
25
- DECLARE
26
- NIL_UUID CONSTANT uuid := '00000000-0000-0000-0000-000000000000';
27
- BEGIN
28
- RETURN QUERY
29
- WITH update_candidate AS (
30
- SELECT
31
- b.id,
32
- b.should_force_update,
33
- b.message,
34
- 'UPDATE' AS status,
35
- b.storage_uri,
36
- b.file_hash
37
- FROM bundles b
38
- WHERE b.enabled = TRUE
39
- AND b.platform = app_platform
40
- AND b.id >= bundle_id
41
- AND b.id > min_bundle_id
42
- AND b.channel = target_channel
43
- AND b.fingerprint_hash = target_fingerprint_hash
44
- ORDER BY b.id DESC
45
- LIMIT 1
46
- ),
47
- rollback_candidate AS (
48
- SELECT
49
- b.id,
50
- TRUE AS should_force_update,
51
- b.message,
52
- 'ROLLBACK' AS status,
53
- b.storage_uri,
54
- b.file_hash
55
- FROM bundles b
56
- WHERE b.enabled = TRUE
57
- AND b.platform = app_platform
58
- AND b.id < bundle_id
59
- AND b.id > min_bundle_id
60
- AND b.channel = target_channel
61
- AND b.fingerprint_hash = target_fingerprint_hash
62
- ORDER BY b.id DESC
63
- LIMIT 1
64
- ),
65
- final_result AS (
66
- SELECT * FROM update_candidate
67
- UNION ALL
68
- SELECT * FROM rollback_candidate
69
- WHERE NOT EXISTS (SELECT 1 FROM update_candidate)
70
- )
71
- SELECT *
72
- FROM final_result
73
- WHERE final_result.id != bundle_id
74
-
75
- UNION ALL
76
-
77
- SELECT
78
- NIL_UUID AS id,
79
- TRUE AS should_force_update,
80
- NULL AS message,
81
- 'ROLLBACK' AS status,
82
- NULL AS storage_uri,
83
- NULL AS file_hash
84
- WHERE (SELECT COUNT(*) FROM final_result) = 0
85
- AND bundle_id != NIL_UUID
86
- AND bundle_id > min_bundle_id
87
- AND NOT EXISTS (
88
- SELECT 1
89
- FROM bundles b
90
- WHERE b.id = bundle_id
91
- AND b.enabled = TRUE
92
- AND b.platform = app_platform
93
- );
94
- END;
95
- $$;
96
-
97
-
98
- -- HotUpdater.get_update_info
99
- CREATE OR REPLACE FUNCTION get_update_info_by_app_version (
100
- app_platform platforms,
101
- app_version text,
102
- bundle_id uuid,
103
- min_bundle_id uuid,
104
- target_channel text,
105
- target_app_version_list text[]
106
- )
107
- RETURNS TABLE (
108
- id uuid,
109
- should_force_update boolean,
110
- message text,
111
- status text,
112
- storage_uri text,
113
- file_hash text
114
- )
115
- LANGUAGE plpgsql
116
- AS
117
- $$
118
- DECLARE
119
- NIL_UUID CONSTANT uuid := '00000000-0000-0000-0000-000000000000';
120
- BEGIN
121
- RETURN QUERY
122
- WITH update_candidate AS (
123
- SELECT
124
- b.id,
125
- b.should_force_update,
126
- b.message,
127
- 'UPDATE' AS status,
128
- b.storage_uri,
129
- b.file_hash
130
- FROM bundles b
131
- WHERE b.enabled = TRUE
132
- AND b.platform = app_platform
133
- AND b.id >= bundle_id
134
- AND b.id > min_bundle_id
135
- AND b.target_app_version IN (SELECT unnest(target_app_version_list))
136
- AND b.channel = target_channel
137
- ORDER BY b.id DESC
138
- LIMIT 1
139
- ),
140
- rollback_candidate AS (
141
- SELECT
142
- b.id,
143
- TRUE AS should_force_update,
144
- b.message,
145
- 'ROLLBACK' AS status,
146
- b.storage_uri,
147
- b.file_hash
148
- FROM bundles b
149
- WHERE b.enabled = TRUE
150
- AND b.platform = app_platform
151
- AND b.id < bundle_id
152
- AND b.id > min_bundle_id
153
- ORDER BY b.id DESC
154
- LIMIT 1
155
- ),
156
- final_result AS (
157
- SELECT * FROM update_candidate
158
- UNION ALL
159
- SELECT * FROM rollback_candidate
160
- WHERE NOT EXISTS (SELECT 1 FROM update_candidate)
161
- )
162
- SELECT *
163
- FROM final_result
164
- WHERE final_result.id != bundle_id
165
-
166
- UNION ALL
167
-
168
- SELECT
169
- NIL_UUID AS id,
170
- TRUE AS should_force_update,
171
- NULL AS message,
172
- 'ROLLBACK' AS status,
173
- NULL AS storage_uri,
174
- NULL AS file_hash
175
- WHERE (SELECT COUNT(*) FROM final_result) = 0
176
- AND bundle_id != NIL_UUID
177
- AND bundle_id > min_bundle_id
178
- AND NOT EXISTS (
179
- SELECT 1
180
- FROM bundles b
181
- WHERE b.id = bundle_id
182
- AND b.enabled = TRUE
183
- AND b.platform = app_platform
184
- );
185
- END;
186
- $$;
@@ -1,505 +0,0 @@
1
- -- HotUpdater.bundles
2
-
3
- ALTER TABLE bundles
4
- ADD COLUMN IF NOT EXISTS rollout_cohort_count INTEGER DEFAULT 1000
5
- CHECK (rollout_cohort_count >= 0 AND rollout_cohort_count <= 1000);
6
-
7
- CREATE INDEX IF NOT EXISTS bundles_rollout_idx ON bundles(rollout_cohort_count);
8
-
9
- ALTER TABLE bundles
10
- ADD COLUMN IF NOT EXISTS target_cohorts TEXT[];
11
-
12
- CREATE INDEX IF NOT EXISTS bundles_target_cohorts_idx ON bundles
13
- USING GIN (target_cohorts);
14
-
15
- -- HotUpdater.is_cohort_eligible
16
- -- Cohort eligibility helpers matching @hot-updater/core rollout.ts
17
-
18
- CREATE OR REPLACE FUNCTION positive_mod(
19
- value INTEGER,
20
- modulus INTEGER
21
- )
22
- RETURNS INTEGER
23
- LANGUAGE plpgsql
24
- IMMUTABLE
25
- AS $$
26
- BEGIN
27
- RETURN ((value % modulus) + modulus) % modulus;
28
- END;
29
- $$;
30
-
31
- CREATE OR REPLACE FUNCTION hash_rollout_value(input TEXT)
32
- RETURNS INTEGER
33
- LANGUAGE plpgsql
34
- IMMUTABLE
35
- AS $$
36
- DECLARE
37
- hash_value NUMERIC := 0;
38
- char_code INTEGER;
39
- i INTEGER;
40
- BEGIN
41
- FOR i IN 1..length(input) LOOP
42
- char_code := ascii(substring(input from i for 1));
43
- hash_value := mod((hash_value * 31) + char_code, 4294967296);
44
- END LOOP;
45
-
46
- IF hash_value >= 2147483648 THEN
47
- hash_value := hash_value - 4294967296;
48
- END IF;
49
-
50
- RETURN hash_value::INTEGER;
51
- END;
52
- $$;
53
-
54
- CREATE OR REPLACE FUNCTION normalize_cohort_value(cohort TEXT)
55
- RETURNS TEXT
56
- LANGUAGE plpgsql
57
- IMMUTABLE
58
- AS $$
59
- DECLARE
60
- normalized TEXT;
61
- cohort_value INTEGER;
62
- BEGIN
63
- IF cohort IS NULL THEN
64
- RETURN NULL;
65
- END IF;
66
-
67
- normalized := lower(btrim(cohort));
68
-
69
- IF normalized ~ '^[0-9]+$' THEN
70
- cohort_value := normalized::INTEGER;
71
- IF cohort_value BETWEEN 1 AND 1000 THEN
72
- RETURN cohort_value::TEXT;
73
- END IF;
74
- END IF;
75
-
76
- RETURN normalized;
77
- END;
78
- $$;
79
-
80
- CREATE OR REPLACE FUNCTION gcd_int(a INTEGER, b INTEGER)
81
- RETURNS INTEGER
82
- LANGUAGE plpgsql
83
- IMMUTABLE
84
- AS $$
85
- DECLARE
86
- x INTEGER := abs(a);
87
- y INTEGER := abs(b);
88
- next_value INTEGER;
89
- BEGIN
90
- WHILE y <> 0 LOOP
91
- next_value := x % y;
92
- x := y;
93
- y := next_value;
94
- END LOOP;
95
-
96
- RETURN x;
97
- END;
98
- $$;
99
-
100
- CREATE OR REPLACE FUNCTION get_rollout_multiplier(bundle_id UUID)
101
- RETURNS INTEGER
102
- LANGUAGE plpgsql
103
- IMMUTABLE
104
- AS $$
105
- DECLARE
106
- candidate INTEGER := positive_mod(
107
- hash_rollout_value(bundle_id::TEXT || ':multiplier'),
108
- 997
109
- );
110
- BEGIN
111
- IF candidate = 0 THEN
112
- candidate := 1;
113
- END IF;
114
-
115
- WHILE gcd_int(candidate, 1000) <> 1 LOOP
116
- candidate := positive_mod(candidate + 1, 1000);
117
- IF candidate = 0 THEN
118
- candidate := 1;
119
- END IF;
120
- END LOOP;
121
-
122
- RETURN candidate;
123
- END;
124
- $$;
125
-
126
- CREATE OR REPLACE FUNCTION get_rollout_offset(bundle_id UUID)
127
- RETURNS INTEGER
128
- LANGUAGE plpgsql
129
- IMMUTABLE
130
- AS $$
131
- BEGIN
132
- RETURN positive_mod(hash_rollout_value(bundle_id::TEXT || ':offset'), 1000);
133
- END;
134
- $$;
135
-
136
- CREATE OR REPLACE FUNCTION get_modular_inverse(value INTEGER, modulus INTEGER)
137
- RETURNS INTEGER
138
- LANGUAGE plpgsql
139
- IMMUTABLE
140
- AS $$
141
- DECLARE
142
- candidate INTEGER;
143
- BEGIN
144
- FOR candidate IN 1..(modulus - 1) LOOP
145
- IF positive_mod(value * candidate, modulus) = 1 THEN
146
- RETURN candidate;
147
- END IF;
148
- END LOOP;
149
-
150
- RAISE EXCEPTION 'No modular inverse for % mod %', value, modulus;
151
- END;
152
- $$;
153
-
154
- CREATE OR REPLACE FUNCTION is_numeric_cohort(cohort TEXT)
155
- RETURNS BOOLEAN
156
- LANGUAGE plpgsql
157
- IMMUTABLE
158
- AS $$
159
- DECLARE
160
- normalized_cohort TEXT := normalize_cohort_value(cohort);
161
- cohort_value INTEGER;
162
- BEGIN
163
- IF normalized_cohort IS NULL OR normalized_cohort !~ '^[0-9]+$' THEN
164
- RETURN FALSE;
165
- END IF;
166
-
167
- cohort_value := normalized_cohort::INTEGER;
168
- RETURN cohort_value BETWEEN 1 AND 1000;
169
- END;
170
- $$;
171
-
172
- CREATE OR REPLACE FUNCTION get_numeric_cohort_rollout_position(
173
- bundle_id UUID,
174
- cohort TEXT
175
- )
176
- RETURNS INTEGER
177
- LANGUAGE plpgsql
178
- IMMUTABLE
179
- AS $$
180
- DECLARE
181
- normalized_cohort TEXT := normalize_cohort_value(cohort);
182
- cohort_value INTEGER;
183
- multiplier INTEGER;
184
- offset_value INTEGER;
185
- inverse_multiplier INTEGER;
186
- BEGIN
187
- IF NOT is_numeric_cohort(normalized_cohort) THEN
188
- RAISE EXCEPTION 'Invalid numeric cohort: %', cohort;
189
- END IF;
190
-
191
- cohort_value := normalized_cohort::INTEGER - 1;
192
- multiplier := get_rollout_multiplier(bundle_id);
193
- offset_value := get_rollout_offset(bundle_id);
194
- inverse_multiplier := get_modular_inverse(multiplier, 1000);
195
-
196
- RETURN positive_mod(
197
- inverse_multiplier * (cohort_value - offset_value),
198
- 1000
199
- );
200
- END;
201
- $$;
202
-
203
- CREATE OR REPLACE FUNCTION is_cohort_eligible(
204
- bundle_id UUID,
205
- cohort TEXT,
206
- rollout_cohort_count INTEGER,
207
- target_cohorts TEXT[]
208
- )
209
- RETURNS BOOLEAN
210
- LANGUAGE plpgsql
211
- IMMUTABLE
212
- AS $$
213
- DECLARE
214
- normalized_cohort TEXT := normalize_cohort_value(cohort);
215
- normalized_rollout_count INTEGER := COALESCE(rollout_cohort_count, 1000);
216
- normalized_target_cohorts TEXT[];
217
- BEGIN
218
- IF target_cohorts IS NOT NULL THEN
219
- normalized_target_cohorts := ARRAY(
220
- SELECT normalize_cohort_value(value)
221
- FROM unnest(target_cohorts) AS value
222
- );
223
- END IF;
224
-
225
- IF normalized_target_cohorts IS NOT NULL
226
- AND array_length(normalized_target_cohorts, 1) > 0 THEN
227
- RETURN normalized_cohort IS NOT NULL
228
- AND normalized_cohort = ANY(normalized_target_cohorts);
229
- END IF;
230
-
231
- IF normalized_rollout_count <= 0 THEN
232
- RETURN FALSE;
233
- END IF;
234
-
235
- IF normalized_cohort IS NULL THEN
236
- RETURN normalized_rollout_count >= 1000;
237
- END IF;
238
-
239
- IF NOT is_numeric_cohort(normalized_cohort) THEN
240
- RETURN FALSE;
241
- END IF;
242
-
243
- IF normalized_rollout_count >= 1000 THEN
244
- RETURN TRUE;
245
- END IF;
246
-
247
- RETURN get_numeric_cohort_rollout_position(bundle_id, normalized_cohort)
248
- < normalized_rollout_count;
249
- END;
250
- $$;
251
-
252
- -- HotUpdater.get_update_info_by_fingerprint_hash
253
-
254
- DO $$ BEGIN DROP FUNCTION IF EXISTS get_update_info_by_fingerprint_hash(platforms, uuid, uuid, text, text); EXCEPTION WHEN undefined_function THEN NULL; END $$;
255
- DO $$ BEGIN DROP FUNCTION IF EXISTS get_update_info_by_fingerprint_hash(platforms, uuid, uuid, text, text, text); EXCEPTION WHEN undefined_function THEN NULL; END $$;
256
-
257
- CREATE OR REPLACE FUNCTION get_update_info_by_fingerprint_hash (
258
- app_platform platforms,
259
- bundle_id uuid,
260
- min_bundle_id uuid,
261
- target_channel text,
262
- target_fingerprint_hash text,
263
- cohort TEXT DEFAULT NULL
264
- )
265
- RETURNS TABLE (
266
- id uuid,
267
- should_force_update boolean,
268
- message text,
269
- status text,
270
- storage_uri text,
271
- file_hash text
272
- )
273
- LANGUAGE plpgsql
274
- AS
275
- $$
276
- DECLARE
277
- NIL_UUID CONSTANT uuid := '00000000-0000-0000-0000-000000000000';
278
- BEGIN
279
- RETURN QUERY
280
- WITH candidate_bundles AS (
281
- SELECT
282
- b.id,
283
- b.should_force_update,
284
- b.message,
285
- b.storage_uri,
286
- b.file_hash,
287
- b.rollout_cohort_count,
288
- b.target_cohorts
289
- FROM bundles b
290
- WHERE b.enabled = TRUE
291
- AND b.platform = app_platform
292
- AND b.id >= min_bundle_id
293
- AND b.channel = target_channel
294
- AND b.fingerprint_hash = target_fingerprint_hash
295
- ),
296
- current_candidate AS (
297
- SELECT
298
- cb.id,
299
- is_cohort_eligible(
300
- cb.id,
301
- cohort,
302
- cb.rollout_cohort_count,
303
- cb.target_cohorts
304
- ) AS is_eligible
305
- FROM candidate_bundles cb
306
- WHERE cb.id = bundle_id
307
- LIMIT 1
308
- ),
309
- eligible_update_candidate AS (
310
- SELECT
311
- cb.id,
312
- cb.should_force_update,
313
- cb.message,
314
- 'UPDATE' AS status,
315
- cb.storage_uri,
316
- cb.file_hash
317
- FROM candidate_bundles cb
318
- WHERE cb.id > bundle_id
319
- AND is_cohort_eligible(
320
- cb.id,
321
- cohort,
322
- cb.rollout_cohort_count,
323
- cb.target_cohorts
324
- )
325
- ORDER BY cb.id DESC
326
- LIMIT 1
327
- ),
328
- rollback_candidate AS (
329
- SELECT
330
- cb.id,
331
- TRUE AS should_force_update,
332
- cb.message,
333
- 'ROLLBACK' AS status,
334
- cb.storage_uri,
335
- cb.file_hash
336
- FROM candidate_bundles cb
337
- WHERE cb.id < bundle_id
338
- AND NOT EXISTS (
339
- SELECT 1
340
- FROM current_candidate
341
- WHERE current_candidate.is_eligible = TRUE
342
- )
343
- AND NOT EXISTS (SELECT 1 FROM eligible_update_candidate)
344
- ORDER BY cb.id DESC
345
- LIMIT 1
346
- ),
347
- final_result AS (
348
- SELECT * FROM eligible_update_candidate
349
- UNION ALL
350
- SELECT * FROM rollback_candidate
351
- WHERE NOT EXISTS (SELECT 1 FROM eligible_update_candidate)
352
- )
353
- SELECT *
354
- FROM final_result
355
- WHERE final_result.id != bundle_id
356
-
357
- UNION ALL
358
-
359
- SELECT
360
- NIL_UUID AS id,
361
- TRUE AS should_force_update,
362
- NULL AS message,
363
- 'ROLLBACK' AS status,
364
- NULL AS storage_uri,
365
- NULL AS file_hash
366
- WHERE (SELECT COUNT(*) FROM final_result) = 0
367
- AND bundle_id != NIL_UUID
368
- AND bundle_id > min_bundle_id
369
- AND NOT EXISTS (
370
- SELECT 1
371
- FROM current_candidate
372
- WHERE current_candidate.is_eligible = TRUE
373
- )
374
- AND NOT EXISTS (SELECT 1 FROM eligible_update_candidate)
375
- AND NOT EXISTS (SELECT 1 FROM rollback_candidate);
376
- END;
377
- $$;
378
-
379
- -- HotUpdater.get_update_info_by_app_version
380
-
381
- DO $$ BEGIN DROP FUNCTION IF EXISTS get_update_info_by_app_version(platforms, text, uuid, uuid, text, text[]); EXCEPTION WHEN undefined_function THEN NULL; END $$;
382
- DO $$ BEGIN DROP FUNCTION IF EXISTS get_update_info_by_app_version(platforms, text, uuid, uuid, text, text[], text); EXCEPTION WHEN undefined_function THEN NULL; END $$;
383
-
384
- CREATE OR REPLACE FUNCTION get_update_info_by_app_version (
385
- app_platform platforms,
386
- app_version text,
387
- bundle_id uuid,
388
- min_bundle_id uuid,
389
- target_channel text,
390
- target_app_version_list text[],
391
- cohort TEXT DEFAULT NULL
392
- )
393
- RETURNS TABLE (
394
- id uuid,
395
- should_force_update boolean,
396
- message text,
397
- status text,
398
- storage_uri text,
399
- file_hash text
400
- )
401
- LANGUAGE plpgsql
402
- AS
403
- $$
404
- DECLARE
405
- NIL_UUID CONSTANT uuid := '00000000-0000-0000-0000-000000000000';
406
- BEGIN
407
- RETURN QUERY
408
- WITH candidate_bundles AS (
409
- SELECT
410
- b.id,
411
- b.should_force_update,
412
- b.message,
413
- b.storage_uri,
414
- b.file_hash,
415
- b.rollout_cohort_count,
416
- b.target_cohorts
417
- FROM bundles b
418
- WHERE b.enabled = TRUE
419
- AND b.platform = app_platform
420
- AND b.id >= min_bundle_id
421
- AND b.target_app_version IN (SELECT unnest(target_app_version_list))
422
- AND b.channel = target_channel
423
- ),
424
- current_candidate AS (
425
- SELECT
426
- cb.id,
427
- is_cohort_eligible(
428
- cb.id,
429
- cohort,
430
- cb.rollout_cohort_count,
431
- cb.target_cohorts
432
- ) AS is_eligible
433
- FROM candidate_bundles cb
434
- WHERE cb.id = bundle_id
435
- LIMIT 1
436
- ),
437
- eligible_update_candidate AS (
438
- SELECT
439
- cb.id,
440
- cb.should_force_update,
441
- cb.message,
442
- 'UPDATE' AS status,
443
- cb.storage_uri,
444
- cb.file_hash
445
- FROM candidate_bundles cb
446
- WHERE cb.id > bundle_id
447
- AND is_cohort_eligible(
448
- cb.id,
449
- cohort,
450
- cb.rollout_cohort_count,
451
- cb.target_cohorts
452
- )
453
- ORDER BY cb.id DESC
454
- LIMIT 1
455
- ),
456
- rollback_candidate AS (
457
- SELECT
458
- cb.id,
459
- TRUE AS should_force_update,
460
- cb.message,
461
- 'ROLLBACK' AS status,
462
- cb.storage_uri,
463
- cb.file_hash
464
- FROM candidate_bundles cb
465
- WHERE cb.id < bundle_id
466
- AND NOT EXISTS (
467
- SELECT 1
468
- FROM current_candidate
469
- WHERE current_candidate.is_eligible = TRUE
470
- )
471
- AND NOT EXISTS (SELECT 1 FROM eligible_update_candidate)
472
- ORDER BY cb.id DESC
473
- LIMIT 1
474
- ),
475
- final_result AS (
476
- SELECT * FROM eligible_update_candidate
477
- UNION ALL
478
- SELECT * FROM rollback_candidate
479
- WHERE NOT EXISTS (SELECT 1 FROM eligible_update_candidate)
480
- )
481
- SELECT *
482
- FROM final_result
483
- WHERE final_result.id != bundle_id
484
-
485
- UNION ALL
486
-
487
- SELECT
488
- NIL_UUID AS id,
489
- TRUE AS should_force_update,
490
- NULL AS message,
491
- 'ROLLBACK' AS status,
492
- NULL AS storage_uri,
493
- NULL AS file_hash
494
- WHERE (SELECT COUNT(*) FROM final_result) = 0
495
- AND bundle_id != NIL_UUID
496
- AND bundle_id > min_bundle_id
497
- AND NOT EXISTS (
498
- SELECT 1
499
- FROM current_candidate
500
- WHERE current_candidate.is_eligible = TRUE
501
- )
502
- AND NOT EXISTS (SELECT 1 FROM eligible_update_candidate)
503
- AND NOT EXISTS (SELECT 1 FROM rollback_candidate);
504
- END;
505
- $$;