@xynogen/pix-runtime 0.8.1 → 0.8.2
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 +3 -2
- package/src/atomic-write.ts +35 -0
- package/src/index.ts +1 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xynogen/pix-runtime",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.2",
|
|
4
4
|
"description": "Pix shared runtime — versioned pix.json config, atomic persistence, typed change events",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/index.ts",
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
},
|
|
10
10
|
"files": [
|
|
11
11
|
"src",
|
|
12
|
-
"!src/**/*.test
|
|
12
|
+
"!src/**/*.test.*",
|
|
13
13
|
"README.md",
|
|
14
14
|
"DESIGN.md",
|
|
15
15
|
"LICENSE"
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
"exports": {
|
|
23
23
|
".": "./src/index.ts",
|
|
24
|
+
"./atomic-write": "./src/atomic-write.ts",
|
|
24
25
|
"./config": "./src/runtime.ts",
|
|
25
26
|
"./sections": "./src/sections/index.ts",
|
|
26
27
|
"./collapse": "./src/collapse.ts",
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* atomic-write.ts — write a file so readers never see a partial result.
|
|
3
|
+
*
|
|
4
|
+
* Writes to a unique sibling temp file, then renames over the target (rename is
|
|
5
|
+
* atomic on the same filesystem). A crash mid-write leaves the old file intact.
|
|
6
|
+
* Parent dirs are created.
|
|
7
|
+
*
|
|
8
|
+
* NOT a replacement for pix-runtime's ConfigStorage.writeAtomic, which adds a
|
|
9
|
+
* cross-process lock. Use this for plain single-writer files (per-tool JSON
|
|
10
|
+
* state, caches).
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { mkdirSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
14
|
+
import { dirname } from "node:path";
|
|
15
|
+
|
|
16
|
+
/** Atomically write `contents` to `target`. Mode defaults to 0o600. */
|
|
17
|
+
export function writeFileAtomicSync(
|
|
18
|
+
target: string,
|
|
19
|
+
contents: string | Uint8Array,
|
|
20
|
+
mode = 0o600,
|
|
21
|
+
): void {
|
|
22
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
23
|
+
const tmp = `${target}.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2)}.tmp`;
|
|
24
|
+
try {
|
|
25
|
+
writeFileSync(tmp, contents, { mode });
|
|
26
|
+
renameSync(tmp, target);
|
|
27
|
+
} catch (err) {
|
|
28
|
+
try {
|
|
29
|
+
rmSync(tmp, { force: true });
|
|
30
|
+
} catch {
|
|
31
|
+
/* best-effort cleanup */
|
|
32
|
+
}
|
|
33
|
+
throw err;
|
|
34
|
+
}
|
|
35
|
+
}
|
package/src/index.ts
CHANGED