@optimystic/db-p2p-storage-fs 0.22.0 → 0.24.1
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 +118 -118
- package/dist/src/file-storage.d.ts.map +1 -1
- package/dist/src/file-storage.js +13 -9
- package/dist/src/file-storage.js.map +1 -1
- package/package.json +3 -3
- package/src/atomic-write.ts +82 -82
- package/src/file-kv-store.ts +65 -65
- package/src/file-storage.ts +422 -418
- package/src/logger.ts +7 -7
package/README.md
CHANGED
|
@@ -1,118 +1,118 @@
|
|
|
1
|
-
# @optimystic/db-p2p-storage-fs
|
|
2
|
-
|
|
3
|
-
Node.js filesystem storage backend for Optimystic peers. Provides:
|
|
4
|
-
|
|
5
|
-
- **`FileRawStorage`** — implements `IRawStorage` so a Node peer persists block
|
|
6
|
-
metadata, revisions, pending transactions, committed transactions, and
|
|
7
|
-
materialized blocks durably across restarts.
|
|
8
|
-
- **`FileKVStore`** — implements `IKVStore` for the persistent transaction state
|
|
9
|
-
used to recover crashed two-phase commits.
|
|
10
|
-
|
|
11
|
-
This package targets plain Node.js. Use the sibling adapter for other
|
|
12
|
-
environments:
|
|
13
|
-
|
|
14
|
-
- `@optimystic/db-p2p-storage-ns` — NativeScript (iOS/Android, SQLite)
|
|
15
|
-
- `@optimystic/db-p2p-storage-rn` — React Native (MMKV)
|
|
16
|
-
- `@optimystic/db-p2p-storage-web` — Browser (IndexedDB)
|
|
17
|
-
|
|
18
|
-
## Install
|
|
19
|
-
|
|
20
|
-
```bash
|
|
21
|
-
yarn add @optimystic/db-p2p-storage-fs @optimystic/db-p2p @optimystic/db-core
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## Usage
|
|
25
|
-
|
|
26
|
-
```ts
|
|
27
|
-
import { FileRawStorage, FileKVStore } from '@optimystic/db-p2p-storage-fs';
|
|
28
|
-
import { createLibp2pNode } from '@optimystic/db-p2p';
|
|
29
|
-
|
|
30
|
-
const rawStorage = new FileRawStorage('/var/lib/my-peer/data');
|
|
31
|
-
const kvStore = new FileKVStore('/var/lib/my-peer/data');
|
|
32
|
-
|
|
33
|
-
const libp2p = await createLibp2pNode({
|
|
34
|
-
bootstrapNodes: [/* … */],
|
|
35
|
-
networkName: 'my-network',
|
|
36
|
-
rawStorage,
|
|
37
|
-
kvStore,
|
|
38
|
-
});
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
Both constructors take a single `basePath` — the directory under which all
|
|
42
|
-
data is stored. They can share the same `basePath` in practice because their
|
|
43
|
-
top-level names do not collide: block data lives under `<blockId>/`
|
|
44
|
-
subdirectories (block ids are content-address hashes), while KV data lives
|
|
45
|
-
under directories named by the first segment of each key (a `/`-separated key
|
|
46
|
-
becomes nested subdirectories — e.g. `coordinator/key1` → `coordinator/key1.json`).
|
|
47
|
-
Sharing is safe only as long as no block id equals a KV key's first segment;
|
|
48
|
-
give them separate `basePath`s if you cannot guarantee that.
|
|
49
|
-
|
|
50
|
-
## On-disk layout
|
|
51
|
-
|
|
52
|
-
```
|
|
53
|
-
<basePath>/
|
|
54
|
-
<blockId>/
|
|
55
|
-
meta.json — BlockMetadata (JSON)
|
|
56
|
-
revs/<rev>.json — ActionId for that revision number
|
|
57
|
-
pend/<id>.json — pending Transform (two-phase commit, before promotion)
|
|
58
|
-
actions/<id>.json — committed Transform
|
|
59
|
-
blocks/<id>.json — materialized IBlock snapshot
|
|
60
|
-
<key-segment>/
|
|
61
|
-
<key-segment>.json — FileKVStore value; key "/" separators become subdirectories
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
Action ids that contain a colon (e.g. `tx:abcd1234`) are percent-encoded in
|
|
65
|
-
filenames (`tx%3Aabcd1234.json`) for Windows compatibility; the storage layer
|
|
66
|
-
encodes and decodes transparently so callers always work with the canonical
|
|
67
|
-
id form.
|
|
68
|
-
|
|
69
|
-
## Atomic writes
|
|
70
|
-
|
|
71
|
-
Every write goes through `atomic-write.ts`: the new content is written to a
|
|
72
|
-
`.tmp` sibling, then renamed over the canonical path. A crash mid-write
|
|
73
|
-
therefore leaves either the complete old file or the complete new file — never
|
|
74
|
-
a partial/torn one.
|
|
75
|
-
|
|
76
|
-
## Identity
|
|
77
|
-
|
|
78
|
-
Unlike the `ns`/`rn`/`web` adapters, this package ships **no** identity module
|
|
79
|
-
and no `loadOrCreateFSPeerKey` helper. The reference peer that uses this adapter
|
|
80
|
-
does not persist its libp2p private key, so an fs-backed node gets a fresh
|
|
81
|
-
ephemeral peer id on every restart. Adding durable identity is a separate
|
|
82
|
-
feature — see Known limitations below.
|
|
83
|
-
|
|
84
|
-
## Tests
|
|
85
|
-
|
|
86
|
-
```bash
|
|
87
|
-
yarn test # mocha, minimal reporter
|
|
88
|
-
yarn test:verbose # mocha, spec reporter
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
Two layers run here, both over a per-test `fs.mkdtemp` fixture with `afterEach`
|
|
92
|
-
cleanup:
|
|
93
|
-
|
|
94
|
-
- **Shared conformance suite** — `runRawStorageConformance('FileSystem', …)` from
|
|
95
|
-
`@optimystic/db-p2p/testing/conformance`, the one cross-backend parity target. It proves the
|
|
96
|
-
fs backend (now `KvRawStorage` over a `FileStoreDriver`) behaves identically to
|
|
97
|
-
every other backend: round-trips, `listRevisions` ordering, promote atomicity +
|
|
98
|
-
the exact missing-pend error, clone-on-store/read (structural via the byte
|
|
99
|
-
boundary), drain-before-yield iteration, and a `BlockStorage` parity slice.
|
|
100
|
-
- **fs-only tests** (`node:assert`) — the behaviors the shared suite can't cover:
|
|
101
|
-
atomic writes + torn-file corruption tolerance, `readdir` error discrimination,
|
|
102
|
-
colon-encoded filenames + the POSIX legacy raw-colon fallback, the directory-based
|
|
103
|
-
`listBlockIds` meta-gate, and `FileKVStore.list`/`delete`.
|
|
104
|
-
|
|
105
|
-
## Known limitations
|
|
106
|
-
|
|
107
|
-
**No cross-process lock.** Two separate Node processes pointing at the same
|
|
108
|
-
`basePath` can interleave writes with no coordination. The constructor carries
|
|
109
|
-
a TODO (`file-storage.ts:52`) to integrate
|
|
110
|
-
[`proper-lockfile`](https://www.npmjs.com/package/proper-lockfile) along with
|
|
111
|
-
an explicit `dispose()` pattern. Until that lands, `FileRawStorage` is
|
|
112
|
-
single-process only.
|
|
113
|
-
|
|
114
|
-
**Ephemeral peer identity.** There is no `loadOrCreateFSPeerKey` equivalent.
|
|
115
|
-
A Node peer backed by `FileRawStorage` gets a new libp2p peer id each restart.
|
|
116
|
-
If your use case requires a stable, restart-surviving identity, a future
|
|
117
|
-
`feat-fs-peer-identity` feature should add the key-persistence helper — it is
|
|
118
|
-
deliberately out of scope here.
|
|
1
|
+
# @optimystic/db-p2p-storage-fs
|
|
2
|
+
|
|
3
|
+
Node.js filesystem storage backend for Optimystic peers. Provides:
|
|
4
|
+
|
|
5
|
+
- **`FileRawStorage`** — implements `IRawStorage` so a Node peer persists block
|
|
6
|
+
metadata, revisions, pending transactions, committed transactions, and
|
|
7
|
+
materialized blocks durably across restarts.
|
|
8
|
+
- **`FileKVStore`** — implements `IKVStore` for the persistent transaction state
|
|
9
|
+
used to recover crashed two-phase commits.
|
|
10
|
+
|
|
11
|
+
This package targets plain Node.js. Use the sibling adapter for other
|
|
12
|
+
environments:
|
|
13
|
+
|
|
14
|
+
- `@optimystic/db-p2p-storage-ns` — NativeScript (iOS/Android, SQLite)
|
|
15
|
+
- `@optimystic/db-p2p-storage-rn` — React Native (MMKV)
|
|
16
|
+
- `@optimystic/db-p2p-storage-web` — Browser (IndexedDB)
|
|
17
|
+
|
|
18
|
+
## Install
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
yarn add @optimystic/db-p2p-storage-fs @optimystic/db-p2p @optimystic/db-core
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Usage
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
import { FileRawStorage, FileKVStore } from '@optimystic/db-p2p-storage-fs';
|
|
28
|
+
import { createLibp2pNode } from '@optimystic/db-p2p';
|
|
29
|
+
|
|
30
|
+
const rawStorage = new FileRawStorage('/var/lib/my-peer/data');
|
|
31
|
+
const kvStore = new FileKVStore('/var/lib/my-peer/data');
|
|
32
|
+
|
|
33
|
+
const libp2p = await createLibp2pNode({
|
|
34
|
+
bootstrapNodes: [/* … */],
|
|
35
|
+
networkName: 'my-network',
|
|
36
|
+
rawStorage,
|
|
37
|
+
kvStore,
|
|
38
|
+
});
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Both constructors take a single `basePath` — the directory under which all
|
|
42
|
+
data is stored. They can share the same `basePath` in practice because their
|
|
43
|
+
top-level names do not collide: block data lives under `<blockId>/`
|
|
44
|
+
subdirectories (block ids are content-address hashes), while KV data lives
|
|
45
|
+
under directories named by the first segment of each key (a `/`-separated key
|
|
46
|
+
becomes nested subdirectories — e.g. `coordinator/key1` → `coordinator/key1.json`).
|
|
47
|
+
Sharing is safe only as long as no block id equals a KV key's first segment;
|
|
48
|
+
give them separate `basePath`s if you cannot guarantee that.
|
|
49
|
+
|
|
50
|
+
## On-disk layout
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
<basePath>/
|
|
54
|
+
<blockId>/
|
|
55
|
+
meta.json — BlockMetadata (JSON)
|
|
56
|
+
revs/<rev>.json — ActionId for that revision number
|
|
57
|
+
pend/<id>.json — pending Transform (two-phase commit, before promotion)
|
|
58
|
+
actions/<id>.json — committed Transform
|
|
59
|
+
blocks/<id>.json — materialized IBlock snapshot
|
|
60
|
+
<key-segment>/
|
|
61
|
+
<key-segment>.json — FileKVStore value; key "/" separators become subdirectories
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Action ids that contain a colon (e.g. `tx:abcd1234`) are percent-encoded in
|
|
65
|
+
filenames (`tx%3Aabcd1234.json`) for Windows compatibility; the storage layer
|
|
66
|
+
encodes and decodes transparently so callers always work with the canonical
|
|
67
|
+
id form.
|
|
68
|
+
|
|
69
|
+
## Atomic writes
|
|
70
|
+
|
|
71
|
+
Every write goes through `atomic-write.ts`: the new content is written to a
|
|
72
|
+
`.tmp` sibling, then renamed over the canonical path. A crash mid-write
|
|
73
|
+
therefore leaves either the complete old file or the complete new file — never
|
|
74
|
+
a partial/torn one.
|
|
75
|
+
|
|
76
|
+
## Identity
|
|
77
|
+
|
|
78
|
+
Unlike the `ns`/`rn`/`web` adapters, this package ships **no** identity module
|
|
79
|
+
and no `loadOrCreateFSPeerKey` helper. The reference peer that uses this adapter
|
|
80
|
+
does not persist its libp2p private key, so an fs-backed node gets a fresh
|
|
81
|
+
ephemeral peer id on every restart. Adding durable identity is a separate
|
|
82
|
+
feature — see Known limitations below.
|
|
83
|
+
|
|
84
|
+
## Tests
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
yarn test # mocha, minimal reporter
|
|
88
|
+
yarn test:verbose # mocha, spec reporter
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Two layers run here, both over a per-test `fs.mkdtemp` fixture with `afterEach`
|
|
92
|
+
cleanup:
|
|
93
|
+
|
|
94
|
+
- **Shared conformance suite** — `runRawStorageConformance('FileSystem', …)` from
|
|
95
|
+
`@optimystic/db-p2p/testing/conformance`, the one cross-backend parity target. It proves the
|
|
96
|
+
fs backend (now `KvRawStorage` over a `FileStoreDriver`) behaves identically to
|
|
97
|
+
every other backend: round-trips, `listRevisions` ordering, promote atomicity +
|
|
98
|
+
the exact missing-pend error, clone-on-store/read (structural via the byte
|
|
99
|
+
boundary), drain-before-yield iteration, and a `BlockStorage` parity slice.
|
|
100
|
+
- **fs-only tests** (`node:assert`) — the behaviors the shared suite can't cover:
|
|
101
|
+
atomic writes + torn-file corruption tolerance, `readdir` error discrimination,
|
|
102
|
+
colon-encoded filenames + the POSIX legacy raw-colon fallback, the directory-based
|
|
103
|
+
`listBlockIds` meta-gate, and `FileKVStore.list`/`delete`.
|
|
104
|
+
|
|
105
|
+
## Known limitations
|
|
106
|
+
|
|
107
|
+
**No cross-process lock.** Two separate Node processes pointing at the same
|
|
108
|
+
`basePath` can interleave writes with no coordination. The constructor carries
|
|
109
|
+
a TODO (`file-storage.ts:52`) to integrate
|
|
110
|
+
[`proper-lockfile`](https://www.npmjs.com/package/proper-lockfile) along with
|
|
111
|
+
an explicit `dispose()` pattern. Until that lands, `FileRawStorage` is
|
|
112
|
+
single-process only.
|
|
113
|
+
|
|
114
|
+
**Ephemeral peer identity.** There is no `loadOrCreateFSPeerKey` equivalent.
|
|
115
|
+
A Node peer backed by `FileRawStorage` gets a new libp2p peer id each restart.
|
|
116
|
+
If your use case requires a stable, restart-surviving identity, a future
|
|
117
|
+
`feat-fs-peer-identity` feature should add the key-persistence helper — it is
|
|
118
|
+
deliberately out of scope here.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-storage.d.ts","sourceRoot":"","sources":["../../src/file-storage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAsCvE;;;;;;;;;;;;GAYG;AACH,qBAAa,eAAgB,YAAW,cAAc;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM;IAMvC,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAI9D,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAe/D,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAI3E,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3E,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,aAAa,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAuBhH,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAOjF,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlF,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IASjE,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC;IA8ChE,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAOrF,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtF,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAOtF,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvF,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB3D,YAAY,IAAI,aAAa,CAAC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"file-storage.d.ts","sourceRoot":"","sources":["../../src/file-storage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAsCvE;;;;;;;;;;;;GAYG;AACH,qBAAa,eAAgB,YAAW,cAAc;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM;IAMvC,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAI9D,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAe/D,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAI3E,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3E,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,aAAa,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAuBhH,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAOjF,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlF,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IASjE,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC;IA8ChE,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAOrF,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtF,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAOtF,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvF,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB3D,YAAY,IAAI,aAAa,CAAC,OAAO,CAAC;IAgDvC,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;YAI/B,iBAAiB;IA6B/B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,mBAAmB;YASb,cAAc;YAsBd,qBAAqB;YAcrB,iBAAiB;CAc/B;AAED;;;;;;;;;;GAUG;AACH,qBAAa,cAAe,SAAQ,YAAY;IACvC,YAAY,EAAE,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IAC3C,uBAAuB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;gBAE3C,QAAQ,EAAE,MAAM;CAG5B"}
|
package/dist/src/file-storage.js
CHANGED
|
@@ -206,15 +206,19 @@ export class FileStoreDriver {
|
|
|
206
206
|
// so a stray file can't be mistaken for a block; `*.tmp` atomic-write orphans live inside
|
|
207
207
|
// block subdirs, never at basePath root, so the root is clean.
|
|
208
208
|
//
|
|
209
|
-
// A directory alone is NOT sufficient
|
|
210
|
-
//
|
|
211
|
-
//
|
|
212
|
-
//
|
|
213
|
-
//
|
|
214
|
-
//
|
|
215
|
-
//
|
|
216
|
-
//
|
|
217
|
-
//
|
|
209
|
+
// A directory alone is NOT sufficient: pending a transform straight through this driver
|
|
210
|
+
// creates `<blockId>/pend/` — hence a root directory entry — via atomicWriteFile's
|
|
211
|
+
// recursive mkdir, without writing meta.json. So we gate on meta.json existence:
|
|
212
|
+
// `meta.json` IS this backend's metadata store, so gating on it enumerates exactly the
|
|
213
|
+
// same population the metadata-keyed backends (sqlite/leveldb/indexeddb) get for free.
|
|
214
|
+
// That population is every block with ANY durable metadata — which on the node path
|
|
215
|
+
// INCLUDES a pend-only block, because `BlockStorage.savePendingTransaction` seeds
|
|
216
|
+
// metadata for a block that has none before storing the transform. Do not "improve" this
|
|
217
|
+
// into a committed-revision filter: reading and parsing every meta.json would turn a
|
|
218
|
+
// cheap access() sweep into a per-block read at startup (see the `listBlockIds` contract
|
|
219
|
+
// in i-raw-storage.ts). Existence (fs.access), not parse, matches key-existence
|
|
220
|
+
// semantics: a torn/corrupt meta.json still counts as a key, exactly as a corrupt value
|
|
221
|
+
// would in the other backends.
|
|
218
222
|
//
|
|
219
223
|
// ENOENT (basePath not created yet, or a dir without meta.json) maps to "not owned" —
|
|
220
224
|
// same discrimination as directoryByteSize. Any OTHER readdir/access error must surface:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-storage.js","sourceRoot":"","sources":["../../src/file-storage.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"file-storage.js","sourceRoot":"","sources":["../../src/file-storage.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@optimystic/db-p2p-storage-fs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.24.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Node.js filesystem storage backend for @optimystic/db-p2p",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
@@ -48,8 +48,8 @@
|
|
|
48
48
|
"typescript": "^5.9.3"
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@optimystic/db-core": "^0.
|
|
52
|
-
"@optimystic/db-p2p": "^0.
|
|
51
|
+
"@optimystic/db-core": "^0.24.1",
|
|
52
|
+
"@optimystic/db-p2p": "^0.24.1",
|
|
53
53
|
"debug": "^4.4.3"
|
|
54
54
|
}
|
|
55
55
|
}
|
package/src/atomic-write.ts
CHANGED
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
import { promises as fs } from 'fs';
|
|
2
|
-
import * as path from 'path';
|
|
3
|
-
|
|
4
|
-
// Per-process monotonic counter for unique temp names. Combined with the pid it
|
|
5
|
-
// makes each temp path unique across concurrent writers to the same logical
|
|
6
|
-
// target — even two FileRawStorage/FileKVStore instances in one process, which
|
|
7
|
-
// do not lock (see the proper-lockfile TODO in file-storage.ts). Deterministic
|
|
8
|
-
// and collision-safe, unlike Math.random()/Date.now().
|
|
9
|
-
let tempCounter = 0;
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Atomically write `content` to `filePath`.
|
|
13
|
-
*
|
|
14
|
-
* Writes to a unique `*.tmp` sibling, fsyncs the data, then renames it into
|
|
15
|
-
* place. `rename` over an existing file is atomic on POSIX and NTFS, so a
|
|
16
|
-
* concurrent reader only ever sees the complete old file or the complete new
|
|
17
|
-
* file — never a torn/half-written one. After the rename we best-effort fsync
|
|
18
|
-
* the containing directory so the rename itself survives power loss on POSIX;
|
|
19
|
-
* that directory fsync is unsupported on win32 and its error is swallowed.
|
|
20
|
-
*
|
|
21
|
-
* On any failure the temp file is removed (best-effort) so a crashed write does
|
|
22
|
-
* not leave the canonical path damaged. A crash *between* the temp write and the
|
|
23
|
-
* rename leaves only an inert `*.tmp` sibling — never read (reads target
|
|
24
|
-
* canonical paths) and skipped by `.json` directory scans.
|
|
25
|
-
*
|
|
26
|
-
* `content` is `string | Uint8Array`: `FileKVStore` writes strings, while the
|
|
27
|
-
* `KvRawStorage`-backed `FileStoreDriver` writes the kernel's raw value bytes.
|
|
28
|
-
* `FileHandle.writeFile` writes either losslessly — a `Uint8Array` is written
|
|
29
|
-
* byte-for-byte, so non-ASCII JSON round-trips exactly.
|
|
30
|
-
*/
|
|
31
|
-
export async function atomicWriteFile(filePath: string, content: string | Uint8Array): Promise<void> {
|
|
32
|
-
const dir = path.dirname(filePath);
|
|
33
|
-
await fs.mkdir(dir, { recursive: true });
|
|
34
|
-
|
|
35
|
-
// Suffix ends in `.tmp` (not `.json`) so listPendingTransactions / FileKVStore.list,
|
|
36
|
-
// which filter on `.json`, never surface an in-flight temp file.
|
|
37
|
-
// NOTE: a crash between open and rename leaves an inert `*.tmp` orphan (never read,
|
|
38
|
-
// skipped by `.json` scans). No cleanup sweep exists; if a crash-looping writer ever
|
|
39
|
-
// accumulates many, add a startup sweep of stale `*.tmp` siblings.
|
|
40
|
-
const tmpPath = path.join(dir, `${path.basename(filePath)}.${process.pid}.${tempCounter++}.tmp`);
|
|
41
|
-
|
|
42
|
-
let handle: fs.FileHandle | undefined;
|
|
43
|
-
try {
|
|
44
|
-
handle = await fs.open(tmpPath, 'w');
|
|
45
|
-
await handle.writeFile(content);
|
|
46
|
-
await handle.sync();
|
|
47
|
-
await handle.close();
|
|
48
|
-
handle = undefined;
|
|
49
|
-
// NOTE: on win32, rename-over-existing can throw EPERM/EACCES/EBUSY if a
|
|
50
|
-
// concurrent reader holds the target open without FILE_SHARE_DELETE (Node
|
|
51
|
-
// readIfExists/get open→read→close in a tiny window, so it's rare). Modern
|
|
52
|
-
// libuv retries some cases; if this ever surfaces as spurious write failures
|
|
53
|
-
// under concurrent read+write on Windows, add a bounded retry loop here (the
|
|
54
|
-
// write-file-atomic package does exactly this). Conditional — the adapter is
|
|
55
|
-
// already last-writer-wins with no cross-process lock (proper-lockfile TODO
|
|
56
|
-
// in file-storage.ts), so it is not reachable under current single-writer use.
|
|
57
|
-
await fs.rename(tmpPath, filePath);
|
|
58
|
-
} catch (err) {
|
|
59
|
-
if (handle) await handle.close().catch(() => { /* best-effort */ });
|
|
60
|
-
await fs.unlink(tmpPath).catch(() => { /* best-effort: temp may not exist */ });
|
|
61
|
-
throw err;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
await fsyncDir(dir);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Best-effort fsync of a directory so a completed rename is durable. POSIX needs
|
|
69
|
-
* this; win32 (and platforms that reject opening a directory for fsync) throw,
|
|
70
|
-
* and we ignore that rather than failing the write.
|
|
71
|
-
*/
|
|
72
|
-
async function fsyncDir(dir: string): Promise<void> {
|
|
73
|
-
let handle: fs.FileHandle | undefined;
|
|
74
|
-
try {
|
|
75
|
-
handle = await fs.open(dir, 'r');
|
|
76
|
-
await handle.sync();
|
|
77
|
-
} catch {
|
|
78
|
-
// Directory fsync unsupported here (e.g. win32) — nothing to do.
|
|
79
|
-
} finally {
|
|
80
|
-
if (handle) await handle.close().catch(() => { /* best-effort */ });
|
|
81
|
-
}
|
|
82
|
-
}
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
|
|
4
|
+
// Per-process monotonic counter for unique temp names. Combined with the pid it
|
|
5
|
+
// makes each temp path unique across concurrent writers to the same logical
|
|
6
|
+
// target — even two FileRawStorage/FileKVStore instances in one process, which
|
|
7
|
+
// do not lock (see the proper-lockfile TODO in file-storage.ts). Deterministic
|
|
8
|
+
// and collision-safe, unlike Math.random()/Date.now().
|
|
9
|
+
let tempCounter = 0;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Atomically write `content` to `filePath`.
|
|
13
|
+
*
|
|
14
|
+
* Writes to a unique `*.tmp` sibling, fsyncs the data, then renames it into
|
|
15
|
+
* place. `rename` over an existing file is atomic on POSIX and NTFS, so a
|
|
16
|
+
* concurrent reader only ever sees the complete old file or the complete new
|
|
17
|
+
* file — never a torn/half-written one. After the rename we best-effort fsync
|
|
18
|
+
* the containing directory so the rename itself survives power loss on POSIX;
|
|
19
|
+
* that directory fsync is unsupported on win32 and its error is swallowed.
|
|
20
|
+
*
|
|
21
|
+
* On any failure the temp file is removed (best-effort) so a crashed write does
|
|
22
|
+
* not leave the canonical path damaged. A crash *between* the temp write and the
|
|
23
|
+
* rename leaves only an inert `*.tmp` sibling — never read (reads target
|
|
24
|
+
* canonical paths) and skipped by `.json` directory scans.
|
|
25
|
+
*
|
|
26
|
+
* `content` is `string | Uint8Array`: `FileKVStore` writes strings, while the
|
|
27
|
+
* `KvRawStorage`-backed `FileStoreDriver` writes the kernel's raw value bytes.
|
|
28
|
+
* `FileHandle.writeFile` writes either losslessly — a `Uint8Array` is written
|
|
29
|
+
* byte-for-byte, so non-ASCII JSON round-trips exactly.
|
|
30
|
+
*/
|
|
31
|
+
export async function atomicWriteFile(filePath: string, content: string | Uint8Array): Promise<void> {
|
|
32
|
+
const dir = path.dirname(filePath);
|
|
33
|
+
await fs.mkdir(dir, { recursive: true });
|
|
34
|
+
|
|
35
|
+
// Suffix ends in `.tmp` (not `.json`) so listPendingTransactions / FileKVStore.list,
|
|
36
|
+
// which filter on `.json`, never surface an in-flight temp file.
|
|
37
|
+
// NOTE: a crash between open and rename leaves an inert `*.tmp` orphan (never read,
|
|
38
|
+
// skipped by `.json` scans). No cleanup sweep exists; if a crash-looping writer ever
|
|
39
|
+
// accumulates many, add a startup sweep of stale `*.tmp` siblings.
|
|
40
|
+
const tmpPath = path.join(dir, `${path.basename(filePath)}.${process.pid}.${tempCounter++}.tmp`);
|
|
41
|
+
|
|
42
|
+
let handle: fs.FileHandle | undefined;
|
|
43
|
+
try {
|
|
44
|
+
handle = await fs.open(tmpPath, 'w');
|
|
45
|
+
await handle.writeFile(content);
|
|
46
|
+
await handle.sync();
|
|
47
|
+
await handle.close();
|
|
48
|
+
handle = undefined;
|
|
49
|
+
// NOTE: on win32, rename-over-existing can throw EPERM/EACCES/EBUSY if a
|
|
50
|
+
// concurrent reader holds the target open without FILE_SHARE_DELETE (Node
|
|
51
|
+
// readIfExists/get open→read→close in a tiny window, so it's rare). Modern
|
|
52
|
+
// libuv retries some cases; if this ever surfaces as spurious write failures
|
|
53
|
+
// under concurrent read+write on Windows, add a bounded retry loop here (the
|
|
54
|
+
// write-file-atomic package does exactly this). Conditional — the adapter is
|
|
55
|
+
// already last-writer-wins with no cross-process lock (proper-lockfile TODO
|
|
56
|
+
// in file-storage.ts), so it is not reachable under current single-writer use.
|
|
57
|
+
await fs.rename(tmpPath, filePath);
|
|
58
|
+
} catch (err) {
|
|
59
|
+
if (handle) await handle.close().catch(() => { /* best-effort */ });
|
|
60
|
+
await fs.unlink(tmpPath).catch(() => { /* best-effort: temp may not exist */ });
|
|
61
|
+
throw err;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
await fsyncDir(dir);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Best-effort fsync of a directory so a completed rename is durable. POSIX needs
|
|
69
|
+
* this; win32 (and platforms that reject opening a directory for fsync) throw,
|
|
70
|
+
* and we ignore that rather than failing the write.
|
|
71
|
+
*/
|
|
72
|
+
async function fsyncDir(dir: string): Promise<void> {
|
|
73
|
+
let handle: fs.FileHandle | undefined;
|
|
74
|
+
try {
|
|
75
|
+
handle = await fs.open(dir, 'r');
|
|
76
|
+
await handle.sync();
|
|
77
|
+
} catch {
|
|
78
|
+
// Directory fsync unsupported here (e.g. win32) — nothing to do.
|
|
79
|
+
} finally {
|
|
80
|
+
if (handle) await handle.close().catch(() => { /* best-effort */ });
|
|
81
|
+
}
|
|
82
|
+
}
|