@camstack/server 1.1.61 → 1.1.63

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.
@@ -98,6 +98,7 @@ var require_dist = __commonJS({
98
98
  planBoot: /* @__PURE__ */ __name(() => planBoot, "planBoot"),
99
99
  readDevUploadManifest: /* @__PURE__ */ __name(() => readDevUploadManifest, "readDevUploadManifest"),
100
100
  readRestartIntentMarker: /* @__PURE__ */ __name(() => readRestartIntentMarker, "readRestartIntentMarker"),
101
+ readSeedVersion: /* @__PURE__ */ __name(() => readSeedVersion, "readSeedVersion"),
101
102
  readServerRootState: /* @__PURE__ */ __name(() => readServerRootState, "readServerRootState"),
102
103
  registerActiveRootResolver: /* @__PURE__ */ __name(() => registerActiveRootResolver, "registerActiveRootResolver"),
103
104
  restartIntentMarkerPath: /* @__PURE__ */ __name(() => restartIntentMarkerPath, "restartIntentMarkerPath"),
@@ -351,7 +352,39 @@ var require_dist = __commonJS({
351
352
  return null;
352
353
  }
353
354
  __name(validateVersionDir, "validateVersionDir");
354
- function planBoot(state, isValidVersion, now) {
355
+ function parse(version) {
356
+ const dashIdx = version.indexOf("-");
357
+ const base = dashIdx === -1 ? version : version.slice(0, dashIdx);
358
+ const prerelease = dashIdx === -1 ? null : version.slice(dashIdx + 1);
359
+ const nums = base.split(".").map((seg) => {
360
+ const n = Number.parseInt(seg, 10);
361
+ return Number.isNaN(n) ? 0 : n;
362
+ });
363
+ return {
364
+ nums,
365
+ prerelease
366
+ };
367
+ }
368
+ __name(parse, "parse");
369
+ function compareSemver(a, b) {
370
+ const pa = parse(a);
371
+ const pb = parse(b);
372
+ const len = Math.max(pa.nums.length, pb.nums.length);
373
+ for (let i = 0; i < len; i++) {
374
+ const na = pa.nums[i] ?? 0;
375
+ const nb = pb.nums[i] ?? 0;
376
+ if (na < nb) return -1;
377
+ if (na > nb) return 1;
378
+ }
379
+ if (pa.prerelease === null && pb.prerelease === null) return 0;
380
+ if (pa.prerelease === null) return 1;
381
+ if (pb.prerelease === null) return -1;
382
+ if (pa.prerelease < pb.prerelease) return -1;
383
+ if (pa.prerelease > pb.prerelease) return 1;
384
+ return 0;
385
+ }
386
+ __name(compareSemver, "compareSemver");
387
+ function planBoot(state, isValidVersion, now, seedVersion = null) {
355
388
  if (state === null) {
356
389
  return {
357
390
  kind: "baked",
@@ -404,6 +437,19 @@ var require_dist = __commonJS({
404
437
  }
405
438
  if (next.currentVersion !== null) {
406
439
  if (isValidVersion(next.currentVersion)) {
440
+ if (!changed && seedVersion !== null && compareSemver(seedVersion, next.currentVersion) > 0) {
441
+ return {
442
+ kind: "baked",
443
+ reason: `baked seed ${seedVersion} is newer than active data-root ${next.currentVersion} \u2014 adopting the image seed`,
444
+ stateToWrite: {
445
+ ...next,
446
+ currentVersion: null,
447
+ previousVersion: null,
448
+ pendingBoot: null,
449
+ rolledBack: null
450
+ }
451
+ };
452
+ }
407
453
  return {
408
454
  kind: "data-root",
409
455
  version: next.currentVersion,
@@ -453,38 +499,6 @@ var require_dist = __commonJS({
453
499
  };
454
500
  }
455
501
  __name(planBoot, "planBoot");
456
- function parse(version) {
457
- const dashIdx = version.indexOf("-");
458
- const base = dashIdx === -1 ? version : version.slice(0, dashIdx);
459
- const prerelease = dashIdx === -1 ? null : version.slice(dashIdx + 1);
460
- const nums = base.split(".").map((seg) => {
461
- const n = Number.parseInt(seg, 10);
462
- return Number.isNaN(n) ? 0 : n;
463
- });
464
- return {
465
- nums,
466
- prerelease
467
- };
468
- }
469
- __name(parse, "parse");
470
- function compareSemver(a, b) {
471
- const pa = parse(a);
472
- const pb = parse(b);
473
- const len = Math.max(pa.nums.length, pb.nums.length);
474
- for (let i = 0; i < len; i++) {
475
- const na = pa.nums[i] ?? 0;
476
- const nb = pb.nums[i] ?? 0;
477
- if (na < nb) return -1;
478
- if (na > nb) return 1;
479
- }
480
- if (pa.prerelease === null && pb.prerelease === null) return 0;
481
- if (pa.prerelease === null) return 1;
482
- if (pb.prerelease === null) return -1;
483
- if (pa.prerelease < pb.prerelease) return -1;
484
- if (pa.prerelease > pb.prerelease) return 1;
485
- return 0;
486
- }
487
- __name(compareSemver, "compareSemver");
488
502
  var fs3 = __toESM2(require("fs"));
489
503
  var path3 = __toESM2(require("path"));
490
504
  function detectWorkspaceRoot(fromDir) {
@@ -504,6 +518,7 @@ var require_dist = __commonJS({
504
518
  }
505
519
  }
506
520
  __name(detectWorkspaceRoot, "detectWorkspaceRoot");
521
+ var fs4 = __toESM2(require("fs"));
507
522
  var path4 = __toESM2(require("path"));
508
523
  var import_node_url = require("url");
509
524
  var HOST_EXTERNAL_SPECIFIERS = [
@@ -546,6 +561,20 @@ var require_dist = __commonJS({
546
561
  registerHooks(hooks);
547
562
  }
548
563
  __name(registerActiveRootResolver, "registerActiveRootResolver");
564
+ function readSeedVersion(seedEntry) {
565
+ try {
566
+ const pkgJsonPath = path4.join(path4.dirname(seedEntry), "..", "package.json");
567
+ const raw = JSON.parse(fs4.readFileSync(pkgJsonPath, "utf-8"));
568
+ if (typeof raw === "object" && raw !== null) {
569
+ const version = raw["version"];
570
+ if (typeof version === "string") return version;
571
+ }
572
+ return null;
573
+ } catch {
574
+ return null;
575
+ }
576
+ }
577
+ __name(readSeedVersion, "readSeedVersion");
549
578
  function runNodeStarter(options) {
550
579
  const env = options.env ?? process.env;
551
580
  const now = options.now ?? Date.now;
@@ -572,7 +601,8 @@ var require_dist = __commonJS({
572
601
  if (reason !== null) console.warn(`[starter] version ${version} invalid: ${reason}`);
573
602
  return reason === null;
574
603
  }, "isValidVersion");
575
- const plan = planBoot(state, isValidVersion, now);
604
+ const seedVersion = readSeedVersion(options.seedEntry);
605
+ const plan = planBoot(state, isValidVersion, now, seedVersion);
576
606
  if (plan.stateToWrite !== null) {
577
607
  try {
578
608
  writeServerRootState(rootDir, plan.stateToWrite);
@@ -604,7 +634,7 @@ var require_dist = __commonJS({
604
634
  }
605
635
  __name(runNodeStarter, "runNodeStarter");
606
636
  var import_node_child_process = require("child_process");
607
- var fs4 = __toESM2(require("fs"));
637
+ var fs5 = __toESM2(require("fs"));
608
638
  var path5 = __toESM2(require("path"));
609
639
  var import_node_util = require("util");
610
640
  var execFileAsync = (0, import_node_util.promisify)(import_node_child_process.execFile);
@@ -622,7 +652,7 @@ var require_dist = __commonJS({
622
652
  var RESTART_REASON_PREFIX = "server-update";
623
653
  function readPackageVersion(pkgJsonPath) {
624
654
  try {
625
- const raw = JSON.parse(fs4.readFileSync(pkgJsonPath, "utf-8"));
655
+ const raw = JSON.parse(fs5.readFileSync(pkgJsonPath, "utf-8"));
626
656
  if (typeof raw === "object" && raw !== null) {
627
657
  const version = raw["version"];
628
658
  if (typeof version === "string") return version;
@@ -712,7 +742,7 @@ var require_dist = __commonJS({
712
742
  };
713
743
  return {
714
744
  state: emptyServerRootState(),
715
- corrupt: fs4.existsSync(stateFilePath(rootDir))
745
+ corrupt: fs5.existsSync(stateFilePath(rootDir))
716
746
  };
717
747
  }
718
748
  updateState(state) {
@@ -865,7 +895,7 @@ var require_dist = __commonJS({
865
895
  }
866
896
  if (isDevChannelVersion(target)) {
867
897
  const uploadsDir = devUploadVersionDir(this.rootDir(), target);
868
- if (!fs4.existsSync(uploadsDir)) {
898
+ if (!fs5.existsSync(uploadsDir)) {
869
899
  return {
870
900
  accepted: false,
871
901
  targetVersion: target,
@@ -926,11 +956,11 @@ var require_dist = __commonJS({
926
956
  async stageAndActivate(target) {
927
957
  const rootDir = this.rootDir();
928
958
  const vDir = versionsDir(rootDir);
929
- fs4.mkdirSync(vDir, {
959
+ fs5.mkdirSync(vDir, {
930
960
  recursive: true
931
961
  });
932
962
  const stagingDir = path5.join(vDir, `.staging-${target}-${process.pid}-${this.now()}`);
933
- fs4.mkdirSync(stagingDir, {
963
+ fs5.mkdirSync(stagingDir, {
934
964
  recursive: true
935
965
  });
936
966
  try {
@@ -943,8 +973,8 @@ var require_dist = __commonJS({
943
973
  "--no-fund",
944
974
  "--loglevel=error"
945
975
  ];
946
- if (fs4.existsSync(devDir)) {
947
- fs4.writeFileSync(path5.join(stagingDir, "package.json"), JSON.stringify(this.buildDevUploadsPackageJson(devDir, target), null, 2), "utf-8");
976
+ if (fs5.existsSync(devDir)) {
977
+ fs5.writeFileSync(path5.join(stagingDir, "package.json"), JSON.stringify(this.buildDevUploadsPackageJson(devDir, target), null, 2), "utf-8");
948
978
  await this.execNpm([
949
979
  ...installArgs,
950
980
  ...buildNpmRegistryArgs(registry)
@@ -953,7 +983,7 @@ var require_dist = __commonJS({
953
983
  timeoutMs: NPM_INSTALL_TIMEOUT_MS
954
984
  });
955
985
  } else {
956
- fs4.writeFileSync(path5.join(stagingDir, "package.json"), JSON.stringify({
986
+ fs5.writeFileSync(path5.join(stagingDir, "package.json"), JSON.stringify({
957
987
  name: "camstack-node-root",
958
988
  private: true
959
989
  }, null, 2), "utf-8");
@@ -967,7 +997,7 @@ var require_dist = __commonJS({
967
997
  });
968
998
  }
969
999
  const entry = rootEntryPath2(stagingDir, this.spec);
970
- if (!fs4.existsSync(entry)) {
1000
+ if (!fs5.existsSync(entry)) {
971
1001
  throw new Error(`staged closure is missing the root entry (${entry})`);
972
1002
  }
973
1003
  const stagedVersion = readPackageVersion(path5.join(rootPackageDir2(stagingDir, this.spec), "package.json"));
@@ -975,17 +1005,17 @@ var require_dist = __commonJS({
975
1005
  throw new Error(`staged closure version mismatch: expected ${target}, got ${stagedVersion ?? "unknown"}`);
976
1006
  }
977
1007
  const dest = versionDir(rootDir, target);
978
- if (fs4.existsSync(dest)) {
1008
+ if (fs5.existsSync(dest)) {
979
1009
  const aside = `${dest}.evicted-${this.now()}`;
980
- await fs4.promises.rename(dest, aside);
981
- await fs4.promises.rm(aside, {
1010
+ await fs5.promises.rename(dest, aside);
1011
+ await fs5.promises.rm(aside, {
982
1012
  recursive: true,
983
1013
  force: true
984
1014
  }).catch(() => void 0);
985
1015
  }
986
- await fs4.promises.rename(stagingDir, dest);
1016
+ await fs5.promises.rename(stagingDir, dest);
987
1017
  } catch (err) {
988
- await fs4.promises.rm(stagingDir, {
1018
+ await fs5.promises.rm(stagingDir, {
989
1019
  recursive: true,
990
1020
  force: true
991
1021
  }).catch(() => void 0);
@@ -1015,7 +1045,7 @@ var require_dist = __commonJS({
1015
1045
  }
1016
1046
  const fileRef = /* @__PURE__ */ __name((filename) => {
1017
1047
  const abs = path5.join(devDir, filename);
1018
- if (!fs4.existsSync(abs)) {
1048
+ if (!fs5.existsSync(abs)) {
1019
1049
  throw new Error(`dev-uploads tarball listed in the manifest is missing: ${abs}`);
1020
1050
  }
1021
1051
  return `file:${abs}`;
@@ -1194,7 +1224,7 @@ var require_dist = __commonJS({
1194
1224
  const vDir = versionsDir(this.rootDir());
1195
1225
  let entries;
1196
1226
  try {
1197
- entries = fs4.readdirSync(vDir);
1227
+ entries = fs5.readdirSync(vDir);
1198
1228
  } catch {
1199
1229
  return;
1200
1230
  }
@@ -1203,14 +1233,14 @@ var require_dist = __commonJS({
1203
1233
  const full = path5.join(vDir, entry);
1204
1234
  if (entry.startsWith(".")) {
1205
1235
  try {
1206
- const ageMs = this.now() - fs4.statSync(full).mtimeMs;
1236
+ const ageMs = this.now() - fs5.statSync(full).mtimeMs;
1207
1237
  if (ageMs < _RootUpdateService.STALE_TRANSIENT_MS) continue;
1208
1238
  } catch {
1209
1239
  continue;
1210
1240
  }
1211
1241
  }
1212
1242
  try {
1213
- fs4.rmSync(full, {
1243
+ fs5.rmSync(full, {
1214
1244
  recursive: true,
1215
1245
  force: true
1216
1246
  });
@@ -1241,15 +1271,15 @@ var require_dist = __commonJS({
1241
1271
  const dir = devUploadsDir(this.rootDir());
1242
1272
  let entries;
1243
1273
  try {
1244
- entries = fs4.readdirSync(dir);
1274
+ entries = fs5.readdirSync(dir);
1245
1275
  } catch {
1246
1276
  return;
1247
1277
  }
1248
1278
  const graveyard = path5.join(dir, ".sweeping");
1249
1279
  try {
1250
- for (const residue of fs4.readdirSync(graveyard)) {
1280
+ for (const residue of fs5.readdirSync(graveyard)) {
1251
1281
  try {
1252
- fs4.rmSync(path5.join(graveyard, residue), {
1282
+ fs5.rmSync(path5.join(graveyard, residue), {
1253
1283
  recursive: true,
1254
1284
  force: true
1255
1285
  });
@@ -1264,13 +1294,13 @@ var require_dist = __commonJS({
1264
1294
  ].sort((a, b) => (devChannelEpoch(b) ?? -1) - (devChannelEpoch(a) ?? -1));
1265
1295
  const doomed = byNewestFirst.slice(keepCount);
1266
1296
  if (doomed.length === 0) return;
1267
- fs4.mkdirSync(graveyard, {
1297
+ fs5.mkdirSync(graveyard, {
1268
1298
  recursive: true
1269
1299
  });
1270
1300
  for (const entry of doomed) {
1271
1301
  const aside = path5.join(graveyard, `${entry}-${this.now()}`);
1272
1302
  try {
1273
- fs4.renameSync(path5.join(dir, entry), aside);
1303
+ fs5.renameSync(path5.join(dir, entry), aside);
1274
1304
  } catch (err) {
1275
1305
  this.logger.warn("failed to move dev-uploads entry aside for sweep", {
1276
1306
  meta: {
@@ -1281,7 +1311,7 @@ var require_dist = __commonJS({
1281
1311
  continue;
1282
1312
  }
1283
1313
  try {
1284
- fs4.rmSync(aside, {
1314
+ fs5.rmSync(aside, {
1285
1315
  recursive: true,
1286
1316
  force: true
1287
1317
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/server",
3
- "version": "1.1.61",
3
+ "version": "1.1.63",
4
4
  "private": false,
5
5
  "files": [
6
6
  "dist",
@@ -23,19 +23,19 @@
23
23
  "test:watch": "vitest"
24
24
  },
25
25
  "dependencies": {
26
- "@camstack/addon-admin-ui": "1.1.50",
27
- "@camstack/addon-advanced-notifier": "1.1.23",
28
- "@camstack/addon-auth": "1.1.8",
29
- "@camstack/addon-decoder-nodeav": "1.1.11",
30
- "@camstack/addon-notifiers": "1.1.23",
31
- "@camstack/addon-pipeline": "1.1.55",
32
- "@camstack/addon-pipeline-orchestrator": "1.1.45",
33
- "@camstack/addon-post-analysis": "1.1.27",
26
+ "@camstack/addon-admin-ui": "1.1.52",
27
+ "@camstack/addon-advanced-notifier": "1.1.24",
28
+ "@camstack/addon-auth": "1.1.9",
29
+ "@camstack/addon-decoder-nodeav": "1.1.12",
30
+ "@camstack/addon-notifiers": "1.1.24",
31
+ "@camstack/addon-pipeline": "1.1.57",
32
+ "@camstack/addon-pipeline-orchestrator": "1.1.46",
33
+ "@camstack/addon-post-analysis": "1.1.29",
34
34
  "@camstack/sdk": "1.1.24",
35
35
  "@camstack/shm-ring": "1.0.23",
36
- "@camstack/system": "1.1.48",
37
- "@camstack/types": "1.1.43",
38
- "@camstack/ui-library": "1.1.35",
36
+ "@camstack/system": "1.1.50",
37
+ "@camstack/types": "1.1.45",
38
+ "@camstack/ui-library": "1.1.36",
39
39
  "@fastify/compress": "^9.0.0",
40
40
  "@fastify/cookie": "^11.0.2",
41
41
  "@fastify/multipart": "^10.0.0",