@_nazmiforreal/flutter-ota 0.1.6 → 0.1.8
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/README.md +13 -13
- package/bin/{flutter-patcher-linux-x64 → flutter-ota-linux-x64} +0 -0
- package/bin/{flutter-patcher.js → flutter-ota.js} +4 -4
- package/dart-src/packages/cli-tools/bin/{flutter_patcher.dart → flutter_ota_kit.dart} +2 -2
- package/dart-src/packages/cli-tools/lib/{flutter_patcher_cli.dart → flutter_ota_kit_cli.dart} +5 -3
- package/dart-src/packages/cli-tools/lib/src/backend.dart +6 -25
- package/dart-src/packages/cli-tools/lib/src/cli_base.dart +10 -4
- package/dart-src/packages/cli-tools/lib/src/commands/build.dart +5 -3
- package/dart-src/packages/cli-tools/lib/src/commands/bundle.dart +279 -10
- package/dart-src/packages/cli-tools/lib/src/commands/channel.dart +7 -7
- package/dart-src/packages/cli-tools/lib/src/commands/config_command.dart +5 -5
- package/dart-src/packages/cli-tools/lib/src/commands/console.dart +4 -4
- package/dart-src/packages/cli-tools/lib/src/commands/deploy.dart +4 -4
- package/dart-src/packages/cli-tools/lib/src/commands/doctor.dart +3 -3
- package/dart-src/packages/cli-tools/lib/src/commands/fingerprint.dart +1 -1
- package/dart-src/packages/cli-tools/lib/src/commands/init.dart +294 -45
- package/dart-src/packages/cli-tools/lib/src/commands/keys.dart +1 -1
- package/dart-src/packages/cli-tools/lib/src/commands/migrate.dart +59 -24
- package/dart-src/packages/cli-tools/lib/src/commands/rollback.dart +5 -5
- package/dart-src/packages/cli-tools/lib/src/commands/storage.dart +117 -0
- package/dart-src/packages/cli-tools/lib/src/config.dart +29 -78
- package/dart-src/packages/cli-tools/lib/src/operations.dart +4 -4
- package/dart-src/packages/cli-tools/lib/src/pack.dart +12 -6
- package/dart-src/packages/cli-tools/lib/src/runner.dart +21 -3
- package/dart-src/packages/cli-tools/lib/src/ui/ui.dart +2 -2
- package/dart-src/packages/cli-tools/lib/src/verbose.dart +3 -0
- package/dart-src/packages/cli-tools/migrations/aws/README.md +7 -0
- package/dart-src/packages/cli-tools/migrations/postgres/bundles.sql +45 -0
- package/dart-src/packages/cli-tools/migrations/postgres/get_target_app_version_list.sql +21 -0
- package/dart-src/packages/cli-tools/migrations/postgres/get_update_info_by_app_version.sql +126 -0
- package/dart-src/packages/cli-tools/migrations/postgres/get_update_info_by_fingerprint_hash.sql +125 -0
- package/dart-src/packages/cli-tools/migrations/postgres/hash_user_id.sql +30 -0
- package/dart-src/packages/cli-tools/migrations/postgres/is_device_eligible.sql +237 -0
- package/dart-src/packages/cli-tools/migrations/supabase/20260520014100_hot-updater_rls.sql +11 -0
- package/dart-src/packages/cli-tools/pubspec.yaml +8 -10
- package/dart-src/packages/cli-tools/test/backends_test.dart +4 -4
- package/dart-src/packages/cli-tools/test/build_pack_test.dart +1 -1
- package/dart-src/packages/cli-tools/test/cli_test.dart +3 -3
- package/dart-src/packages/cli-tools/test/mocks/mock_aws_s3_client.dart +2 -2
- package/dart-src/packages/cli-tools/test/mocks/mock_d1_client.dart +2 -2
- package/dart-src/packages/cli-tools/test/mocks/mock_postgres_client.dart +7 -7
- package/dart-src/packages/core/lib/{flutter_patcher_core.dart → flutter_ota_kit_core.dart} +1 -1
- package/dart-src/packages/core/pubspec.yaml +2 -2
- package/dart-src/packages/core/test/rollout_test.dart +1 -1
- package/dart-src/packages/core/test/semver_test.dart +1 -1
- package/dart-src/packages/core/test/types_test.dart +2 -2
- package/dart-src/packages/core/test/uuid_test.dart +1 -1
- package/dart-src/packages/core/tool/dbg.dart +1 -1
- package/dart-src/plugins/aws/lib/{flutter_patcher_aws.dart → flutter_ota_kit_aws.dart} +0 -2
- package/dart-src/plugins/aws/lib/src/aws_cloudfront_client.dart +1 -1
- package/dart-src/plugins/aws/lib/src/aws_database.dart +1 -1
- package/dart-src/plugins/aws/lib/src/aws_s3_client.dart +1 -1
- package/dart-src/plugins/aws/lib/src/aws_storage.dart +1 -1
- package/dart-src/plugins/aws/lib/src/aws_storage_profile.dart +25 -3
- package/dart-src/plugins/aws/lib/src/with_cloudfront_signed_url.dart +1 -1
- package/dart-src/plugins/aws/pubspec.yaml +4 -4
- package/dart-src/plugins/aws/test/aws_database_test.dart +3 -3
- package/dart-src/plugins/aws/test/aws_storage_test.dart +2 -2
- package/dart-src/plugins/aws/test/mock_aws_s3_client.dart +2 -2
- package/dart-src/plugins/cloudflare/lib/src/cloudflare_worker_database.dart +1 -1
- package/dart-src/plugins/cloudflare/lib/src/d1_build_where.dart +1 -1
- package/dart-src/plugins/cloudflare/lib/src/d1_bundle_mapper.dart +1 -1
- package/dart-src/plugins/cloudflare/lib/src/d1_database.dart +1 -1
- package/dart-src/plugins/cloudflare/lib/src/d1_database_plugin.dart +2 -2
- package/dart-src/plugins/cloudflare/lib/src/r2_s3_client.dart +1 -1
- package/dart-src/plugins/cloudflare/lib/src/r2_storage.dart +1 -1
- package/dart-src/plugins/cloudflare/lib/src/r2_storage_profile.dart +1 -1
- package/dart-src/plugins/cloudflare/pubspec.yaml +4 -4
- package/dart-src/plugins/cloudflare/test/cloudflare_worker_database_test.dart +2 -2
- package/dart-src/plugins/cloudflare/test/d1_bundle_mapper_test.dart +2 -2
- package/dart-src/plugins/cloudflare/test/d1_database_test.dart +2 -2
- package/dart-src/plugins/cloudflare/test/mock_d1_client.dart +2 -2
- package/dart-src/plugins/cloudflare/test/mock_r2_client.dart +2 -2
- package/dart-src/plugins/cloudflare/test/r2_storage_test.dart +2 -2
- package/dart-src/plugins/plugin-core/lib/{flutter_patcher_plugin_core.dart → flutter_ota_kit_plugin_core.dart} +1 -1
- package/dart-src/plugins/plugin-core/lib/src/create_blob_database_plugin.dart +1 -1
- package/dart-src/plugins/plugin-core/lib/src/filter_compatible_app_versions.dart +1 -1
- package/dart-src/plugins/plugin-core/lib/src/get_update_info.dart +1 -1
- package/dart-src/plugins/plugin-core/lib/src/request_update_bundle_state.dart +1 -1
- package/dart-src/plugins/plugin-core/lib/src/resolve_update_info_from_bundles.dart +1 -1
- package/dart-src/plugins/plugin-core/lib/src/types.dart +2 -2
- package/dart-src/plugins/plugin-core/pubspec.yaml +3 -3
- package/dart-src/plugins/plugin-core/test/asset_storage_layout_test.dart +3 -3
- package/dart-src/plugins/plugin-core/test/bundle_unit_of_work_store_test.dart +2 -2
- package/dart-src/plugins/plugin-core/test/bundle_unit_of_work_test.dart +2 -2
- package/dart-src/plugins/plugin-core/test/create_blob_database_plugin_test.dart +2 -2
- package/dart-src/plugins/plugin-core/test/create_database_plugin_test.dart +5 -5
- package/dart-src/plugins/plugin-core/test/create_storage_plugin_test.dart +2 -2
- package/dart-src/plugins/plugin-core/test/generate_min_bundle_id_test.dart +2 -2
- package/dart-src/plugins/plugin-core/test/get_update_info_test.dart +2 -2
- package/dart-src/plugins/plugin-core/test/helpers_test.dart +2 -2
- package/dart-src/plugins/plugin-core/test/query_bundles_test.dart +2 -2
- package/dart-src/plugins/plugin-core/test/request_update_bundle_state_test.dart +3 -3
- package/dart-src/plugins/plugin-core/test/uuidv7_test.dart +1 -1
- package/dart-src/plugins/postgres/lib/{flutter_patcher_postgres.dart → flutter_ota_kit_postgres.dart} +1 -1
- package/dart-src/plugins/postgres/lib/src/postgres_bundle_mapper.dart +1 -1
- package/dart-src/plugins/postgres/lib/src/postgres_database.dart +2 -2
- package/dart-src/plugins/postgres/lib/src/postgres_get_update_info.dart +2 -2
- package/dart-src/plugins/postgres/lib/src/postgres_storage.dart +9 -9
- package/dart-src/plugins/postgres/lib/src/postgres_types.dart +1 -1
- package/dart-src/plugins/postgres/pubspec.yaml +4 -4
- package/dart-src/plugins/postgres/test/mock_postgres_client.dart +2 -2
- package/dart-src/plugins/postgres/test/postgres_bundle_mapper_test.dart +2 -2
- package/dart-src/plugins/postgres/test/postgres_database_test.dart +2 -2
- package/dart-src/plugins/supabase/lib/edge.dart +1 -1
- package/dart-src/plugins/supabase/lib/{flutter_patcher_supabase.dart → flutter_ota_kit_supabase.dart} +1 -1
- package/dart-src/plugins/supabase/lib/src/supabase_bundle_mapper.dart +1 -1
- package/dart-src/plugins/supabase/lib/src/supabase_client_http.dart +5 -1
- package/dart-src/plugins/supabase/lib/src/supabase_database.dart +2 -2
- package/dart-src/plugins/supabase/lib/src/supabase_edge_function_database.dart +1 -1
- package/dart-src/plugins/supabase/lib/src/supabase_edge_function_storage.dart +1 -1
- package/dart-src/plugins/supabase/lib/src/supabase_storage.dart +2 -5
- package/dart-src/plugins/supabase/pubspec.yaml +4 -4
- package/dart-src/plugins/supabase/test/mock_supabase_client.dart +5 -5
- package/dart-src/plugins/supabase/test/supabase_bundle_mapper_test.dart +3 -3
- package/dart-src/plugins/supabase/test/supabase_database_test.dart +3 -3
- package/dart-src/plugins/supabase/test/supabase_storage_test.dart +2 -2
- package/migrations/aws/README.md +7 -0
- package/migrations/cloudflare/0001_hot-updater_init.sql +16 -0
- package/migrations/cloudflare/0002_hot-updater_0.13.0.sql +8 -0
- package/migrations/cloudflare/0003_hot-updater_0.18.0.sql +38 -0
- package/migrations/cloudflare/0004_hot-updater_0.29.0.sql +11 -0
- package/migrations/cloudflare/0005_hot-updater_0.31.0.sql +24 -0
- package/migrations/cloudflare/bundles.sql +42 -0
- package/migrations/postgres/bundles.sql +45 -0
- package/migrations/postgres/get_target_app_version_list.sql +21 -0
- package/migrations/postgres/get_update_info_by_app_version.sql +126 -0
- package/migrations/postgres/get_update_info_by_fingerprint_hash.sql +125 -0
- package/migrations/postgres/hash_user_id.sql +30 -0
- package/migrations/postgres/is_device_eligible.sql +237 -0
- package/package.json +4 -4
- package/scripts/postinstall.js +15 -15
- package/scripts/vendor.sh +1 -1
- package/dart-src/packages/cli-tools/.dart_tool/package_config.json +0 -496
- package/dart-src/packages/cli-tools/.dart_tool/package_graph.json +0 -743
- package/dart-src/packages/cli-tools/pubspec.lock +0 -638
- package/dart-src/packages/cli-tools/test/standalone_backend_test.dart +0 -315
- package/dart-src/plugins/aws/lib/src/aws_lambda_edge_storage.dart +0 -72
- package/dart-src/plugins/aws/test/aws_lambda_edge_storage_test.dart +0 -190
- package/dart-src/plugins/standalone/.gitkeep +0 -0
- package/dart-src/plugins/standalone/lib/flutter_patcher_standalone.dart +0 -12
- package/dart-src/plugins/standalone/lib/src/standalone_config.dart +0 -107
- package/dart-src/plugins/standalone/lib/src/standalone_database.dart +0 -233
- package/dart-src/plugins/standalone/lib/src/standalone_storage.dart +0 -175
- package/dart-src/plugins/standalone/pubspec.yaml +0 -18
- package/dart-src/plugins/standalone/test/standalone_test.dart +0 -264
- /package/dart-src/plugins/cloudflare/lib/{flutter_patcher_cloudflare.dart → flutter_ota_kit_cloudflare.dart} +0 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
name:
|
|
2
|
-
description: Plugin core abstractions for
|
|
1
|
+
name: flutter_ota_kit_plugin_core
|
|
2
|
+
description: Plugin core abstractions for flutter_ota_kit — database, storage, and build interfaces.
|
|
3
3
|
version: 0.0.1
|
|
4
4
|
|
|
5
5
|
environment:
|
|
6
6
|
sdk: ">=3.3.0 <4.0.0"
|
|
7
7
|
|
|
8
8
|
dependencies:
|
|
9
|
-
|
|
9
|
+
flutter_ota_kit_core:
|
|
10
10
|
path: ../../packages/core
|
|
11
11
|
mime: ^1.0.0
|
|
12
12
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import 'package:
|
|
2
|
-
import 'package:
|
|
3
|
-
import 'package:
|
|
1
|
+
import 'package:flutter_ota_kit_plugin_core/src/asset_storage_layout.dart';
|
|
2
|
+
import 'package:flutter_ota_kit_plugin_core/src/bundle_storage_layout.dart';
|
|
3
|
+
import 'package:flutter_ota_kit_plugin_core/src/legacy_asset_storage_layout.dart';
|
|
4
4
|
import 'package:test/test.dart';
|
|
5
5
|
|
|
6
6
|
void main() {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import 'package:
|
|
2
|
-
import 'package:
|
|
1
|
+
import 'package:flutter_ota_kit_plugin_core/src/bundle_unit_of_work.dart';
|
|
2
|
+
import 'package:flutter_ota_kit_plugin_core/src/bundle_unit_of_work_store.dart';
|
|
3
3
|
import 'package:test/test.dart';
|
|
4
4
|
|
|
5
5
|
void main() {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import 'package:
|
|
2
|
-
import 'package:
|
|
1
|
+
import 'package:flutter_ota_kit_plugin_core/src/bundle_unit_of_work.dart';
|
|
2
|
+
import 'package:flutter_ota_kit_plugin_core/src/types.dart';
|
|
3
3
|
import 'package:test/test.dart';
|
|
4
4
|
|
|
5
5
|
Bundle _bundle(String id, {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import 'dart:convert';
|
|
2
2
|
|
|
3
|
-
import 'package:
|
|
4
|
-
import 'package:
|
|
3
|
+
import 'package:flutter_ota_kit_core/flutter_ota_kit_core.dart';
|
|
4
|
+
import 'package:flutter_ota_kit_plugin_core/flutter_ota_kit_plugin_core.dart';
|
|
5
5
|
import 'package:test/test.dart';
|
|
6
6
|
|
|
7
7
|
// ---------------------------------------------------------------------------
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import 'package:
|
|
2
|
-
import 'package:
|
|
3
|
-
import 'package:
|
|
4
|
-
import 'package:
|
|
5
|
-
import 'package:
|
|
1
|
+
import 'package:flutter_ota_kit_core/flutter_ota_kit_core.dart';
|
|
2
|
+
import 'package:flutter_ota_kit_plugin_core/src/bundle_unit_of_work.dart';
|
|
3
|
+
import 'package:flutter_ota_kit_plugin_core/src/bundle_unit_of_work_store.dart';
|
|
4
|
+
import 'package:flutter_ota_kit_plugin_core/src/create_database_plugin.dart';
|
|
5
|
+
import 'package:flutter_ota_kit_plugin_core/src/types.dart';
|
|
6
6
|
import 'package:test/test.dart';
|
|
7
7
|
|
|
8
8
|
class _MockDatabasePlugin extends AbstractDatabasePlugin {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import 'package:
|
|
2
|
-
import 'package:
|
|
1
|
+
import 'package:flutter_ota_kit_plugin_core/src/create_storage_plugin.dart';
|
|
2
|
+
import 'package:flutter_ota_kit_plugin_core/src/types.dart';
|
|
3
3
|
import 'package:test/test.dart';
|
|
4
4
|
|
|
5
5
|
class _MockNodeProfile implements NodeStorageProfile {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import 'package:
|
|
2
|
-
import 'package:
|
|
1
|
+
import 'package:flutter_ota_kit_plugin_core/src/generate_min_bundle_id.dart';
|
|
2
|
+
import 'package:flutter_ota_kit_plugin_core/src/uuidv7.dart';
|
|
3
3
|
import 'package:test/test.dart';
|
|
4
4
|
|
|
5
5
|
void main() {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import 'package:
|
|
2
|
-
import 'package:
|
|
1
|
+
import 'package:flutter_ota_kit_core/flutter_ota_kit_core.dart';
|
|
2
|
+
import 'package:flutter_ota_kit_plugin_core/src/get_update_info.dart';
|
|
3
3
|
import 'package:test/test.dart';
|
|
4
4
|
|
|
5
5
|
const _defaultBundleMessage = 'hello';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import 'package:
|
|
1
|
+
import 'package:flutter_ota_kit_core/flutter_ota_kit_core.dart'
|
|
2
2
|
show Bundle, BundleMetadata, Platform;
|
|
3
|
-
import 'package:
|
|
3
|
+
import 'package:flutter_ota_kit_plugin_core/flutter_ota_kit_plugin_core.dart';
|
|
4
4
|
import 'package:test/test.dart';
|
|
5
5
|
|
|
6
6
|
void main() {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import 'package:
|
|
1
|
+
import 'package:flutter_ota_kit_core/flutter_ota_kit_core.dart'
|
|
2
2
|
show Bundle, BundleMetadata, Platform;
|
|
3
|
-
import 'package:
|
|
3
|
+
import 'package:flutter_ota_kit_plugin_core/flutter_ota_kit_plugin_core.dart';
|
|
4
4
|
import 'package:test/test.dart';
|
|
5
5
|
|
|
6
6
|
void main() {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import 'package:
|
|
2
|
-
import 'package:
|
|
3
|
-
import 'package:
|
|
1
|
+
import 'package:flutter_ota_kit_core/flutter_ota_kit_core.dart';
|
|
2
|
+
import 'package:flutter_ota_kit_plugin_core/src/bundle_unit_of_work_store.dart';
|
|
3
|
+
import 'package:flutter_ota_kit_plugin_core/src/request_update_bundle_state.dart';
|
|
4
4
|
import 'package:test/test.dart';
|
|
5
5
|
|
|
6
6
|
Bundle _bundle(String id) => Bundle(
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/// Faithful port of hot-updater `plugins/postgres/src/postgres.ts`.
|
|
2
2
|
library;
|
|
3
3
|
|
|
4
|
-
import 'package:
|
|
4
|
+
import 'package:flutter_ota_kit_core/flutter_ota_kit_core.dart'
|
|
5
5
|
show Bundle, UpdateInfo;
|
|
6
|
-
import 'package:
|
|
6
|
+
import 'package:flutter_ota_kit_plugin_core/flutter_ota_kit_plugin_core.dart'
|
|
7
7
|
show
|
|
8
8
|
AbstractDatabasePlugin,
|
|
9
9
|
BundleChange,
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
/// installed (see `supabase/migrations` parity work / Phase 5).
|
|
7
7
|
library;
|
|
8
8
|
|
|
9
|
-
import 'package:
|
|
9
|
+
import 'package:flutter_ota_kit_core/flutter_ota_kit_core.dart'
|
|
10
10
|
show
|
|
11
11
|
FingerprintGetBundlesArgs,
|
|
12
12
|
GetBundlesArgs,
|
|
@@ -14,7 +14,7 @@ import 'package:flutter_patcher_core/flutter_patcher_core.dart'
|
|
|
14
14
|
UpdateInfo,
|
|
15
15
|
UpdateStatus,
|
|
16
16
|
UpdateStrategy;
|
|
17
|
-
import 'package:
|
|
17
|
+
import 'package:flutter_ota_kit_plugin_core/flutter_ota_kit_plugin_core.dart'
|
|
18
18
|
show filterCompatibleAppVersions;
|
|
19
19
|
|
|
20
20
|
import 'postgres_client.dart';
|
|
@@ -2,7 +2,7 @@ import 'dart:convert';
|
|
|
2
2
|
import 'dart:io';
|
|
3
3
|
import 'dart:typed_data';
|
|
4
4
|
|
|
5
|
-
import 'package:
|
|
5
|
+
import 'package:flutter_ota_kit_plugin_core/flutter_ota_kit_plugin_core.dart';
|
|
6
6
|
|
|
7
7
|
import 'postgres_client.dart';
|
|
8
8
|
import 'postgres_config.dart';
|
|
@@ -10,7 +10,7 @@ import 'postgres_config.dart';
|
|
|
10
10
|
/// Configuration for the Postgres bytea storage plugin.
|
|
11
11
|
///
|
|
12
12
|
/// Reuses the same [PostgresConfig] connection as the database plugin. Blob
|
|
13
|
-
/// bytes are stored in a `
|
|
13
|
+
/// bytes are stored in a `flutter_ota_kit_storage(key text primary key, data
|
|
14
14
|
/// bytea, content_type text)` table. Because Postgres cannot serve bytes over
|
|
15
15
|
/// HTTP itself, [servingBaseUrl] may point at a thin proxy that reads from this
|
|
16
16
|
/// table so device update-checks can download over HTTP (the CLI/console supply
|
|
@@ -89,7 +89,7 @@ class _PostgresNodeProfile implements NodeStorageProfile {
|
|
|
89
89
|
final fullKey = _withBase(key);
|
|
90
90
|
final bytes = await File(filePath).readAsBytes();
|
|
91
91
|
await _client.execute(
|
|
92
|
-
'INSERT INTO
|
|
92
|
+
'INSERT INTO flutter_ota_kit_storage (key, data, content_type) '
|
|
93
93
|
'VALUES (@key, @data, @ct) '
|
|
94
94
|
'ON CONFLICT (key) DO UPDATE SET data = EXCLUDED.data, content_type = EXCLUDED.content_type',
|
|
95
95
|
{
|
|
@@ -105,7 +105,7 @@ class _PostgresNodeProfile implements NodeStorageProfile {
|
|
|
105
105
|
Future<bool> exists(String storageUri) async {
|
|
106
106
|
final key = _strip(storageUri, _servingBaseUrl);
|
|
107
107
|
final rows = await _client.execute(
|
|
108
|
-
'SELECT 1 FROM
|
|
108
|
+
'SELECT 1 FROM flutter_ota_kit_storage WHERE key = @key',
|
|
109
109
|
{'@key': key},
|
|
110
110
|
);
|
|
111
111
|
return rows.isNotEmpty;
|
|
@@ -114,7 +114,7 @@ class _PostgresNodeProfile implements NodeStorageProfile {
|
|
|
114
114
|
@override
|
|
115
115
|
Future<void> delete(String storageUri) async {
|
|
116
116
|
await _client.execute(
|
|
117
|
-
'DELETE FROM
|
|
117
|
+
'DELETE FROM flutter_ota_kit_storage WHERE key = @key',
|
|
118
118
|
{'@key': _strip(storageUri, _servingBaseUrl)},
|
|
119
119
|
);
|
|
120
120
|
}
|
|
@@ -123,7 +123,7 @@ class _PostgresNodeProfile implements NodeStorageProfile {
|
|
|
123
123
|
Future<void> downloadFile(String storageUri, String filePath) async {
|
|
124
124
|
final key = _strip(storageUri, _servingBaseUrl);
|
|
125
125
|
final rows = await _client.execute(
|
|
126
|
-
'SELECT data FROM
|
|
126
|
+
'SELECT data FROM flutter_ota_kit_storage WHERE key = @key',
|
|
127
127
|
{'@key': key},
|
|
128
128
|
);
|
|
129
129
|
if (rows.isEmpty) {
|
|
@@ -136,7 +136,7 @@ class _PostgresNodeProfile implements NodeStorageProfile {
|
|
|
136
136
|
Future<List<StorageObject>> listObjects([String? prefix]) async {
|
|
137
137
|
final fullPrefix = prefix == null ? null : _withBase(prefix);
|
|
138
138
|
final rows = await _client.execute(
|
|
139
|
-
'SELECT key, octet_length(data) AS size FROM
|
|
139
|
+
'SELECT key, octet_length(data) AS size FROM flutter_ota_kit_storage '
|
|
140
140
|
'WHERE key LIKE @prefix',
|
|
141
141
|
{'@prefix': '${fullPrefix ?? ''}%'},
|
|
142
142
|
);
|
|
@@ -154,7 +154,7 @@ class _PostgresNodeProfile implements NodeStorageProfile {
|
|
|
154
154
|
Future<void> deleteObjects(List<String> keys) async {
|
|
155
155
|
for (final k in keys) {
|
|
156
156
|
await _client.execute(
|
|
157
|
-
'DELETE FROM
|
|
157
|
+
'DELETE FROM flutter_ota_kit_storage WHERE key = @key',
|
|
158
158
|
{'@key': _strip(k, _servingBaseUrl)},
|
|
159
159
|
);
|
|
160
160
|
}
|
|
@@ -182,7 +182,7 @@ class _PostgresRuntimeProfile implements RuntimeStorageProfile {
|
|
|
182
182
|
Future<String?> readText(String storageUri) async {
|
|
183
183
|
final key = _strip(storageUri, _servingBaseUrl);
|
|
184
184
|
final rows = await _client.execute(
|
|
185
|
-
'SELECT data FROM
|
|
185
|
+
'SELECT data FROM flutter_ota_kit_storage WHERE key = @key',
|
|
186
186
|
{'@key': key},
|
|
187
187
|
);
|
|
188
188
|
if (rows.isEmpty) return null;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
name:
|
|
2
|
-
description: Postgres plugin for
|
|
1
|
+
name: flutter_ota_kit_postgres
|
|
2
|
+
description: Postgres plugin for flutter_ota_kit — database backend.
|
|
3
3
|
version: 0.1.0
|
|
4
4
|
publish_to: none
|
|
5
5
|
|
|
@@ -7,9 +7,9 @@ environment:
|
|
|
7
7
|
sdk: ">=3.3.0 <4.0.0"
|
|
8
8
|
|
|
9
9
|
dependencies:
|
|
10
|
-
|
|
10
|
+
flutter_ota_kit_core:
|
|
11
11
|
path: ../../packages/core
|
|
12
|
-
|
|
12
|
+
flutter_ota_kit_plugin_core:
|
|
13
13
|
path: ../../plugins/plugin-core
|
|
14
14
|
postgres: ^3.4.0
|
|
15
15
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import 'package:
|
|
1
|
+
import 'package:flutter_ota_kit_plugin_core/flutter_ota_kit_plugin_core.dart';
|
|
2
2
|
|
|
3
|
-
import 'package:
|
|
3
|
+
import 'package:flutter_ota_kit_postgres/flutter_ota_kit_postgres.dart';
|
|
4
4
|
|
|
5
5
|
/// In-memory store backing [MockPostgresClient]. Mirrors the `bundles` and
|
|
6
6
|
/// `bundle_patches` tables (snake_case row maps).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import 'package:
|
|
1
|
+
import 'package:flutter_ota_kit_core/flutter_ota_kit_core.dart'
|
|
2
2
|
show Bundle, BundleMetadata, BundlePatchArtifact, Platform;
|
|
3
|
-
import 'package:
|
|
3
|
+
import 'package:flutter_ota_kit_postgres/flutter_ota_kit_postgres.dart';
|
|
4
4
|
import 'package:test/test.dart';
|
|
5
5
|
|
|
6
6
|
void main() {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import 'package:
|
|
1
|
+
import 'package:flutter_ota_kit_core/flutter_ota_kit_core.dart'
|
|
2
2
|
show
|
|
3
3
|
AppVersionGetBundlesArgs,
|
|
4
4
|
Bundle,
|
|
@@ -7,7 +7,7 @@ import 'package:flutter_patcher_core/flutter_patcher_core.dart'
|
|
|
7
7
|
UpdateInfo,
|
|
8
8
|
UpdateStatus,
|
|
9
9
|
nilUuid;
|
|
10
|
-
import 'package:
|
|
10
|
+
import 'package:flutter_ota_kit_plugin_core/flutter_ota_kit_plugin_core.dart'
|
|
11
11
|
show
|
|
12
12
|
DatabaseBundleQueryOptions,
|
|
13
13
|
DatabaseBundleQueryWhere,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/// Edge-function entrypoint for
|
|
1
|
+
/// Edge-function entrypoint for flutter_ota_kit_supabase.
|
|
2
2
|
///
|
|
3
3
|
/// Mirrors hot-updater's `plugins/supabase/src/edge.ts`: exposes only the
|
|
4
4
|
/// edge-runnable variants (runtime-only database + storage plugins).
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
///
|
|
1
|
+
/// flutter_ota_kit_supabase — Supabase backend for flutter_ota_kit.
|
|
2
2
|
///
|
|
3
3
|
/// Faithful Dart translation of hot-updater's `plugins/supabase`:
|
|
4
4
|
/// database + storage plugins (direct + edge-function variants) over the
|
|
@@ -285,7 +285,11 @@ class _StorageBucket implements SupabaseStorageBucketLike {
|
|
|
285
285
|
return _MockSignedUrlListResult(
|
|
286
286
|
body
|
|
287
287
|
.map((e) => _MockSignedUrlResult(
|
|
288
|
-
|
|
288
|
+
// Supabase returns a relative path; make it absolute against
|
|
289
|
+
// the project base URL, matching [createSignedUrl].
|
|
290
|
+
e['signedURL'] == null
|
|
291
|
+
? null
|
|
292
|
+
: '$_baseUrl/storage/v1${e['signedURL'] as String}',
|
|
289
293
|
e['error'] as String?,
|
|
290
294
|
))
|
|
291
295
|
.toList(),
|
|
@@ -3,8 +3,8 @@ library;
|
|
|
3
3
|
|
|
4
4
|
import 'dart:convert';
|
|
5
5
|
|
|
6
|
-
import 'package:
|
|
7
|
-
import 'package:
|
|
6
|
+
import 'package:flutter_ota_kit_core/flutter_ota_kit_core.dart';
|
|
7
|
+
import 'package:flutter_ota_kit_plugin_core/flutter_ota_kit_plugin_core.dart';
|
|
8
8
|
|
|
9
9
|
import 'supabase_bundle_mapper.dart';
|
|
10
10
|
import 'supabase_client_adapter.dart';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// Faithful port of hot-updater `plugins/supabase/src/supabaseEdgeFunctionDatabase.ts`.
|
|
2
2
|
library;
|
|
3
3
|
|
|
4
|
-
import 'package:
|
|
4
|
+
import 'package:flutter_ota_kit_plugin_core/flutter_ota_kit_plugin_core.dart';
|
|
5
5
|
|
|
6
6
|
import 'supabase_database.dart';
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// Faithful port of hot-updater `plugins/supabase/src/supabaseEdgeFunctionStorage.ts`.
|
|
2
2
|
library;
|
|
3
3
|
|
|
4
|
-
import 'package:
|
|
4
|
+
import 'package:flutter_ota_kit_plugin_core/flutter_ota_kit_plugin_core.dart';
|
|
5
5
|
|
|
6
6
|
import 'supabase_client_adapter.dart';
|
|
7
7
|
import 'supabase_client_http.dart';
|
|
@@ -3,7 +3,7 @@ library;
|
|
|
3
3
|
|
|
4
4
|
import 'dart:io' as io;
|
|
5
5
|
|
|
6
|
-
import 'package:
|
|
6
|
+
import 'package:flutter_ota_kit_plugin_core/flutter_ota_kit_plugin_core.dart';
|
|
7
7
|
|
|
8
8
|
import 'supabase_client_adapter.dart';
|
|
9
9
|
import 'supabase_client_http.dart';
|
|
@@ -151,11 +151,8 @@ class NodeStorageProfileImpl implements NodeStorageProfile {
|
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
await verifySigned(bucket: bucket, key: storageKey);
|
|
154
|
-
final fullPath = upload.data is Map
|
|
155
|
-
? (upload.data as Map)['fullPath'] as String?
|
|
156
|
-
: null;
|
|
157
154
|
return {
|
|
158
|
-
'storageUri': 'supabase-storage://$
|
|
155
|
+
'storageUri': 'supabase-storage://$bucketName/$storageKey',
|
|
159
156
|
};
|
|
160
157
|
}
|
|
161
158
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
name:
|
|
2
|
-
description: Supabase plugin for
|
|
1
|
+
name: flutter_ota_kit_supabase
|
|
2
|
+
description: Supabase plugin for flutter_ota_kit — database + storage backends.
|
|
3
3
|
version: 0.1.0
|
|
4
4
|
publish_to: none
|
|
5
5
|
|
|
@@ -7,9 +7,9 @@ environment:
|
|
|
7
7
|
sdk: ">=3.3.0 <4.0.0"
|
|
8
8
|
|
|
9
9
|
dependencies:
|
|
10
|
-
|
|
10
|
+
flutter_ota_kit_core:
|
|
11
11
|
path: ../../packages/core
|
|
12
|
-
|
|
12
|
+
flutter_ota_kit_plugin_core:
|
|
13
13
|
path: ../../plugins/plugin-core
|
|
14
14
|
http: ^1.2.0
|
|
15
15
|
supabase: ^2.14.0
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
/// plugin, plus a configurable storage bucket used by the storage plugin.
|
|
7
7
|
library;
|
|
8
8
|
|
|
9
|
-
import 'package:
|
|
10
|
-
import 'package:
|
|
9
|
+
import 'package:flutter_ota_kit_core/flutter_ota_kit_core.dart';
|
|
10
|
+
import 'package:flutter_ota_kit_plugin_core/flutter_ota_kit_plugin_core.dart';
|
|
11
11
|
|
|
12
|
-
import 'package:
|
|
13
|
-
import 'package:
|
|
14
|
-
import 'package:
|
|
12
|
+
import 'package:flutter_ota_kit_supabase/src/supabase_bundle_mapper.dart';
|
|
13
|
+
import 'package:flutter_ota_kit_supabase/src/supabase_client_adapter.dart';
|
|
14
|
+
import 'package:flutter_ota_kit_supabase/src/types.dart';
|
|
15
15
|
|
|
16
16
|
// ---------------------------------------------------------------------------
|
|
17
17
|
// In-memory row store
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import 'package:
|
|
2
|
-
import 'package:
|
|
3
|
-
import 'package:
|
|
1
|
+
import 'package:flutter_ota_kit_core/flutter_ota_kit_core.dart';
|
|
2
|
+
import 'package:flutter_ota_kit_supabase/src/supabase_bundle_mapper.dart';
|
|
3
|
+
import 'package:flutter_ota_kit_supabase/src/types.dart';
|
|
4
4
|
import 'package:test/test.dart';
|
|
5
5
|
|
|
6
6
|
Bundle _makeBundle({List<BundlePatchArtifact> patches = const []}) => Bundle(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import 'package:
|
|
2
|
-
import 'package:
|
|
3
|
-
import 'package:
|
|
1
|
+
import 'package:flutter_ota_kit_core/flutter_ota_kit_core.dart';
|
|
2
|
+
import 'package:flutter_ota_kit_plugin_core/flutter_ota_kit_plugin_core.dart';
|
|
3
|
+
import 'package:flutter_ota_kit_supabase/flutter_ota_kit_supabase.dart';
|
|
4
4
|
import 'package:test/test.dart';
|
|
5
5
|
|
|
6
6
|
import 'mock_supabase_client.dart';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import 'dart:io' as io;
|
|
2
2
|
|
|
3
|
-
import 'package:
|
|
4
|
-
import 'package:
|
|
3
|
+
import 'package:flutter_ota_kit_plugin_core/flutter_ota_kit_plugin_core.dart';
|
|
4
|
+
import 'package:flutter_ota_kit_supabase/flutter_ota_kit_supabase.dart';
|
|
5
5
|
import 'package:test/test.dart';
|
|
6
6
|
|
|
7
7
|
import 'mock_supabase_client.dart';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# AWS migrations
|
|
2
|
+
|
|
3
|
+
The AWS backend stores bundle metadata as JSON in S3 (blob database), not in a
|
|
4
|
+
relational database. There are **no SQL migrations** to apply — the bucket and
|
|
5
|
+
object prefix are created on first `deploy`.
|
|
6
|
+
|
|
7
|
+
If you front downloads with CloudFront, provision the distribution separately.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
-- Migration number: 0001 2025-01-27T08:37:50.374Z
|
|
2
|
+
-- HotUpdater.bundles
|
|
3
|
+
|
|
4
|
+
CREATE TABLE bundles (
|
|
5
|
+
id TEXT PRIMARY KEY,
|
|
6
|
+
platform TEXT NOT NULL CHECK (platform IN ('ios', 'android')),
|
|
7
|
+
target_app_version TEXT NOT NULL,
|
|
8
|
+
should_force_update INTEGER NOT NULL CHECK (should_force_update IN (0, 1)),
|
|
9
|
+
enabled INTEGER NOT NULL CHECK (enabled IN (0, 1)),
|
|
10
|
+
file_url TEXT NOT NULL,
|
|
11
|
+
file_hash TEXT NOT NULL,
|
|
12
|
+
git_commit_hash TEXT,
|
|
13
|
+
message TEXT
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
CREATE INDEX bundles_target_app_version_idx ON bundles(target_app_version);
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
-- Migration number: 0003 2025-05-18T16:25:12.486Z
|
|
2
|
+
-- HotUpdater.bundles
|
|
3
|
+
|
|
4
|
+
ALTER TABLE bundles ADD COLUMN fingerprint_hash TEXT;
|
|
5
|
+
ALTER TABLE bundles ADD COLUMN storage_uri TEXT;
|
|
6
|
+
ALTER TABLE bundles ADD COLUMN metadata JSONB DEFAULT '{}';
|
|
7
|
+
|
|
8
|
+
UPDATE bundles
|
|
9
|
+
SET storage_uri = 'r2://%%BUCKET_NAME%%/' || id || '/bundle.zip'
|
|
10
|
+
WHERE storage_uri IS NULL;
|
|
11
|
+
|
|
12
|
+
CREATE TABLE bundles_temp (
|
|
13
|
+
id TEXT PRIMARY KEY,
|
|
14
|
+
platform TEXT NOT NULL,
|
|
15
|
+
should_force_update INTEGER NOT NULL,
|
|
16
|
+
enabled INTEGER NOT NULL,
|
|
17
|
+
file_hash TEXT NOT NULL,
|
|
18
|
+
git_commit_hash TEXT,
|
|
19
|
+
message TEXT,
|
|
20
|
+
channel TEXT NOT NULL DEFAULT 'production',
|
|
21
|
+
storage_uri TEXT NOT NULL,
|
|
22
|
+
target_app_version TEXT,
|
|
23
|
+
fingerprint_hash TEXT,
|
|
24
|
+
metadata JSONB DEFAULT '{}',
|
|
25
|
+
CHECK ((target_app_version IS NOT NULL) OR (fingerprint_hash IS NOT NULL))
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
INSERT INTO bundles_temp
|
|
29
|
+
SELECT id, platform, should_force_update, enabled, file_hash, git_commit_hash, message, channel, storage_uri, target_app_version, fingerprint_hash, metadata
|
|
30
|
+
FROM bundles;
|
|
31
|
+
|
|
32
|
+
DROP TABLE bundles;
|
|
33
|
+
|
|
34
|
+
ALTER TABLE bundles_temp RENAME TO bundles;
|
|
35
|
+
|
|
36
|
+
CREATE INDEX bundles_target_app_version_idx ON bundles(target_app_version);
|
|
37
|
+
CREATE INDEX bundles_fingerprint_hash_idx ON bundles(fingerprint_hash);
|
|
38
|
+
CREATE INDEX bundles_channel_idx ON bundles(channel);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
-- Migration number: 0004 2025-12-21T00:00:00.000Z
|
|
2
|
+
|
|
3
|
+
-- HotUpdater.bundles
|
|
4
|
+
|
|
5
|
+
ALTER TABLE bundles ADD COLUMN rollout_cohort_count INTEGER DEFAULT 1000
|
|
6
|
+
CHECK (rollout_cohort_count >= 0 AND rollout_cohort_count <= 1000);
|
|
7
|
+
|
|
8
|
+
CREATE INDEX IF NOT EXISTS bundles_rollout_idx ON bundles(rollout_cohort_count);
|
|
9
|
+
|
|
10
|
+
-- SQLite doesn't have array type, store as JSON text
|
|
11
|
+
ALTER TABLE bundles ADD COLUMN target_cohorts TEXT;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
-- Migration number: 0005 2026-04-22T00:00:00.000Z
|
|
2
|
+
|
|
3
|
+
-- HotUpdater.bundle_artifact_columns
|
|
4
|
+
|
|
5
|
+
ALTER TABLE bundles ADD COLUMN manifest_storage_uri TEXT;
|
|
6
|
+
ALTER TABLE bundles ADD COLUMN manifest_file_hash TEXT;
|
|
7
|
+
ALTER TABLE bundles ADD COLUMN asset_base_storage_uri TEXT;
|
|
8
|
+
|
|
9
|
+
CREATE TABLE bundle_patches (
|
|
10
|
+
id TEXT PRIMARY KEY,
|
|
11
|
+
bundle_id TEXT NOT NULL,
|
|
12
|
+
base_bundle_id TEXT NOT NULL,
|
|
13
|
+
base_file_hash TEXT NOT NULL,
|
|
14
|
+
patch_file_hash TEXT NOT NULL,
|
|
15
|
+
patch_storage_uri TEXT NOT NULL,
|
|
16
|
+
order_index INTEGER NOT NULL DEFAULT 0,
|
|
17
|
+
FOREIGN KEY (bundle_id) REFERENCES bundles(id) ON DELETE CASCADE,
|
|
18
|
+
FOREIGN KEY (base_bundle_id) REFERENCES bundles(id) ON DELETE CASCADE
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
CREATE INDEX IF NOT EXISTS bundle_patches_bundle_id_idx
|
|
22
|
+
ON bundle_patches(bundle_id);
|
|
23
|
+
CREATE INDEX IF NOT EXISTS bundle_patches_base_bundle_id_idx
|
|
24
|
+
ON bundle_patches(base_bundle_id);
|