Skip to content

Commit ce20ae3

Browse files
committed
Download wasm assets from this repository
1 parent 20a40b4 commit ce20ae3

File tree

1 file changed

+63
-33
lines changed

1 file changed

+63
-33
lines changed

packages/powersync_core/lib/src/setup_web.dart

Lines changed: 63 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -54,55 +54,83 @@ Future<void> downloadWebAssets(List<String> arguments,
5454

5555
try {
5656
final httpClient = HttpClient();
57+
const sqlitePackageName = 'sqlite3';
5758

58-
final powersyncPackageName = 'powersync';
59+
final (tag: powersyncTag, version: powerSyncVersion) =
60+
await powerSyncVersionOrLatest(
61+
httpClient, packageConfig, packageConfigFile);
62+
final firstPowerSyncVersionWithOwnWasm = Version(1, 12, 0);
5963

6064
if (downloadWorker) {
61-
final powersyncPkg =
62-
getPackageFromConfig(packageConfig, powersyncPackageName);
63-
64-
final powersyncVersion = getPubspecVersion(
65-
packageConfigFile, powersyncPkg, powersyncPackageName);
66-
6765
final workerUrl =
68-
'https://github.com/powersync-ja/powersync.dart/releases/download/powersync-v$powersyncVersion/powersync_db.worker.js';
69-
66+
'https://github.com/powersync-ja/powersync.dart/releases/download/$powersyncTag/powersync_db.worker.js';
7067
final syncWorkerUrl =
71-
'https://github.com/powersync-ja/powersync.dart/releases/download/powersync-v$powersyncVersion/powersync_sync.worker.js';
68+
'https://github.com/powersync-ja/powersync.dart/releases/download/$powersyncTag/powersync_sync.worker.js';
7269

7370
await downloadFile(httpClient, workerUrl, workerPath);
7471
await downloadFile(httpClient, syncWorkerUrl, syncWorkerPath);
7572
}
7673

77-
final sqlitePackageName = 'sqlite3';
74+
if (powerSyncVersion >= firstPowerSyncVersionWithOwnWasm) {
75+
final wasmUrl =
76+
'https://github.com/powersync-ja/powersync.dart/releases/download/powersync-$powersyncTag/$wasmFileName';
7877

79-
final sqlite3Pkg = getPackageFromConfig(packageConfig, sqlitePackageName);
80-
81-
String sqlite3Version =
82-
"v${getPubspecVersion(packageConfigFile, sqlite3Pkg, sqlitePackageName)}";
83-
84-
List<String> tags = await getLatestTagsFromRelease(httpClient);
85-
String? matchTag = tags.firstWhereOrNull((element) =>
86-
element.contains(sqlite3Version) && coreVersionIsInRange(element));
87-
if (matchTag != null) {
88-
sqlite3Version = matchTag;
78+
await downloadFile(httpClient, wasmUrl, wasmPath);
8979
} else {
90-
throw Exception(
91-
"""No compatible powersync core version found for sqlite3 version $sqlite3Version
80+
final sqlite3Pkg = getPackageFromConfig(packageConfig, sqlitePackageName);
81+
82+
String sqlite3Version =
83+
"v${getPubspecVersion(packageConfigFile, sqlite3Pkg, sqlitePackageName)}";
84+
85+
List<String> tags = await getLatestTagsFromRelease(httpClient);
86+
String? matchTag = tags.firstWhereOrNull((element) =>
87+
element.contains(sqlite3Version) && coreVersionIsInRange(element));
88+
if (matchTag != null) {
89+
sqlite3Version = matchTag;
90+
} else {
91+
throw Exception(
92+
"""No compatible powersync core version found for sqlite3 version $sqlite3Version
9293
Latest supported sqlite3 versions: ${tags.take(3).map((tag) => tag.split('-')[0]).join(', ')}.
9394
You can view the full list of releases at https://github.com/powersync-ja/sqlite3.dart/releases""");
94-
}
95+
}
9596

96-
final sqliteUrl =
97-
'https://github.com/powersync-ja/sqlite3.dart/releases/download/$sqlite3Version/$wasmFileName';
97+
final sqliteUrl =
98+
'https://github.com/powersync-ja/sqlite3.dart/releases/download/$sqlite3Version/$wasmFileName';
9899

99-
await downloadFile(httpClient, sqliteUrl, wasmPath);
100+
await downloadFile(httpClient, sqliteUrl, wasmPath);
101+
}
100102
} catch (e) {
101103
print(e);
102104
exit(1);
103105
}
104106
}
105107

108+
Future<({String tag, Version version})> powerSyncVersionOrLatest(
109+
HttpClient client, dynamic packageConfig, File packageConfigFile) async {
110+
const powersyncPackageName = 'powersync';
111+
// Don't require powersync dependency. The user has one if running this script
112+
// and we also want to support powersync_sqlcipher (for which we download
113+
// the latest versions).
114+
final powersyncPkg = getPackageFromConfig(packageConfig, powersyncPackageName,
115+
required: false);
116+
if (powersyncPkg == null) {
117+
final [tag, ...] =
118+
await getLatestTagsFromRelease(client, repo: 'powersync.dart');
119+
120+
return (
121+
tag: tag,
122+
version: Version.parse(tag.substring('powersync-v'.length))
123+
);
124+
}
125+
126+
final powersyncVersion =
127+
getPubspecVersion(packageConfigFile, powersyncPkg, powersyncPackageName);
128+
return (
129+
tag: 'powersync-v$powersyncVersion',
130+
version: Version.parse(powersyncVersion),
131+
);
132+
}
133+
106134
bool coreVersionIsInRange(String tag) {
107135
// Sets the range of powersync core version that is compatible with the sqlite3 version
108136
// We're a little more selective in the versions chosen here than the range
@@ -121,12 +149,13 @@ bool coreVersionIsInRange(String tag) {
121149
return false;
122150
}
123151

124-
dynamic getPackageFromConfig(dynamic packageConfig, String packageName) {
152+
dynamic getPackageFromConfig(dynamic packageConfig, String packageName,
153+
{bool required = false}) {
125154
final pkg = (packageConfig['packages'] as List? ?? <dynamic>[]).firstWhere(
126155
(dynamic e) => e['name'] == packageName,
127156
orElse: () => null,
128157
);
129-
if (pkg == null) {
158+
if (pkg == null && required) {
130159
throw Exception('Dependency on package:$packageName is required');
131160
}
132161
return pkg;
@@ -151,17 +180,18 @@ String getPubspecVersion(
151180

152181
String capitalize(String s) => s[0].toUpperCase() + s.substring(1);
153182

154-
Future<List<String>> getLatestTagsFromRelease(HttpClient httpClient) async {
155-
var request = await httpClient.getUrl(Uri.parse(
156-
"https://api.github.com/repos/powersync-ja/sqlite3.dart/releases"));
183+
Future<List<String>> getLatestTagsFromRelease(HttpClient httpClient,
184+
{String repo = 'sqlite3.dart'}) async {
185+
var request = await httpClient.getUrl(
186+
Uri.parse("https://api.github.com/repos/powersync-ja/$repo/releases"));
157187
var response = await request.close();
158188
if (response.statusCode == HttpStatus.ok) {
159189
var res = await response.transform(utf8.decoder).join();
160190
var jsonObj = json.decode(res) as List<dynamic>;
161191
List<String> tags = [];
162192
for (dynamic obj in jsonObj) {
163193
final tagName = obj['tag_name'] as String;
164-
if (!tagName.contains("-powersync")) continue;
194+
if (!tagName.contains("powersync")) continue;
165195
tags.add(tagName);
166196
}
167197
return tags;

0 commit comments

Comments
 (0)