@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.
- package/dist/api/core/auth.router.js +15 -2
- package/dist/api/trpc/client-ip.js +132 -29
- package/dist/api/trpc/generated-cap-mounts.js +26 -1
- package/dist/api/trpc/generated-cap-routers.js +1179 -750
- package/dist/api/trpc/trpc.router.js +81 -17
- package/dist/core/addon/addon-registry.service.js +183 -59
- package/dist/core/addon/runner-convergence.js +62 -0
- package/dist/main.js +8 -1
- package/dist/server-root/index.js +89 -59
- package/package.json +12 -12
|
@@ -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
|
|
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
|
|
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
|
|
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(
|
|
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:
|
|
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 (!
|
|
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
|
-
|
|
959
|
+
fs5.mkdirSync(vDir, {
|
|
930
960
|
recursive: true
|
|
931
961
|
});
|
|
932
962
|
const stagingDir = path5.join(vDir, `.staging-${target}-${process.pid}-${this.now()}`);
|
|
933
|
-
|
|
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 (
|
|
947
|
-
|
|
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
|
-
|
|
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 (!
|
|
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 (
|
|
1008
|
+
if (fs5.existsSync(dest)) {
|
|
979
1009
|
const aside = `${dest}.evicted-${this.now()}`;
|
|
980
|
-
await
|
|
981
|
-
await
|
|
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
|
|
1016
|
+
await fs5.promises.rename(stagingDir, dest);
|
|
987
1017
|
} catch (err) {
|
|
988
|
-
await
|
|
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 (!
|
|
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 =
|
|
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() -
|
|
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
|
-
|
|
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 =
|
|
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
|
|
1280
|
+
for (const residue of fs5.readdirSync(graveyard)) {
|
|
1251
1281
|
try {
|
|
1252
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
27
|
-
"@camstack/addon-advanced-notifier": "1.1.
|
|
28
|
-
"@camstack/addon-auth": "1.1.
|
|
29
|
-
"@camstack/addon-decoder-nodeav": "1.1.
|
|
30
|
-
"@camstack/addon-notifiers": "1.1.
|
|
31
|
-
"@camstack/addon-pipeline": "1.1.
|
|
32
|
-
"@camstack/addon-pipeline-orchestrator": "1.1.
|
|
33
|
-
"@camstack/addon-post-analysis": "1.1.
|
|
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.
|
|
37
|
-
"@camstack/types": "1.1.
|
|
38
|
-
"@camstack/ui-library": "1.1.
|
|
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",
|