@xfcfam/xf-fs 0.1.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.
Files changed (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +107 -0
  3. package/dist/index.d.ts +48 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +43 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/src/api/A.d.ts +17 -0
  8. package/dist/src/api/A.d.ts.map +1 -0
  9. package/dist/src/api/A.js +17 -0
  10. package/dist/src/api/A.js.map +1 -0
  11. package/dist/src/business/B.d.ts +17 -0
  12. package/dist/src/business/B.d.ts.map +1 -0
  13. package/dist/src/business/B.js +17 -0
  14. package/dist/src/business/B.js.map +1 -0
  15. package/dist/src/repository/R.d.ts +17 -0
  16. package/dist/src/repository/R.d.ts.map +1 -0
  17. package/dist/src/repository/R.js +17 -0
  18. package/dist/src/repository/R.js.map +1 -0
  19. package/dist/src/repository/base/AuditedFileRepository.d.ts +86 -0
  20. package/dist/src/repository/base/AuditedFileRepository.d.ts.map +1 -0
  21. package/dist/src/repository/base/AuditedFileRepository.js +202 -0
  22. package/dist/src/repository/base/AuditedFileRepository.js.map +1 -0
  23. package/dist/src/repository/base/CachedFileRepository.d.ts +53 -0
  24. package/dist/src/repository/base/CachedFileRepository.d.ts.map +1 -0
  25. package/dist/src/repository/base/CachedFileRepository.js +107 -0
  26. package/dist/src/repository/base/CachedFileRepository.js.map +1 -0
  27. package/dist/src/repository/base/FileRepository.d.ts +170 -0
  28. package/dist/src/repository/base/FileRepository.d.ts.map +1 -0
  29. package/dist/src/repository/base/FileRepository.js +382 -0
  30. package/dist/src/repository/base/FileRepository.js.map +1 -0
  31. package/dist/src/repository/general/AuditedFileRepository.d.ts +86 -0
  32. package/dist/src/repository/general/AuditedFileRepository.d.ts.map +1 -0
  33. package/dist/src/repository/general/AuditedFileRepository.js +238 -0
  34. package/dist/src/repository/general/AuditedFileRepository.js.map +1 -0
  35. package/dist/src/repository/general/CachedFileRepository.d.ts +53 -0
  36. package/dist/src/repository/general/CachedFileRepository.d.ts.map +1 -0
  37. package/dist/src/repository/general/CachedFileRepository.js +107 -0
  38. package/dist/src/repository/general/CachedFileRepository.js.map +1 -0
  39. package/dist/src/repository/general/FileRepository.d.ts +180 -0
  40. package/dist/src/repository/general/FileRepository.d.ts.map +1 -0
  41. package/dist/src/repository/general/FileRepository.js +401 -0
  42. package/dist/src/repository/general/FileRepository.js.map +1 -0
  43. package/dist/src/repository/structs/DirectoryNotEmptyException.d.ts +13 -0
  44. package/dist/src/repository/structs/DirectoryNotEmptyException.d.ts.map +1 -0
  45. package/dist/src/repository/structs/DirectoryNotEmptyException.js +17 -0
  46. package/dist/src/repository/structs/DirectoryNotEmptyException.js.map +1 -0
  47. package/dist/src/repository/structs/FileAccessDeniedException.d.ts +14 -0
  48. package/dist/src/repository/structs/FileAccessDeniedException.d.ts.map +1 -0
  49. package/dist/src/repository/structs/FileAccessDeniedException.js +18 -0
  50. package/dist/src/repository/structs/FileAccessDeniedException.js.map +1 -0
  51. package/dist/src/repository/structs/FileEntry.d.ts +21 -0
  52. package/dist/src/repository/structs/FileEntry.d.ts.map +1 -0
  53. package/dist/src/repository/structs/FileEntry.js +2 -0
  54. package/dist/src/repository/structs/FileEntry.js.map +1 -0
  55. package/dist/src/repository/structs/FileNotFoundException.d.ts +13 -0
  56. package/dist/src/repository/structs/FileNotFoundException.d.ts.map +1 -0
  57. package/dist/src/repository/structs/FileNotFoundException.js +17 -0
  58. package/dist/src/repository/structs/FileNotFoundException.js.map +1 -0
  59. package/dist/src/repository/structs/FileStat.d.ts +24 -0
  60. package/dist/src/repository/structs/FileStat.d.ts.map +1 -0
  61. package/dist/src/repository/structs/FileStat.js +2 -0
  62. package/dist/src/repository/structs/FileStat.js.map +1 -0
  63. package/dist/src/repository/structs/TempFile.d.ts +19 -0
  64. package/dist/src/repository/structs/TempFile.d.ts.map +1 -0
  65. package/dist/src/repository/structs/TempFile.js +2 -0
  66. package/dist/src/repository/structs/TempFile.js.map +1 -0
  67. package/dist/src/repository/structs/WatchEvent.d.ts +18 -0
  68. package/dist/src/repository/structs/WatchEvent.d.ts.map +1 -0
  69. package/dist/src/repository/structs/WatchEvent.js +2 -0
  70. package/dist/src/repository/structs/WatchEvent.js.map +1 -0
  71. package/dist/src/repository/structs/Watcher.d.ts +18 -0
  72. package/dist/src/repository/structs/Watcher.d.ts.map +1 -0
  73. package/dist/src/repository/structs/Watcher.js +2 -0
  74. package/dist/src/repository/structs/Watcher.js.map +1 -0
  75. package/dist/src/repository/transfers/DirectoryNotEmptyException.d.ts +13 -0
  76. package/dist/src/repository/transfers/DirectoryNotEmptyException.d.ts.map +1 -0
  77. package/dist/src/repository/transfers/DirectoryNotEmptyException.js +17 -0
  78. package/dist/src/repository/transfers/DirectoryNotEmptyException.js.map +1 -0
  79. package/dist/src/repository/transfers/FileAccessDeniedException.d.ts +14 -0
  80. package/dist/src/repository/transfers/FileAccessDeniedException.d.ts.map +1 -0
  81. package/dist/src/repository/transfers/FileAccessDeniedException.js +18 -0
  82. package/dist/src/repository/transfers/FileAccessDeniedException.js.map +1 -0
  83. package/dist/src/repository/transfers/FileEntry.d.ts +21 -0
  84. package/dist/src/repository/transfers/FileEntry.d.ts.map +1 -0
  85. package/dist/src/repository/transfers/FileEntry.js +2 -0
  86. package/dist/src/repository/transfers/FileEntry.js.map +1 -0
  87. package/dist/src/repository/transfers/FileNotFoundException.d.ts +13 -0
  88. package/dist/src/repository/transfers/FileNotFoundException.d.ts.map +1 -0
  89. package/dist/src/repository/transfers/FileNotFoundException.js +17 -0
  90. package/dist/src/repository/transfers/FileNotFoundException.js.map +1 -0
  91. package/dist/src/repository/transfers/FileStat.d.ts +24 -0
  92. package/dist/src/repository/transfers/FileStat.d.ts.map +1 -0
  93. package/dist/src/repository/transfers/FileStat.js +2 -0
  94. package/dist/src/repository/transfers/FileStat.js.map +1 -0
  95. package/dist/src/repository/transfers/TempFile.d.ts +19 -0
  96. package/dist/src/repository/transfers/TempFile.d.ts.map +1 -0
  97. package/dist/src/repository/transfers/TempFile.js +2 -0
  98. package/dist/src/repository/transfers/TempFile.js.map +1 -0
  99. package/dist/src/repository/transfers/WatchEvent.d.ts +25 -0
  100. package/dist/src/repository/transfers/WatchEvent.d.ts.map +1 -0
  101. package/dist/src/repository/transfers/WatchEvent.js +2 -0
  102. package/dist/src/repository/transfers/WatchEvent.js.map +1 -0
  103. package/dist/src/repository/transfers/Watcher.d.ts +18 -0
  104. package/dist/src/repository/transfers/Watcher.d.ts.map +1 -0
  105. package/dist/src/repository/transfers/Watcher.js +2 -0
  106. package/dist/src/repository/transfers/Watcher.js.map +1 -0
  107. package/dist/src/repository/utils/EncodingUtils.d.ts +29 -0
  108. package/dist/src/repository/utils/EncodingUtils.d.ts.map +1 -0
  109. package/dist/src/repository/utils/EncodingUtils.js +36 -0
  110. package/dist/src/repository/utils/EncodingUtils.js.map +1 -0
  111. package/dist/src/repository/utils/PathUtils.d.ts +23 -0
  112. package/dist/src/repository/utils/PathUtils.d.ts.map +1 -0
  113. package/dist/src/repository/utils/PathUtils.js +53 -0
  114. package/dist/src/repository/utils/PathUtils.js.map +1 -0
  115. package/package.json +51 -0
@@ -0,0 +1,382 @@
1
+ import { Repository } from '@xfarch/xf';
2
+ import { promises as fsp, createReadStream, createWriteStream, watch as fsWatch } from 'node:fs';
3
+ import { Readable, Writable } from 'node:stream';
4
+ import { tmpdir } from 'node:os';
5
+ import { posix } from 'node:path';
6
+ import { randomBytes } from 'node:crypto';
7
+ import { FileNotFoundException } from '../structs/FileNotFoundException.js';
8
+ import { FileAccessDeniedException } from '../structs/FileAccessDeniedException.js';
9
+ import { DirectoryNotEmptyException } from '../structs/DirectoryNotEmptyException.js';
10
+ import { PathUtils } from '../utils/PathUtils.js';
11
+ /**
12
+ * Generalization for Access Layer components that operate on the
13
+ * local filesystem.
14
+ *
15
+ * The protocol is "local filesystem" — every method on this class is
16
+ * a syscall (or a tight wrapper over one) translated into the XF
17
+ * Transfer projection: file content as `string` / `Uint8Array`,
18
+ * metadata as {@link FileStat}, directory entries as
19
+ * {@link FileEntry}, change events as {@link WatchEvent}, and active
20
+ * handles as {@link Watcher} / {@link TempFile}.
21
+ *
22
+ * Concrete components extend this class to expose business-meaningful
23
+ * methods that compose the base operations (e.g. `loadProfile()`
24
+ * calls `this.read('/users/profile.json')` then `JSON.parse`).
25
+ *
26
+ * Errors raised by `node:fs` are translated into typed Exception
27
+ * components ({@link FileNotFoundException},
28
+ * {@link FileAccessDeniedException},
29
+ * {@link DirectoryNotEmptyException}) so the Business Layer never
30
+ * inspects `errno` strings. Other failures propagate as native
31
+ * `Error` (consistent with the XF doctrine that runtime exceptions
32
+ * are well-formed transfer vehicles).
33
+ *
34
+ * `terminate()` releases every still-active {@link Watcher} and
35
+ * deletes every still-open {@link TempFile}: even careless callers
36
+ * won't leak OS handles.
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * import { FileRepository } from '@xfarch/xf-fs'
41
+ * import type { User } from '../structs/User.js'
42
+ *
43
+ * export class UsersFileRepository extends FileRepository {
44
+ * constructor() { super({ rootPath: '/var/data/users' }) }
45
+ *
46
+ * async findById(id: string): Promise<User> {
47
+ * const text = await this.read(`${id}.json`)
48
+ * return JSON.parse(text) as User
49
+ * }
50
+ *
51
+ * async save(user: User): Promise<void> {
52
+ * await this.write(`${user.id}.json`, JSON.stringify(user))
53
+ * }
54
+ * }
55
+ * ```
56
+ */
57
+ export class FileRepository extends Repository {
58
+ constructor(options = {}) {
59
+ super({
60
+ rootPath: options.rootPath ?? process.cwd(),
61
+ openWatchers: new Set(),
62
+ openTempFiles: new Set(),
63
+ });
64
+ }
65
+ async init() { }
66
+ async terminate() {
67
+ // Close every still-active watcher.
68
+ for (const w of [...this.state.openWatchers]) {
69
+ try {
70
+ await w.close();
71
+ }
72
+ catch { /* swallow on shutdown */ }
73
+ }
74
+ // Delete every still-open temp file.
75
+ for (const t of [...this.state.openTempFiles]) {
76
+ try {
77
+ await t.close();
78
+ }
79
+ catch { /* swallow on shutdown */ }
80
+ }
81
+ }
82
+ // ─── Path resolution ──────────────────────────────────────
83
+ /**
84
+ * Resolve a path against `rootPath`. Absolute paths are returned
85
+ * unchanged (with separators normalised); relative paths are joined
86
+ * to the root.
87
+ */
88
+ resolve(path) {
89
+ const normalised = PathUtils.normalize(path);
90
+ if (PathUtils.isAbsolute(normalised))
91
+ return normalised;
92
+ return PathUtils.join(this.state.rootPath, normalised);
93
+ }
94
+ // ─── File operations ──────────────────────────────────────
95
+ /** Read a file as UTF-8 text. */
96
+ async read(path) {
97
+ const abs = this.resolve(path);
98
+ try {
99
+ return await fsp.readFile(abs, 'utf-8');
100
+ }
101
+ catch (err) {
102
+ throw this.translateError(err, abs);
103
+ }
104
+ }
105
+ /** Read a file as raw bytes. */
106
+ async readBytes(path) {
107
+ const abs = this.resolve(path);
108
+ try {
109
+ const buf = await fsp.readFile(abs);
110
+ return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
111
+ }
112
+ catch (err) {
113
+ throw this.translateError(err, abs);
114
+ }
115
+ }
116
+ /**
117
+ * Write `content` to `path`, overwriting any existing file.
118
+ * Parent directories must already exist; use `mkdir` first if not.
119
+ */
120
+ async write(path, content) {
121
+ const abs = this.resolve(path);
122
+ try {
123
+ await fsp.writeFile(abs, content);
124
+ }
125
+ catch (err) {
126
+ throw this.translateError(err, abs);
127
+ }
128
+ }
129
+ /** Append `content` to the end of `path` (creating it if absent). */
130
+ async append(path, content) {
131
+ const abs = this.resolve(path);
132
+ try {
133
+ await fsp.appendFile(abs, content);
134
+ }
135
+ catch (err) {
136
+ throw this.translateError(err, abs);
137
+ }
138
+ }
139
+ /** Delete the file at `path`. Throws {@link FileNotFoundException} if absent. */
140
+ async delete(path) {
141
+ const abs = this.resolve(path);
142
+ try {
143
+ await fsp.unlink(abs);
144
+ }
145
+ catch (err) {
146
+ throw this.translateError(err, abs);
147
+ }
148
+ }
149
+ /** Whether the path exists (file, directory, link, anything). */
150
+ async exists(path) {
151
+ const abs = this.resolve(path);
152
+ try {
153
+ await fsp.access(abs);
154
+ return true;
155
+ }
156
+ catch {
157
+ return false;
158
+ }
159
+ }
160
+ /** Stat `path`. Throws {@link FileNotFoundException} if absent. */
161
+ async stat(path) {
162
+ const abs = this.resolve(path);
163
+ try {
164
+ const s = await fsp.lstat(abs);
165
+ return {
166
+ path: abs,
167
+ size: s.size,
168
+ modifiedAt: s.mtime,
169
+ createdAt: s.birthtime ?? s.mtime,
170
+ isFile: s.isFile(),
171
+ isDirectory: s.isDirectory(),
172
+ isSymlink: s.isSymbolicLink(),
173
+ mode: s.mode,
174
+ };
175
+ }
176
+ catch (err) {
177
+ throw this.translateError(err, abs);
178
+ }
179
+ }
180
+ // ─── Directory operations ─────────────────────────────────
181
+ /** List immediate entries of a directory (not recursive). */
182
+ async list(path) {
183
+ const abs = this.resolve(path);
184
+ try {
185
+ const entries = await fsp.readdir(abs, { withFileTypes: true });
186
+ const out = [];
187
+ for (const e of entries) {
188
+ const full = PathUtils.join(abs, e.name);
189
+ out.push({
190
+ path: full,
191
+ relativePath: e.name,
192
+ name: e.name,
193
+ isFile: e.isFile(),
194
+ isDirectory: e.isDirectory(),
195
+ isSymlink: e.isSymbolicLink(),
196
+ });
197
+ }
198
+ out.sort((a, b) => a.name.localeCompare(b.name));
199
+ return out;
200
+ }
201
+ catch (err) {
202
+ throw this.translateError(err, abs);
203
+ }
204
+ }
205
+ /**
206
+ * Walk a directory recursively. Returns every regular file and
207
+ * directory under `path`. `relativePath` is computed relative to
208
+ * the walk root.
209
+ */
210
+ async walk(path) {
211
+ const root = this.resolve(path);
212
+ const out = [];
213
+ await this.walkInto(root, root, out);
214
+ out.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
215
+ return out;
216
+ }
217
+ async walkInto(current, root, out) {
218
+ let entries;
219
+ try {
220
+ entries = await fsp.readdir(current, { withFileTypes: true });
221
+ }
222
+ catch (err) {
223
+ throw this.translateError(err, current);
224
+ }
225
+ for (const e of entries) {
226
+ const full = PathUtils.join(current, e.name);
227
+ const rel = posix.relative(root, full);
228
+ out.push({
229
+ path: full,
230
+ relativePath: rel,
231
+ name: e.name,
232
+ isFile: e.isFile(),
233
+ isDirectory: e.isDirectory(),
234
+ isSymlink: e.isSymbolicLink(),
235
+ });
236
+ if (e.isDirectory())
237
+ await this.walkInto(full, root, out);
238
+ }
239
+ }
240
+ /** Create a directory. `recursive` creates intermediate parents. */
241
+ async mkdir(path, options = {}) {
242
+ const abs = this.resolve(path);
243
+ try {
244
+ await fsp.mkdir(abs, { recursive: options.recursive ?? false });
245
+ }
246
+ catch (err) {
247
+ throw this.translateError(err, abs);
248
+ }
249
+ }
250
+ /**
251
+ * Remove a directory. By default the directory must be empty;
252
+ * pass `{ recursive: true }` to delete contents too.
253
+ */
254
+ async rmdir(path, options = {}) {
255
+ const abs = this.resolve(path);
256
+ try {
257
+ if (options.recursive === true) {
258
+ await fsp.rm(abs, { recursive: true, force: true });
259
+ }
260
+ else {
261
+ await fsp.rmdir(abs);
262
+ }
263
+ }
264
+ catch (err) {
265
+ throw this.translateError(err, abs);
266
+ }
267
+ }
268
+ // ─── Streaming ────────────────────────────────────────────
269
+ /**
270
+ * Open a streaming reader for `path` as a Web `ReadableStream`.
271
+ * Useful for large files (> a few MB) where buffering the whole
272
+ * content in memory is wasteful.
273
+ */
274
+ readStream(path) {
275
+ const abs = this.resolve(path);
276
+ const node = createReadStream(abs);
277
+ return Readable.toWeb(node);
278
+ }
279
+ /**
280
+ * Open a streaming writer for `path` as a Web `WritableStream`.
281
+ * Overwrites any existing content.
282
+ */
283
+ writeStream(path) {
284
+ const abs = this.resolve(path);
285
+ const node = createWriteStream(abs);
286
+ return Writable.toWeb(node);
287
+ }
288
+ // ─── Watching ─────────────────────────────────────────────
289
+ /**
290
+ * Watch a file or directory for changes. `callback` is invoked
291
+ * synchronously by the OS for each event. Recursive watches are
292
+ * supported only on macOS and Windows; on Linux, recursive emulation
293
+ * is not built in (callers can stack multiple watchers).
294
+ */
295
+ async watch(path, callback) {
296
+ const abs = this.resolve(path);
297
+ if (!(await this.exists(abs)))
298
+ throw new FileNotFoundException(abs);
299
+ const watcher = new WatcherImpl(abs, callback, this.state.openWatchers);
300
+ this.state.openWatchers.add(watcher);
301
+ return watcher;
302
+ }
303
+ // ─── Temp files ───────────────────────────────────────────
304
+ /**
305
+ * Create a unique temporary file under the OS temp directory. The
306
+ * file exists empty on disk; callers write/read it via `read()` /
307
+ * `write()` passing `tempFile.path`. Closing the returned handle
308
+ * deletes the file. `terminate()` closes all outstanding handles.
309
+ */
310
+ async tempFile(prefix = 'xf-fs-') {
311
+ const name = `${prefix}${randomBytes(8).toString('hex')}`;
312
+ const abs = posix.join(tmpdir().replace(/\\/g, '/'), name);
313
+ await fsp.writeFile(abs, '');
314
+ const handle = new TempFileImpl(abs, this.state.openTempFiles);
315
+ this.state.openTempFiles.add(handle);
316
+ return handle;
317
+ }
318
+ // ─── Error translation ────────────────────────────────────
319
+ /**
320
+ * Translate a `node:fs` error into a typed Exception component when
321
+ * the error code is one of the modelled cases; otherwise return the
322
+ * error unchanged for plain propagation.
323
+ */
324
+ translateError(err, path) {
325
+ if (typeof err !== 'object' || err === null)
326
+ return err;
327
+ const code = err.code;
328
+ if (code === 'ENOENT')
329
+ return new FileNotFoundException(path);
330
+ if (code === 'EACCES' || code === 'EPERM')
331
+ return new FileAccessDeniedException(path);
332
+ if (code === 'ENOTEMPTY')
333
+ return new DirectoryNotEmptyException(path);
334
+ return err;
335
+ }
336
+ }
337
+ // ─── Concrete Transfer implementations ───────────────────────
338
+ class WatcherImpl {
339
+ path;
340
+ handle;
341
+ active = true;
342
+ registry;
343
+ constructor(path, callback, registry) {
344
+ this.path = path;
345
+ this.registry = registry;
346
+ this.handle = fsWatch(path, { recursive: process.platform !== 'linux' }, (eventType, filename) => {
347
+ const childPath = filename === null ? path : posix.join(path.replace(/\\/g, '/'), filename.toString());
348
+ const kind = eventType === 'rename' ? 'renamed' : 'modified';
349
+ callback({ path: childPath, kind });
350
+ });
351
+ }
352
+ get isActive() { return this.active; }
353
+ async close() {
354
+ if (!this.active)
355
+ return;
356
+ this.active = false;
357
+ this.registry.delete(this);
358
+ this.handle?.close();
359
+ this.handle = undefined;
360
+ }
361
+ }
362
+ class TempFileImpl {
363
+ path;
364
+ open = true;
365
+ registry;
366
+ constructor(path, registry) {
367
+ this.path = path;
368
+ this.registry = registry;
369
+ }
370
+ get isOpen() { return this.open; }
371
+ async close() {
372
+ if (!this.open)
373
+ return;
374
+ this.open = false;
375
+ this.registry.delete(this);
376
+ try {
377
+ await fsp.unlink(this.path);
378
+ }
379
+ catch { /* already gone */ }
380
+ }
381
+ }
382
+ //# sourceMappingURL=FileRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileRepository.js","sourceRoot":"","sources":["../../../../src/repository/base/FileRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ import { FileRepository } from './FileRepository.js';
2
+ import type { FileEntry } from '../transfers/FileEntry.js';
3
+ import type { FileStat } from '../transfers/FileStat.js';
4
+ import type { Watcher } from '../transfers/Watcher.js';
5
+ import type { TempFile } from '../transfers/TempFile.js';
6
+ import type { WatchEvent } from '../transfers/WatchEvent.js';
7
+ /**
8
+ * Canonical operations of a `FileRepository`, used as the discriminator
9
+ * passed to the {@link AuditedFileRepository.onError} hook so a single
10
+ * handler can branch on the operation that failed.
11
+ */
12
+ export type FileOperation = 'read' | 'readBytes' | 'write' | 'append' | 'delete' | 'exists' | 'stat' | 'list' | 'walk' | 'mkdir' | 'rmdir' | 'readStream' | 'writeStream' | 'watch' | 'tempFile';
13
+ /**
14
+ * Generalization for Access Layer components that need to observe
15
+ * every filesystem operation — for audit logs, metrics, security
16
+ * tracing, or invalidation of higher-level caches.
17
+ *
18
+ * Same protocol as {@link FileRepository}; this subclass adds a
19
+ * cross-cutting **observability policy**. Every public method is
20
+ * intercepted: on success the matching `onX` hook is invoked with
21
+ * the operation's path and result summary; on failure `onError` is
22
+ * invoked with the operation name, path, and the (possibly
23
+ * translated) error before it is re-thrown.
24
+ *
25
+ * Hooks default to no-ops. Subclasses override only the ones they
26
+ * care about. They may be async — the interceptor `await`s them, so
27
+ * a hook can hit a remote logger or block briefly without losing
28
+ * events.
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * import { AuditedFileRepository } from '@xfcfam/xf-fs'
33
+ *
34
+ * export class AuditedConfigRepository extends AuditedFileRepository {
35
+ * constructor() { super({ rootPath: '/etc/app' }) }
36
+ *
37
+ * override async onWrite(path: string, sizeBytes: number) {
38
+ * await this.appendAuditLog(`WRITE ${path} ${sizeBytes}B`)
39
+ * }
40
+ * override async onError(op: FileOperation, path: string, err: unknown) {
41
+ * await this.appendAuditLog(`${op.toUpperCase()} FAIL ${path}: ${String(err)}`)
42
+ * }
43
+ *
44
+ * private async appendAuditLog(line: string) { ... }
45
+ * }
46
+ * ```
47
+ */
48
+ export declare abstract class AuditedFileRepository extends FileRepository {
49
+ protected onRead(_path: string, _sizeBytes: number): Promise<void>;
50
+ protected onReadBytes(_path: string, _sizeBytes: number): Promise<void>;
51
+ protected onWrite(_path: string, _sizeBytes: number): Promise<void>;
52
+ protected onAppend(_path: string, _sizeBytes: number): Promise<void>;
53
+ protected onDelete(_path: string): Promise<void>;
54
+ protected onExists(_path: string, _exists: boolean): Promise<void>;
55
+ protected onStat(_path: string, _stat: FileStat): Promise<void>;
56
+ protected onList(_path: string, _entries: readonly FileEntry[]): Promise<void>;
57
+ protected onWalk(_path: string, _entries: readonly FileEntry[]): Promise<void>;
58
+ protected onMkdir(_path: string, _recursive: boolean): Promise<void>;
59
+ protected onRmdir(_path: string, _recursive: boolean): Promise<void>;
60
+ protected onReadStream(_path: string): void;
61
+ protected onWriteStream(_path: string): void;
62
+ protected onWatch(_path: string, _watcher: Watcher): Promise<void>;
63
+ protected onTempFile(_tempFile: TempFile): Promise<void>;
64
+ protected onError(_operation: FileOperation, _path: string, _error: unknown): Promise<void>;
65
+ read(path: string): Promise<string>;
66
+ readBytes(path: string): Promise<Uint8Array>;
67
+ write(path: string, content: string | Uint8Array): Promise<void>;
68
+ append(path: string, content: string | Uint8Array): Promise<void>;
69
+ delete(path: string): Promise<void>;
70
+ exists(path: string): Promise<boolean>;
71
+ stat(path: string): Promise<FileStat>;
72
+ list(path: string): Promise<FileEntry[]>;
73
+ walk(path: string): Promise<FileEntry[]>;
74
+ mkdir(path: string, options?: {
75
+ recursive?: boolean;
76
+ }): Promise<void>;
77
+ rmdir(path: string, options?: {
78
+ recursive?: boolean;
79
+ }): Promise<void>;
80
+ readStream(path: string): ReadableStream<Uint8Array>;
81
+ writeStream(path: string): WritableStream<Uint8Array>;
82
+ watch(path: string, callback: (event: WatchEvent) => void): Promise<Watcher>;
83
+ tempFile(prefix?: string): Promise<TempFile>;
84
+ private static sizeOf;
85
+ }
86
+ //# sourceMappingURL=AuditedFileRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuditedFileRepository.d.ts","sourceRoot":"","sources":["../../../../src/repository/general/AuditedFileRepository.ts"],"names":[],"mappings":"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"}