@hot-updater/cloudflare 1.0.0-rc.46 → 1.0.0-rc.47
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/package.json +6 -6
- package/worker/dist/README.md +1 -1
- package/worker/dist/index.js +20 -55
- package/worker/dist/index.js.map +2 -2
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hot-updater/cloudflare",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.0.0-rc.
|
|
4
|
+
"version": "1.0.0-rc.47",
|
|
5
5
|
"description": "React Native OTA solution for self-hosted",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
7
7
|
"module": "dist/index.mjs",
|
|
@@ -55,10 +55,10 @@
|
|
|
55
55
|
"cloudflare": "4.2.0",
|
|
56
56
|
"hono": "4.12.34",
|
|
57
57
|
"uuidv7": "^1.0.2",
|
|
58
|
-
"@hot-updater/
|
|
59
|
-
"@hot-updater/
|
|
60
|
-
"@hot-updater/
|
|
61
|
-
"@hot-updater/
|
|
58
|
+
"@hot-updater/protocol": "1.0.0-rc.47",
|
|
59
|
+
"@hot-updater/cli-tools": "1.0.0-rc.47",
|
|
60
|
+
"@hot-updater/plugin-core": "1.0.0-rc.47",
|
|
61
|
+
"@hot-updater/server": "1.0.0-rc.47"
|
|
62
62
|
},
|
|
63
63
|
"devDependencies": {
|
|
64
64
|
"@cloudflare/vitest-pool-workers": "0.13.0",
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
"vitest": "4.1.4",
|
|
75
75
|
"wrangler": "^4.69.0",
|
|
76
76
|
"xdg-app-paths": "^8.3.0",
|
|
77
|
-
"@hot-updater/test-utils": "1.0.0-rc.
|
|
77
|
+
"@hot-updater/test-utils": "1.0.0-rc.47"
|
|
78
78
|
},
|
|
79
79
|
"scripts": {
|
|
80
80
|
"build": "tsdown && pnpm build:worker",
|
package/worker/dist/README.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
This folder contains the built output assets for the worker "hot-updater" generated at 2026-10-
|
|
1
|
+
This folder contains the built output assets for the worker "hot-updater" generated at 2026-10-10T23:06:42.511Z.
|
package/worker/dist/index.js
CHANGED
|
@@ -1208,30 +1208,24 @@ function validateReleases(releases, strategy) {
|
|
|
1208
1208
|
if (seenIds.has(release.id)) throw new ReleaseCatalogCompilationError("INVALID_RELEASE", `Duplicate Release ID: ${release.id}`);
|
|
1209
1209
|
seenIds.add(release.id);
|
|
1210
1210
|
if (release.strategy !== strategy) throw new ReleaseCatalogCompilationError("INVALID_RELEASE", `Release ${release.id} has the wrong strategy`);
|
|
1211
|
-
if (release.
|
|
1211
|
+
if (release.bundleId === null) throw new ReleaseCatalogCompilationError("INVALID_RELEASE", `Release ${release.id} has no Bundle`);
|
|
1212
1212
|
if (release.targetCohorts.length > MAX_TARGET_COHORTS_PER_RELEASE) throw new ReleaseCatalogCompilationError("TARGET_COHORT_LIMIT", `Release ${release.id} exceeds ${MAX_TARGET_COHORTS_PER_RELEASE} target cohorts`);
|
|
1213
1213
|
if (strategy === "APP_VERSION" && (release.targetAppVersion === null || release.fingerprintHash !== null)) throw new ReleaseCatalogCompilationError("INVALID_RELEASE", `Release ${release.id} has an invalid app-version target`);
|
|
1214
1214
|
if (strategy === "FINGERPRINT" && (release.fingerprintHash === null || release.targetAppVersion !== null)) throw new ReleaseCatalogCompilationError("INVALID_RELEASE", `Release ${release.id} has an invalid fingerprint target`);
|
|
1215
1215
|
}
|
|
1216
|
-
return enabled
|
|
1216
|
+
return enabled;
|
|
1217
1217
|
}
|
|
1218
1218
|
__name(validateReleases, "validateReleases");
|
|
1219
1219
|
function collectFrontierReleaseIds(releases) {
|
|
1220
1220
|
if (releases.every((release) => normalizeRolloutCohortCount(release.rolloutCohortCount) >= NUMERIC_COHORT_SIZE)) {
|
|
1221
1221
|
const retained3 = /* @__PURE__ */ new Set();
|
|
1222
1222
|
const bundleIds = /* @__PURE__ */ new Set();
|
|
1223
|
-
let embedded = false;
|
|
1224
1223
|
for (const release of releases) {
|
|
1225
|
-
if (release.
|
|
1226
|
-
if (!embedded) {
|
|
1227
|
-
embedded = true;
|
|
1228
|
-
retained3.add(release.id);
|
|
1229
|
-
}
|
|
1230
|
-
} else if (release.bundleId !== null && bundleIds.size < 11 && !bundleIds.has(release.bundleId)) {
|
|
1224
|
+
if (release.bundleId !== null && !bundleIds.has(release.bundleId)) {
|
|
1231
1225
|
bundleIds.add(release.bundleId);
|
|
1232
1226
|
retained3.add(release.id);
|
|
1233
1227
|
}
|
|
1234
|
-
if (
|
|
1228
|
+
if (bundleIds.size >= 11) break;
|
|
1235
1229
|
}
|
|
1236
1230
|
return retained3;
|
|
1237
1231
|
}
|
|
@@ -1248,7 +1242,6 @@ function collectFrontierReleaseIds(releases) {
|
|
|
1248
1242
|
normalized,
|
|
1249
1243
|
numeric: normalized === void 0 ? null : getNumericCohortValue(normalized),
|
|
1250
1244
|
bundleIds: /* @__PURE__ */ new Set(),
|
|
1251
|
-
embedded: false,
|
|
1252
1245
|
complete: false
|
|
1253
1246
|
};
|
|
1254
1247
|
});
|
|
@@ -1273,16 +1266,11 @@ function collectFrontierReleaseIds(releases) {
|
|
|
1273
1266
|
for (const index of eligibleStateIndexes) {
|
|
1274
1267
|
const state = cohortStates[index];
|
|
1275
1268
|
if (state.complete) continue;
|
|
1276
|
-
if (release.
|
|
1277
|
-
if (!state.embedded) {
|
|
1278
|
-
state.embedded = true;
|
|
1279
|
-
retained2.add(release.id);
|
|
1280
|
-
}
|
|
1281
|
-
} else if (release.bundleId !== null && state.bundleIds.size < 11 && !state.bundleIds.has(release.bundleId)) {
|
|
1269
|
+
if (release.bundleId !== null && !state.bundleIds.has(release.bundleId)) {
|
|
1282
1270
|
state.bundleIds.add(release.bundleId);
|
|
1283
1271
|
retained2.add(release.id);
|
|
1284
1272
|
}
|
|
1285
|
-
if (state.
|
|
1273
|
+
if (state.bundleIds.size >= 11) {
|
|
1286
1274
|
state.complete = true;
|
|
1287
1275
|
incompleteStateCount -= 1;
|
|
1288
1276
|
}
|
|
@@ -1479,12 +1467,11 @@ function projectCompiledCatalog(catalog, appVersion) {
|
|
|
1479
1467
|
__name(projectCompiledCatalog, "projectCompiledCatalog");
|
|
1480
1468
|
function projectCompiledRollbackCatalog(catalog, appVersion) {
|
|
1481
1469
|
let indexes;
|
|
1482
|
-
if (catalog.strategy === "FINGERPRINT") indexes = catalog.rollbackReleaseIndexes
|
|
1470
|
+
if (catalog.strategy === "FINGERPRINT") indexes = catalog.rollbackReleaseIndexes;
|
|
1483
1471
|
else {
|
|
1484
1472
|
const canonicalVersion = appVersion && canonicalizeAppVersion(appVersion);
|
|
1485
1473
|
if (!canonicalVersion) return [];
|
|
1486
|
-
|
|
1487
|
-
indexes = segment?.rollbackReleaseIndexes ?? segment?.releaseIndexes ?? [];
|
|
1474
|
+
indexes = catalog.segments.find((segment) => versionInSegment(canonicalVersion, segment))?.rollbackReleaseIndexes ?? [];
|
|
1488
1475
|
}
|
|
1489
1476
|
return indexes.map((index) => catalog.releaseDescriptors[index]);
|
|
1490
1477
|
}
|
|
@@ -1995,7 +1982,7 @@ var SETTINGS_TABLE = {
|
|
|
1995
1982
|
var ENGINE_SCHEMA_KEY = "schema.engine";
|
|
1996
1983
|
var CORE_SCHEMA_KEY = "schema.core";
|
|
1997
1984
|
var stored = /* @__PURE__ */ __name(({ key, expected, found }) => `"${key}" is ${found === null ? "missing" : `"${found}"`}; expected "${expected}"`, "stored");
|
|
1998
|
-
var settingMessage = /* @__PURE__ */ __name((adapterName, { key, expected, found }) => `Hot Updater schema setting "${key}" for ${adapterName} is ${found === null ? "missing" : `"${found}"`}; expected "${expected}".
|
|
1985
|
+
var settingMessage = /* @__PURE__ */ __name((adapterName, { key, expected, found }) => `Hot Updater schema setting "${key}" for ${adapterName} is ${found === null ? "missing" : `"${found}"`}; expected "${expected}". Run \`hot-updater db migrate\`.`, "settingMessage");
|
|
1999
1986
|
var pluginOf = /* @__PURE__ */ __name(({ key }) => key.startsWith("schema.") && key !== "schema.engine" && key !== CORE_SCHEMA_KEY ? key.slice(7) : void 0, "pluginOf");
|
|
2000
1987
|
var listed = /* @__PURE__ */ __name((items) => items.length < 2 ? items.join("") : `${items.slice(0, -1).join(", ")} and ${items.at(-1)}`, "listed");
|
|
2001
1988
|
var PLUGIN_TABLES_FIX = "Run `hot-updater db migrate`. A managed server runs only its provider's plugins, and rerunning `hot-updater init --provider <provider>` applies the provider's migrations. Run `hot-updater db` commands in the server's project: they load the server file named on the command line, or src/hotUpdater.* or src/db.*, and don't read hot-updater.config.ts.";
|
|
@@ -2095,24 +2082,12 @@ var METER = /* @__PURE__ */ Symbol.for("@hot-updater/plugin-core/read-meter");
|
|
|
2095
2082
|
var readMeterOf = /* @__PURE__ */ __name((database) => typeof database === "object" && database !== null ? database[METER] : void 0, "readMeterOf");
|
|
2096
2083
|
|
|
2097
2084
|
// ../plugin-core/dist/engine/db/schemaSettings.mjs
|
|
2098
|
-
var assertEngineDatabase = /* @__PURE__ */ __name((adapterName, stored2) => {
|
|
2099
|
-
if (stored2.get("schema.core") && !stored2.get("schema.engine")) throw new HotUpdaterSchemaMigrationRequiredError(adapterName, String(stored2.get("schema.core").value), {
|
|
2100
|
-
key: ENGINE_SCHEMA_KEY,
|
|
2101
|
-
expected: "1",
|
|
2102
|
-
found: null
|
|
2103
|
-
});
|
|
2104
|
-
}, "assertEngineDatabase");
|
|
2105
2085
|
var storedSettings = /* @__PURE__ */ __name(async (adapter, keys) => {
|
|
2106
2086
|
const rows = await readSettings(adapter, keys);
|
|
2107
2087
|
return new Map(keys.map((key, position) => [key, rows[position] ?? null]));
|
|
2108
2088
|
}, "storedSettings");
|
|
2109
2089
|
var writeSchemaSettings = /* @__PURE__ */ __name(async (adapter, adapterName, settings) => {
|
|
2110
|
-
const stored2 = await storedSettings(adapter,
|
|
2111
|
-
"schema.core",
|
|
2112
|
-
ENGINE_SCHEMA_KEY,
|
|
2113
|
-
...Object.keys(settings)
|
|
2114
|
-
])]);
|
|
2115
|
-
assertEngineDatabase(adapterName, stored2);
|
|
2090
|
+
const stored2 = await storedSettings(adapter, Object.keys(settings));
|
|
2116
2091
|
const ops = Object.entries(settings).flatMap(([key, value]) => {
|
|
2117
2092
|
const row = stored2.get(key);
|
|
2118
2093
|
if (row === null || row === void 0) return [{
|
|
@@ -2135,15 +2110,10 @@ var writeSchemaSettings = /* @__PURE__ */ __name(async (adapter, adapterName, se
|
|
|
2135
2110
|
}];
|
|
2136
2111
|
});
|
|
2137
2112
|
if (ops.length === 0) return;
|
|
2138
|
-
if (!(await adapter.write(ops)).ok) throw new Error(
|
|
2113
|
+
if (!(await adapter.write(ops)).ok) throw new Error(`${adapterName}: the schema settings changed during the migration; run it again.`);
|
|
2139
2114
|
}, "writeSchemaSettings");
|
|
2140
2115
|
var migrateSchema = /* @__PURE__ */ __name(async (adapter, adapterName, tables, settings) => {
|
|
2141
2116
|
if (adapter.migrations === void 0) throw new Error(`${adapterName} creates its tables with its own tooling; write only the settings rows.`);
|
|
2142
|
-
const stored2 = await storedSettings(adapter, ["schema.core", ENGINE_SCHEMA_KEY]).catch((error) => {
|
|
2143
|
-
if (!isMissingSchemaError(error)) throw error;
|
|
2144
|
-
return /* @__PURE__ */ new Map();
|
|
2145
|
-
});
|
|
2146
|
-
assertEngineDatabase(adapterName, stored2);
|
|
2147
2117
|
await adapter.migrations.apply([...tables, SETTINGS_TABLE]);
|
|
2148
2118
|
await writeSchemaSettings(adapter, adapterName, settings);
|
|
2149
2119
|
}, "migrateSchema");
|
|
@@ -2568,15 +2538,11 @@ var storedSchemaVersion = /* @__PURE__ */ __name((stored2) => {
|
|
|
2568
2538
|
const version2 = stored2?.get("schema.core") ?? stored2?.get("version");
|
|
2569
2539
|
return typeof version2 === "string" ? version2 : void 0;
|
|
2570
2540
|
}, "storedSchemaVersion");
|
|
2571
|
-
var
|
|
2572
|
-
const version2 =
|
|
2573
|
-
if (version2
|
|
2574
|
-
throw new HotUpdaterSchemaMigrationRequiredError(adapterName, version2
|
|
2575
|
-
|
|
2576
|
-
expected: "1",
|
|
2577
|
-
found: null
|
|
2578
|
-
} : void 0);
|
|
2579
|
-
}, "refusePreEngineDatabase");
|
|
2541
|
+
var refuseV0Database = /* @__PURE__ */ __name((adapterName, stored2) => {
|
|
2542
|
+
const version2 = stored2.get("version");
|
|
2543
|
+
if (typeof version2 !== "string" || stored2.has("schema.engine")) return;
|
|
2544
|
+
throw new HotUpdaterSchemaMigrationRequiredError(adapterName, version2);
|
|
2545
|
+
}, "refuseV0Database");
|
|
2580
2546
|
|
|
2581
2547
|
// ../plugin-core/dist/engine/database/cursor.mjs
|
|
2582
2548
|
var encoder = new TextEncoder();
|
|
@@ -3509,7 +3475,7 @@ var createEngineMigrator = /* @__PURE__ */ __name((options) => {
|
|
|
3509
3475
|
const getVersion = /* @__PURE__ */ __name(async () => storedSchemaVersion(await options.readSettings()), "getVersion");
|
|
3510
3476
|
const makeResult = /* @__PURE__ */ __name(async (migrate = {}) => {
|
|
3511
3477
|
const stored2 = await options.readSettings();
|
|
3512
|
-
|
|
3478
|
+
refuseV0Database(options.adapterName, stored2);
|
|
3513
3479
|
if (Object.entries(options.settings).every(([key, value]) => stored2.get(key) === value)) return getEmptyMigrationResult();
|
|
3514
3480
|
return {
|
|
3515
3481
|
operations: [...options.schema.tables.map((table) => ({
|
|
@@ -4544,7 +4510,7 @@ var createSqlAdapter = /* @__PURE__ */ __name(({ executor, tablePrefix = "", max
|
|
|
4544
4510
|
}, "createSqlAdapter");
|
|
4545
4511
|
|
|
4546
4512
|
// ../../packages/server/dist/package.mjs
|
|
4547
|
-
var version = "1.0.0-rc.
|
|
4513
|
+
var version = "1.0.0-rc.47";
|
|
4548
4514
|
|
|
4549
4515
|
// ../../packages/server/dist/version.mjs
|
|
4550
4516
|
var HOT_UPDATER_SERVER_VERSION = version;
|
|
@@ -5238,7 +5204,7 @@ var baseBundleIdsOf = /* @__PURE__ */ __name((row, range, bundleId, limit) => {
|
|
|
5238
5204
|
for (const { descriptor, index } of newestFirst) {
|
|
5239
5205
|
if (ids.length >= limit) break;
|
|
5240
5206
|
const id = descriptor.bundleId;
|
|
5241
|
-
if (serving.has(index) &&
|
|
5207
|
+
if (serving.has(index) && id !== null && id < bundleId && !ids.includes(id)) ids.push(id);
|
|
5242
5208
|
}
|
|
5243
5209
|
return ids;
|
|
5244
5210
|
}, "baseBundleIdsOf");
|
|
@@ -5969,7 +5935,7 @@ var createCoreOperations = /* @__PURE__ */ __name((db, { now = Date.now } = {})
|
|
|
5969
5935
|
}), "deleteRelease"),
|
|
5970
5936
|
promoteRelease: /* @__PURE__ */ __name((input) => withChannels(async () => {
|
|
5971
5937
|
const checkSource = /* @__PURE__ */ __name((source) => {
|
|
5972
|
-
if (source.
|
|
5938
|
+
if (source.bundle_id === null) throw new ReleaseManagementError("TARGET_RELEASE_INVALID", "Only a Bundle Release can be promoted.");
|
|
5973
5939
|
}, "checkSource");
|
|
5974
5940
|
checkSource((await db.transaction((tx) => loadTarget(tx, input))).release);
|
|
5975
5941
|
const targetChannel = input.targetChannel.trim();
|
|
@@ -6161,7 +6127,6 @@ var fail3 = /* @__PURE__ */ __name((message) => {
|
|
|
6161
6127
|
var isRecord2 = /* @__PURE__ */ __name((value) => typeof value === "object" && value !== null && !Array.isArray(value), "isRecord");
|
|
6162
6128
|
var checkPlugin = /* @__PURE__ */ __name((value, at) => {
|
|
6163
6129
|
if (!isRecord2(value)) return fail3(`${at} is not a plugin.`);
|
|
6164
|
-
if ("kind" in value) fail3(`${at} has a kind; core is built in and is never passed as a plugin.`);
|
|
6165
6130
|
const unknown = Object.keys(value).find((key) => !PLUGIN_KEYS.has(key));
|
|
6166
6131
|
if (unknown !== void 0) fail3(`${at} has an unknown key "${unknown}".`);
|
|
6167
6132
|
const plugin = value;
|