Compare commits
7
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eb38d91c1b | ||
|
|
6e591d5588 | ||
|
|
4a0eec33d8 | ||
|
|
d6434efc28 | ||
|
|
ccb48afc04 | ||
|
|
e4e5c1f175 | ||
|
|
1b91e21d49 |
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"version": 1,
|
||||
"sourceRepo": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos",
|
||||
"sourceCommit": "806ea0e9f41340acf119b7374f5150ef5b378074",
|
||||
"sourceCommit": "358e649a7d70828db2ef96d5fed18931e48bc498",
|
||||
"sourcePath": "quixos-instance/quixos-nix-helpers",
|
||||
"exportName": "quixos-nix-helpers",
|
||||
"mirrorRemote": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-nix-helpers.git"
|
||||
|
||||
+34
-1
@@ -1,5 +1,11 @@
|
||||
# Checked capability and component artifacts
|
||||
|
||||
This is the **current helper/output format**, not the core package abstraction.
|
||||
See [the architecture](../../docs/ARCHITECTURE.md) and
|
||||
[current gaps](../../docs/ARCHITECTURE_STATUS.md). In particular, the universal
|
||||
artifact inventory and component-only omission of a server are implementation
|
||||
gaps to resolve, not requirements for arbitrary package servers.
|
||||
|
||||
`mkCaminoArtifacts` is the fresh package builder. It regenerates candidate
|
||||
bindings, typechecks the entry's dependency closure, bundles declared targets,
|
||||
generates a process service when requested, and emits content manifests and
|
||||
@@ -55,6 +61,25 @@ with their own versions. Authored source symlinks and non-bundled portable impor
|
||||
other than the SDK and server Node builtins are rejected. This is build closure
|
||||
checking, not a purity proof or security sandbox.
|
||||
|
||||
`mkCaminoYarnDependencies` installs the locked dependency recipe and exports its
|
||||
installed Node dependency tree, including native package results and executable
|
||||
links. Generated Yarn install/linker state stays outside runtime outputs. Yarn
|
||||
describes its install-state file as an optimization cache in its
|
||||
[configuration reference](https://yarnpkg.com/configuration/yarnrc#installStatePath).
|
||||
This helper output is a dependency directory for a build, not a standalone
|
||||
Package or a runnable Yarn project. Its `devShell` supplies freestanding Yarn for
|
||||
editable projects; do not run Yarn against the readonly dependency output.
|
||||
|
||||
Use the shared `installDependencies` assembly for consumers: authored libraries
|
||||
are copied into the consumer's `node_modules`, where Node can find their
|
||||
transitive dependencies, while selected SDK links retain their canonical type
|
||||
identity. Reserved SDK substitutions fail checks. Web Studio uses this same
|
||||
assembly rather than retaining a full Yarn project just to resolve UI libraries.
|
||||
Its dependency inputs contain manifests, lock and Yarn configuration/plugin
|
||||
recipe; ordinary Studio source edits do not enter that dependency derivation.
|
||||
Recipes with local/workspace dependencies must still include their needed source.
|
||||
This is language-specific build machinery; it adds no core Package file contract.
|
||||
|
||||
The core/Automerge bundle and Replicache bundle are built once. Browser modules
|
||||
import the core through a content-addressed gateway URL, independent of package
|
||||
identity. Each manifest covers the shared bytes it uses. The gateway retains its
|
||||
@@ -105,7 +130,7 @@ and supplies an explicit SDK for value codecs, identities and declared graph por
|
||||
service = {
|
||||
restricted = true;
|
||||
limits = {
|
||||
deadlineMs = 4000;
|
||||
deadlineMs = 10000;
|
||||
maxBytes = 1048576;
|
||||
maxPortCalls = 1000;
|
||||
maxQueued = 8;
|
||||
@@ -122,6 +147,14 @@ invocation identity; authored code cannot choose another frame or workspace.
|
||||
Native graph grants and transaction commit remain enforced by Camino outside
|
||||
the guest. Initialization and synchronous loops are subject to the same deadline.
|
||||
|
||||
The default root/Package Invocation wall deadline is 10 seconds. The separate
|
||||
root CPU allowance remains at most 4 CPU seconds; extra wall time accommodates
|
||||
queueing and graph-port waits. Ordinary graph database transactions and idle
|
||||
transactions allow 30 seconds, and ordinary client HTTP requests allow 45 seconds
|
||||
so server failures can be returned. Nested calls inherit the remaining root
|
||||
budget; explicit smaller limits still apply. Restore/activation jobs retain their
|
||||
separate budgets. These defaults are starting limits, not latency targets.
|
||||
|
||||
Direct network access, native filesystem imports, ambient clock and entropy,
|
||||
parent environment credentials, and unlisted modules are denied. Explicit dates,
|
||||
`Intl.Segmenter`, deterministic hashes and normal JavaScript computation remain
|
||||
|
||||
@@ -108,7 +108,7 @@ export async function serveRestrictedRegistry(config, io = process) {
|
||||
const limits = {
|
||||
maxBytes: config.maxBytes ?? 1024 * 1024,
|
||||
maxPortCalls: config.maxPortCalls ?? 1000,
|
||||
deadlineMs: config.deadlineMs ?? 4000,
|
||||
deadlineMs: config.deadlineMs ?? 10000,
|
||||
maxQueued: config.maxQueued ?? 8,
|
||||
maxActive: config.maxActive ?? 2,
|
||||
maxNested: config.maxNested ?? 4,
|
||||
@@ -239,15 +239,17 @@ export async function serveRestrictedRegistry(config, io = process) {
|
||||
}
|
||||
const engine = call.engine;
|
||||
if (engine) {
|
||||
// Revoke the frame token before returning an engine to the idle pool.
|
||||
// A delayed child request can never acquire the next call's authority.
|
||||
if (engine.current === call) engine.current = null;
|
||||
if (!stopped && reason.code === "INVOCATION_ENDED" && !usageFailure && !engine.destroying) {
|
||||
const rss = (await engineUsage(engine)).memoryBytes;
|
||||
metrics.peakRSSBytes = Math.max(metrics.peakRSSBytes, rss);
|
||||
// Bound retained engine heaps as well as lifetime. Hard aggregate
|
||||
// physical memory remains the supervising process/cgroup's contract.
|
||||
if (rss <= 128 * 1024 * 1024) {
|
||||
// Keep the lease busy through every await. Another artifact can evict
|
||||
// an idle lease immediately; never publish an engine still retiring
|
||||
// or one whose process died while its final usage read was pending.
|
||||
if (rss <= 128 * 1024 * 1024 && !stopped && !engine.destroying && engine.current === call) {
|
||||
// Revoke the frame token atomically with publishing idle capacity.
|
||||
engine.current = null;
|
||||
idleEngines.push(engine);
|
||||
engine.idleUntil = Date.now() + limits.engineIdleMs;
|
||||
engine.idleTimer = setTimeout(() => void destroyEngine(engine).catch(fail), limits.engineIdleMs);
|
||||
|
||||
@@ -686,3 +686,39 @@ test("the shared engine budget evicts idle code families and rejects busy oversu
|
||||
}
|
||||
assert.equal(engineBudget.stats().engines, 0);
|
||||
});
|
||||
|
||||
test("engine retirement accounting keeps its admission lease busy", async () => {
|
||||
const observations = [];
|
||||
let idle;
|
||||
const engineBudget = new RestrictedEngineBudget(1, async () => ({
|
||||
usage: async () => {
|
||||
observations.push(idle());
|
||||
await new Promise((done) => setImmediate(done));
|
||||
return { cpuMicroseconds: 0, memoryBytes: 1024 };
|
||||
},
|
||||
release: async () => {},
|
||||
}));
|
||||
const acquire = engineBudget.acquire.bind(engineBudget);
|
||||
engineBudget.acquire = (isIdle, evict) => {
|
||||
idle = isIdle;
|
||||
return acquire(isIdle, evict);
|
||||
};
|
||||
const f = await fixture(registry("return request.input;"), { engineBudget });
|
||||
try {
|
||||
f.start("first");
|
||||
assert.equal((await f.receive()).output, "first");
|
||||
assert.ok(observations.length > 0);
|
||||
assert.ok(
|
||||
observations.every((value) => !value),
|
||||
"An engine must not become evictable during asynchronous retirement accounting",
|
||||
);
|
||||
assert.equal(f.stats().idle, 1);
|
||||
assert.equal(idle(), true);
|
||||
f.start("second");
|
||||
assert.equal((await f.receive()).output, "second");
|
||||
assert.equal(f.stats().starts, 1);
|
||||
} finally {
|
||||
await f.close();
|
||||
}
|
||||
assert.equal(engineBudget.stats().engines, 0);
|
||||
});
|
||||
|
||||
@@ -13,6 +13,9 @@ let
|
||||
test -d node_modules
|
||||
mkdir -p "$out"
|
||||
cp -a node_modules/. "$out/"
|
||||
# Node resolves installed packages directly. This generated index is for
|
||||
# Yarn's linker, not a runtime input; do not export build-session state.
|
||||
rm -f "$out/.yarn-state.yml"
|
||||
runHook postInstall
|
||||
'';
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user