pyfig 0.3.0 → 0.4.0
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/README.md +112 -121
- package/SECURITY.md +1 -1
- package/dist/cjs/index.js +469 -871
- package/dist/cjs/index.js.map +14 -15
- package/dist/cjs/sync-resolver.js +426 -657
- package/dist/cjs/sync-resolver.js.map +12 -12
- package/dist/cli.js +5 -8
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +3 -8
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +13 -11
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +4 -13
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +7 -51
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +5 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/dist/package-target.d.ts +7 -11
- package/dist/package-target.d.ts.map +1 -1
- package/dist/package-target.js +41 -57
- package/dist/package-target.js.map +1 -1
- package/dist/probes.d.ts +0 -18
- package/dist/probes.d.ts.map +1 -1
- package/dist/probes.js +0 -70
- package/dist/probes.js.map +1 -1
- package/dist/process.d.ts +1 -1
- package/dist/process.d.ts.map +1 -1
- package/dist/process.js +2 -1
- package/dist/process.js.map +1 -1
- package/dist/project-root.d.ts +1 -1
- package/dist/project-root.d.ts.map +1 -1
- package/dist/project-root.js +3 -64
- package/dist/project-root.js.map +1 -1
- package/dist/provision-lock.d.ts +10 -0
- package/dist/provision-lock.d.ts.map +1 -0
- package/dist/provision-lock.js +24 -0
- package/dist/provision-lock.js.map +1 -0
- package/dist/provision.d.ts +18 -6
- package/dist/provision.d.ts.map +1 -1
- package/dist/provision.js +273 -228
- package/dist/provision.js.map +1 -1
- package/dist/runners.d.ts +3 -7
- package/dist/runners.d.ts.map +1 -1
- package/dist/runners.js +35 -115
- package/dist/runners.js.map +1 -1
- package/dist/sync-resolver.js +4 -13
- package/dist/sync-resolver.js.map +1 -1
- package/dist/virtual-environment.d.ts +3 -1
- package/dist/virtual-environment.d.ts.map +1 -1
- package/dist/virtual-environment.js +8 -1
- package/dist/virtual-environment.js.map +1 -1
- package/package.json +6 -8
- package/dist/coordination.d.ts +0 -25
- package/dist/coordination.d.ts.map +0 -1
- package/dist/coordination.js +0 -187
- package/dist/coordination.js.map +0 -1
- package/dist/state.d.ts +0 -10
- package/dist/state.d.ts.map +0 -1
- package/dist/state.js +0 -62
- package/dist/state.js.map +0 -1
package/dist/coordination.js
DELETED
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
import { createHash } from 'node:crypto';
|
|
2
|
-
import { spawn } from 'node:child_process';
|
|
3
|
-
import { mkdir } from 'node:fs/promises';
|
|
4
|
-
import path from 'node:path';
|
|
5
|
-
import * as workerThreads from 'node:worker_threads';
|
|
6
|
-
import lockfile from 'proper-lockfile';
|
|
7
|
-
import { resolveExecutable } from './process.js';
|
|
8
|
-
const realmMutexTails = new Map();
|
|
9
|
-
const flockLookups = new Map();
|
|
10
|
-
const FLOCK_READY = 'PYFIG_FLOCK_READY';
|
|
11
|
-
const FLOCK_HOLDER = [
|
|
12
|
-
`process.stdout.write('${FLOCK_READY}\\n')`,
|
|
13
|
-
'process.stdin.resume()',
|
|
14
|
-
'process.stdin.once("end",()=>process.exit(0))',
|
|
15
|
-
].join(';');
|
|
16
|
-
/**
|
|
17
|
-
* Apply check-lock-check around an idempotent provisioning mutation. The lock
|
|
18
|
-
* stack is ordered identically everywhere to prevent lock-order inversions.
|
|
19
|
-
*/
|
|
20
|
-
export async function withProvisioningLock(options) {
|
|
21
|
-
const existing = await options.check();
|
|
22
|
-
if (existing !== null)
|
|
23
|
-
return existing;
|
|
24
|
-
return withResourceLock(options, async (signal) => {
|
|
25
|
-
const rechecked = await options.check();
|
|
26
|
-
return rechecked ?? options.mutate(signal);
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Serialize a resource in the current realm, across supported Node workers,
|
|
31
|
-
* through native flock when present, and finally through a portable file lease.
|
|
32
|
-
*/
|
|
33
|
-
export async function withResourceLock(options, operation) {
|
|
34
|
-
await mkdir(options.target, { recursive: true });
|
|
35
|
-
return withRealmMutex(options.key, () => withWorkerLock(options, () => withNativeFlock(options, () => withPortableLease(options, operation))));
|
|
36
|
-
}
|
|
37
|
-
async function withRealmMutex(key, operation) {
|
|
38
|
-
const previous = realmMutexTails.get(key) ?? Promise.resolve();
|
|
39
|
-
let releaseGate;
|
|
40
|
-
const gate = new Promise((resolve) => {
|
|
41
|
-
releaseGate = resolve;
|
|
42
|
-
});
|
|
43
|
-
const tail = previous.catch(() => undefined).then(() => gate);
|
|
44
|
-
realmMutexTails.set(key, tail);
|
|
45
|
-
await previous.catch(() => undefined);
|
|
46
|
-
try {
|
|
47
|
-
return await operation();
|
|
48
|
-
}
|
|
49
|
-
finally {
|
|
50
|
-
releaseGate();
|
|
51
|
-
if (realmMutexTails.get(key) === tail)
|
|
52
|
-
realmMutexTails.delete(key);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
async function withWorkerLock(options, operation) {
|
|
56
|
-
const manager = workerThreads.locks;
|
|
57
|
-
if (!manager?.request)
|
|
58
|
-
return operation();
|
|
59
|
-
const controller = new AbortController();
|
|
60
|
-
const timeout = setTimeout(() => controller.abort(new Error(`Timed out waiting for worker lock ${options.key}.`)), options.timeoutMs);
|
|
61
|
-
let entered = false;
|
|
62
|
-
try {
|
|
63
|
-
return await manager.request(workerLockName(options.key), { mode: 'exclusive', signal: controller.signal }, async () => {
|
|
64
|
-
entered = true;
|
|
65
|
-
return operation();
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
catch (error) {
|
|
69
|
-
// Worker locks are an optimization on runtimes that expose the experimental
|
|
70
|
-
// API. The portable lease remains authoritative when acquisition is absent.
|
|
71
|
-
if (entered)
|
|
72
|
-
throw error;
|
|
73
|
-
return operation();
|
|
74
|
-
}
|
|
75
|
-
finally {
|
|
76
|
-
clearTimeout(timeout);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
async function withNativeFlock(options, operation) {
|
|
80
|
-
if (process.platform === 'win32')
|
|
81
|
-
return operation();
|
|
82
|
-
// Coordination helpers belong to the host runtime, not the child discovery
|
|
83
|
-
// environment, which callers may intentionally strip of Python and uv paths.
|
|
84
|
-
const executable = await findFlock(process.env);
|
|
85
|
-
if (!executable)
|
|
86
|
-
return operation();
|
|
87
|
-
const child = await acquireFlock(executable, `${options.target}.flock`, options.timeoutMs);
|
|
88
|
-
if (!child)
|
|
89
|
-
return operation();
|
|
90
|
-
try {
|
|
91
|
-
return await operation();
|
|
92
|
-
}
|
|
93
|
-
finally {
|
|
94
|
-
await releaseFlock(child);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
async function findFlock(env) {
|
|
98
|
-
const lookupKey = `${env['PATH'] ?? ''}\0${env['PATHEXT'] ?? ''}`;
|
|
99
|
-
let lookup = flockLookups.get(lookupKey);
|
|
100
|
-
if (!lookup) {
|
|
101
|
-
lookup = resolveExecutable('flock', env);
|
|
102
|
-
flockLookups.set(lookupKey, lookup);
|
|
103
|
-
}
|
|
104
|
-
return lookup;
|
|
105
|
-
}
|
|
106
|
-
async function acquireFlock(executable, lockPath, timeoutMs) {
|
|
107
|
-
const waitSeconds = Math.max(1, Math.ceil(Math.min(timeoutMs, 30_000) / 1000));
|
|
108
|
-
const child = spawn(executable, ['-x', '-w', String(waitSeconds), lockPath, process.execPath, '-e', FLOCK_HOLDER], { stdio: ['pipe', 'pipe', 'pipe'], windowsHide: true });
|
|
109
|
-
child.stderr.resume();
|
|
110
|
-
let output = '';
|
|
111
|
-
const acquired = await new Promise((resolve) => {
|
|
112
|
-
let settled = false;
|
|
113
|
-
const finish = (value) => {
|
|
114
|
-
if (settled)
|
|
115
|
-
return;
|
|
116
|
-
settled = true;
|
|
117
|
-
clearTimeout(timer);
|
|
118
|
-
resolve(value);
|
|
119
|
-
};
|
|
120
|
-
const timer = setTimeout(() => finish(false), Math.min(timeoutMs, 30_000) + 5_000);
|
|
121
|
-
child.once('error', () => finish(false));
|
|
122
|
-
child.once('exit', () => finish(false));
|
|
123
|
-
child.stdout.setEncoding('utf8');
|
|
124
|
-
child.stdout.on('data', (chunk) => {
|
|
125
|
-
output += chunk;
|
|
126
|
-
if (output.includes(FLOCK_READY))
|
|
127
|
-
finish(true);
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
-
if (acquired)
|
|
131
|
-
return child;
|
|
132
|
-
child.kill();
|
|
133
|
-
return null;
|
|
134
|
-
}
|
|
135
|
-
async function releaseFlock(child) {
|
|
136
|
-
if (child.exitCode !== null)
|
|
137
|
-
return;
|
|
138
|
-
child.stdin.end();
|
|
139
|
-
await new Promise((resolve) => {
|
|
140
|
-
const timer = setTimeout(() => {
|
|
141
|
-
child.kill();
|
|
142
|
-
resolve();
|
|
143
|
-
}, 5_000);
|
|
144
|
-
child.once('exit', () => {
|
|
145
|
-
clearTimeout(timer);
|
|
146
|
-
resolve();
|
|
147
|
-
});
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
async function withPortableLease(options, operation) {
|
|
151
|
-
const controller = new AbortController();
|
|
152
|
-
let compromised = null;
|
|
153
|
-
const retryIntervalMs = 500;
|
|
154
|
-
const release = await lockfile.lock(options.target, {
|
|
155
|
-
realpath: true,
|
|
156
|
-
stale: 120_000,
|
|
157
|
-
update: 15_000,
|
|
158
|
-
retries: {
|
|
159
|
-
retries: Math.ceil(options.timeoutMs / retryIntervalMs),
|
|
160
|
-
factor: 1,
|
|
161
|
-
minTimeout: retryIntervalMs,
|
|
162
|
-
maxTimeout: retryIntervalMs,
|
|
163
|
-
},
|
|
164
|
-
onCompromised: (error) => {
|
|
165
|
-
compromised = error;
|
|
166
|
-
controller.abort(error);
|
|
167
|
-
},
|
|
168
|
-
});
|
|
169
|
-
try {
|
|
170
|
-
const result = await operation(controller.signal);
|
|
171
|
-
if (compromised)
|
|
172
|
-
throw compromised;
|
|
173
|
-
return result;
|
|
174
|
-
}
|
|
175
|
-
finally {
|
|
176
|
-
controller.abort();
|
|
177
|
-
await release();
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
function workerLockName(key) {
|
|
181
|
-
return `pyfig:${createHash('sha256').update(key).digest('hex')}`;
|
|
182
|
-
}
|
|
183
|
-
/** Create a canonical lock target below a configured cache directory. */
|
|
184
|
-
export function cacheLockTarget(cacheDirectory, name) {
|
|
185
|
-
return path.join(cacheDirectory, 'locks', name);
|
|
186
|
-
}
|
|
187
|
-
//# sourceMappingURL=coordination.js.map
|
package/dist/coordination.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"coordination.js","sourceRoot":"","sources":["../src/coordination.ts"],"names":[],"mappings":"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"}
|
package/dist/state.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Share expensive resolution work within one JavaScript realm without treating
|
|
3
|
-
* cached filesystem state as permanent truth.
|
|
4
|
-
*/
|
|
5
|
-
export declare function memoizeAsync<T>(namespace: string, key: string, ttlMs: number, validate: (value: T) => boolean | Promise<boolean>, load: () => Promise<T>): Promise<T>;
|
|
6
|
-
/** Synchronous counterpart used by spawnSync bridges in the caller realm. */
|
|
7
|
-
export declare function memoizeSync<T>(namespace: string, key: string, ttlMs: number, validate: (value: T) => boolean, load: () => T): T;
|
|
8
|
-
/** Clear completed and in-flight lookup references after external toolchain changes. */
|
|
9
|
-
export declare function clearPyfigCaches(): void;
|
|
10
|
-
//# sourceMappingURL=state.d.ts.map
|
package/dist/state.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EAClD,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACrB,OAAO,CAAC,CAAC,CAAC,CA0BZ;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,CAAC,EAC3B,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,EAC/B,IAAI,EAAE,MAAM,CAAC,GACZ,CAAC,CAcH;AAED,wFAAwF;AACxF,wBAAgB,gBAAgB,IAAI,IAAI,CAIvC"}
|
package/dist/state.js
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
const completed = new Map();
|
|
2
|
-
const inFlight = new Map();
|
|
3
|
-
let cacheGeneration = 0;
|
|
4
|
-
/**
|
|
5
|
-
* Share expensive resolution work within one JavaScript realm without treating
|
|
6
|
-
* cached filesystem state as permanent truth.
|
|
7
|
-
*/
|
|
8
|
-
export async function memoizeAsync(namespace, key, ttlMs, validate, load) {
|
|
9
|
-
const cacheKey = `${namespace}\0${key}`;
|
|
10
|
-
const cached = completed.get(cacheKey);
|
|
11
|
-
if (cached && cached.expiresAt >= Date.now()) {
|
|
12
|
-
try {
|
|
13
|
-
if (await validate(cached.value))
|
|
14
|
-
return cached.value;
|
|
15
|
-
}
|
|
16
|
-
catch {
|
|
17
|
-
// Invalid or inaccessible external state is refreshed below.
|
|
18
|
-
}
|
|
19
|
-
completed.delete(cacheKey);
|
|
20
|
-
}
|
|
21
|
-
const pending = inFlight.get(cacheKey);
|
|
22
|
-
if (pending)
|
|
23
|
-
return pending;
|
|
24
|
-
const generation = cacheGeneration;
|
|
25
|
-
const loading = load().then((value) => {
|
|
26
|
-
if (ttlMs > 0 && generation === cacheGeneration) {
|
|
27
|
-
completed.set(cacheKey, { expiresAt: Date.now() + ttlMs, value });
|
|
28
|
-
}
|
|
29
|
-
return value;
|
|
30
|
-
}).finally(() => {
|
|
31
|
-
if (inFlight.get(cacheKey) === loading)
|
|
32
|
-
inFlight.delete(cacheKey);
|
|
33
|
-
});
|
|
34
|
-
inFlight.set(cacheKey, loading);
|
|
35
|
-
return loading;
|
|
36
|
-
}
|
|
37
|
-
/** Synchronous counterpart used by spawnSync bridges in the caller realm. */
|
|
38
|
-
export function memoizeSync(namespace, key, ttlMs, validate, load) {
|
|
39
|
-
const cacheKey = `${namespace}\0${key}`;
|
|
40
|
-
const cached = completed.get(cacheKey);
|
|
41
|
-
if (cached && cached.expiresAt >= Date.now()) {
|
|
42
|
-
try {
|
|
43
|
-
if (validate(cached.value))
|
|
44
|
-
return cached.value;
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
// Refresh invalid external state below.
|
|
48
|
-
}
|
|
49
|
-
completed.delete(cacheKey);
|
|
50
|
-
}
|
|
51
|
-
const value = load();
|
|
52
|
-
if (ttlMs > 0)
|
|
53
|
-
completed.set(cacheKey, { expiresAt: Date.now() + ttlMs, value });
|
|
54
|
-
return value;
|
|
55
|
-
}
|
|
56
|
-
/** Clear completed and in-flight lookup references after external toolchain changes. */
|
|
57
|
-
export function clearPyfigCaches() {
|
|
58
|
-
cacheGeneration += 1;
|
|
59
|
-
completed.clear();
|
|
60
|
-
inFlight.clear();
|
|
61
|
-
}
|
|
62
|
-
//# sourceMappingURL=state.js.map
|
package/dist/state.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAKA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAsB,CAAC;AAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;AACrD,IAAI,eAAe,GAAG,CAAC,CAAC;AAExB;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,SAAiB,EACjB,GAAW,EACX,KAAa,EACb,QAAkD,EAClD,IAAsB;IAEtB,MAAM,QAAQ,GAAG,GAAG,SAAS,KAAK,GAAG,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,IAAI,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAU,CAAC;gBAAE,OAAO,MAAM,CAAC,KAAU,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,6DAA6D;QAC/D,CAAC;QACD,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,OAAO;QAAE,OAAO,OAAqB,CAAC;IAE1C,MAAM,UAAU,GAAG,eAAe,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QACpC,IAAI,KAAK,GAAG,CAAC,IAAI,UAAU,KAAK,eAAe,EAAE,CAAC;YAChD,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;QACd,IAAI,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,OAAO;YAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,WAAW,CACzB,SAAiB,EACjB,GAAW,EACX,KAAa,EACb,QAA+B,EAC/B,IAAa;IAEb,MAAM,QAAQ,GAAG,GAAG,SAAS,KAAK,GAAG,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAU,CAAC;gBAAE,OAAO,MAAM,CAAC,KAAU,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC;YACP,wCAAwC;QAC1C,CAAC;QACD,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC;IACrB,IAAI,KAAK,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACjF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,gBAAgB;IAC9B,eAAe,IAAI,CAAC,CAAC;IACrB,SAAS,CAAC,KAAK,EAAE,CAAC;IAClB,QAAQ,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC"}
|