@zenfs/core 1.11.4 → 2.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 (135) hide show
  1. package/dist/backends/backend.d.ts +19 -15
  2. package/dist/backends/backend.js +36 -19
  3. package/dist/backends/cow.d.ts +20 -30
  4. package/dist/backends/cow.js +83 -192
  5. package/dist/backends/fetch.d.ts +1 -0
  6. package/dist/backends/fetch.js +30 -30
  7. package/dist/backends/index.d.ts +1 -1
  8. package/dist/backends/index.js +1 -1
  9. package/dist/backends/memory.d.ts +5 -7
  10. package/dist/backends/memory.js +2 -3
  11. package/dist/backends/passthrough.d.ts +19 -23
  12. package/dist/backends/passthrough.js +98 -288
  13. package/dist/backends/port.d.ts +220 -0
  14. package/dist/backends/port.js +328 -0
  15. package/dist/backends/single_buffer.d.ts +59 -47
  16. package/dist/backends/single_buffer.js +468 -219
  17. package/dist/backends/store/fs.d.ts +25 -35
  18. package/dist/backends/store/fs.js +276 -315
  19. package/dist/backends/store/store.d.ts +10 -15
  20. package/dist/backends/store/store.js +11 -10
  21. package/dist/config.d.ts +3 -12
  22. package/dist/config.js +17 -19
  23. package/dist/context.d.ts +8 -21
  24. package/dist/context.js +33 -10
  25. package/dist/index.d.ts +2 -1
  26. package/dist/index.js +2 -1
  27. package/dist/internal/contexts.d.ts +63 -0
  28. package/dist/internal/contexts.js +15 -0
  29. package/dist/internal/credentials.d.ts +2 -11
  30. package/dist/internal/credentials.js +0 -19
  31. package/dist/internal/devices.d.ts +18 -80
  32. package/dist/internal/devices.js +103 -316
  33. package/dist/internal/error.d.ts +9 -204
  34. package/dist/internal/error.js +19 -288
  35. package/dist/internal/file_index.d.ts +1 -1
  36. package/dist/internal/file_index.js +11 -11
  37. package/dist/internal/filesystem.d.ts +51 -94
  38. package/dist/internal/filesystem.js +21 -20
  39. package/dist/internal/index.d.ts +1 -2
  40. package/dist/internal/index.js +1 -2
  41. package/dist/internal/index_fs.d.ts +12 -30
  42. package/dist/internal/index_fs.js +37 -69
  43. package/dist/internal/inode.d.ts +140 -24
  44. package/dist/internal/inode.js +515 -66
  45. package/dist/mixins/async.js +52 -112
  46. package/dist/mixins/mutexed.d.ts +19 -18
  47. package/dist/mixins/mutexed.js +62 -64
  48. package/dist/mixins/readonly.d.ts +7 -6
  49. package/dist/mixins/readonly.js +24 -18
  50. package/dist/mixins/sync.js +8 -8
  51. package/dist/{vfs/path.d.ts → path.d.ts} +3 -4
  52. package/dist/{vfs/path.js → path.js} +6 -9
  53. package/dist/polyfills.js +1 -1
  54. package/dist/readline.d.ts +134 -0
  55. package/dist/readline.js +623 -0
  56. package/dist/utils.d.ts +9 -37
  57. package/dist/utils.js +17 -85
  58. package/dist/vfs/acl.d.ts +42 -0
  59. package/dist/vfs/acl.js +268 -0
  60. package/dist/vfs/async.d.ts +9 -23
  61. package/dist/vfs/async.js +25 -27
  62. package/dist/vfs/config.d.ts +6 -18
  63. package/dist/vfs/config.js +8 -18
  64. package/dist/vfs/dir.d.ts +3 -3
  65. package/dist/vfs/dir.js +12 -12
  66. package/dist/vfs/file.d.ts +106 -0
  67. package/dist/vfs/file.js +244 -0
  68. package/dist/vfs/flags.d.ts +19 -0
  69. package/dist/vfs/flags.js +62 -0
  70. package/dist/vfs/index.d.ts +4 -10
  71. package/dist/vfs/index.js +4 -13
  72. package/dist/vfs/ioctl.d.ts +88 -0
  73. package/dist/vfs/ioctl.js +409 -0
  74. package/dist/vfs/promises.d.ts +81 -19
  75. package/dist/vfs/promises.js +404 -288
  76. package/dist/vfs/shared.d.ts +7 -37
  77. package/dist/vfs/shared.js +29 -85
  78. package/dist/{stats.d.ts → vfs/stats.d.ts} +14 -28
  79. package/dist/{stats.js → vfs/stats.js} +11 -66
  80. package/dist/vfs/streams.d.ts +1 -0
  81. package/dist/vfs/streams.js +32 -27
  82. package/dist/vfs/sync.d.ts +3 -3
  83. package/dist/vfs/sync.js +263 -260
  84. package/dist/vfs/watchers.d.ts +2 -2
  85. package/dist/vfs/watchers.js +12 -12
  86. package/dist/vfs/xattr.d.ts +116 -0
  87. package/dist/vfs/xattr.js +201 -0
  88. package/package.json +5 -3
  89. package/readme.md +1 -1
  90. package/scripts/test.js +2 -2
  91. package/tests/assignment.ts +1 -1
  92. package/tests/backend/config.worker.js +4 -1
  93. package/tests/backend/fetch.test.ts +3 -0
  94. package/tests/backend/port.test.ts +19 -33
  95. package/tests/backend/remote.worker.js +4 -1
  96. package/tests/backend/single-buffer.test.ts +53 -0
  97. package/tests/backend/single-buffer.worker.js +30 -0
  98. package/tests/common/context.test.ts +3 -3
  99. package/tests/common/handle.test.ts +17 -12
  100. package/tests/common/mutex.test.ts +9 -9
  101. package/tests/common/path.test.ts +1 -1
  102. package/tests/common/readline.test.ts +104 -0
  103. package/tests/common.ts +4 -19
  104. package/tests/fetch/fetch.ts +2 -2
  105. package/tests/fs/append.test.ts +4 -4
  106. package/tests/fs/directory.test.ts +25 -25
  107. package/tests/fs/errors.test.ts +15 -19
  108. package/tests/fs/links.test.ts +4 -3
  109. package/tests/fs/open.test.ts +4 -21
  110. package/tests/fs/permissions.test.ts +14 -18
  111. package/tests/fs/read.test.ts +10 -9
  112. package/tests/fs/readFile.test.ts +10 -26
  113. package/tests/fs/rename.test.ts +4 -9
  114. package/tests/fs/stat.test.ts +8 -8
  115. package/tests/fs/streams.test.ts +2 -11
  116. package/tests/fs/times.test.ts +7 -7
  117. package/tests/fs/truncate.test.ts +8 -36
  118. package/tests/fs/watch.test.ts +10 -10
  119. package/tests/fs/write.test.ts +77 -13
  120. package/tests/fs/xattr.test.ts +85 -0
  121. package/tests/logs.js +22 -0
  122. package/tests/setup/context.ts +1 -1
  123. package/tests/setup/index.ts +3 -3
  124. package/tests/setup/port.ts +7 -1
  125. package/dist/backends/port/fs.d.ts +0 -84
  126. package/dist/backends/port/fs.js +0 -151
  127. package/dist/backends/port/rpc.d.ts +0 -77
  128. package/dist/backends/port/rpc.js +0 -100
  129. package/dist/backends/store/simple.d.ts +0 -20
  130. package/dist/backends/store/simple.js +0 -13
  131. package/dist/internal/file.d.ts +0 -359
  132. package/dist/internal/file.js +0 -751
  133. package/dist/internal/log.d.ts +0 -133
  134. package/dist/internal/log.js +0 -218
  135. package/tests/fs/writeFile.test.ts +0 -70
@@ -1,60 +1,153 @@
1
- import { Stats, type StatsLike } from '../stats.js';
1
+ import { BufferView } from 'utilium/buffer.js';
2
+ import { Stats, type StatsLike } from '../vfs/stats.js';
3
+ import { type V_Context } from './contexts.js';
2
4
  /**
3
5
  * Root inode
4
6
  * @hidden
5
7
  */
6
8
  export declare const rootIno = 0;
9
+ /**
10
+ * Extended attributes
11
+ * @category Internals
12
+ * @internal
13
+ */
14
+ export declare class Attributes extends BufferView {
15
+ accessor size: number;
16
+ ['constructor']: typeof Attributes;
17
+ get byteSize(): number;
18
+ has(name: string): boolean;
19
+ get(name: string): Uint8Array | undefined;
20
+ set(name: string, value: Uint8Array): void;
21
+ remove(name: string): boolean;
22
+ copyFrom(other: Attributes): void;
23
+ keys(): Generator<string, void, unknown>;
24
+ values(): Generator<Uint8Array<ArrayBufferLike>, void, unknown>;
25
+ entries(): Generator<(string | Uint8Array<ArrayBufferLike>)[], void, unknown>;
26
+ }
7
27
  /**
8
28
  * @internal @hidden
9
29
  */
10
30
  export interface InodeFields {
11
31
  data?: number;
12
32
  flags?: number;
33
+ version?: number;
13
34
  }
14
35
  /**
15
36
  * @category Internals
16
37
  * @internal
17
38
  */
18
39
  export interface InodeLike extends StatsLike<number>, InodeFields {
40
+ attributes?: Attributes;
19
41
  }
20
42
  /**
21
43
  * @internal @hidden
22
44
  */
23
- export declare const _inode_fields: readonly ["ino", "data", "size", "mode", "flags", "nlink", "uid", "gid", "atimeMs", "birthtimeMs", "mtimeMs", "ctimeMs"];
45
+ export declare const _inode_fields: readonly ["ino", "data", "size", "mode", "flags", "nlink", "uid", "gid", "atimeMs", "birthtimeMs", "mtimeMs", "ctimeMs", "version"];
24
46
  /**
25
47
  * Represents which version of the `Inode` format we are on.
26
48
  * 1. 58 bytes. The first member was called `ino` but used as the ID for data.
27
49
  * 2. 66 bytes. Renamed the first member from `ino` to `data` and added a separate `ino` field
28
- * 3. (current) 72 bytes. Changed the ID fields from 64 to 32 bits and added `flags`.
50
+ * 3. 72 bytes. Changed the ID fields from 64 to 32 bits and added `flags`.
51
+ * 4. >= 128 bytes. Added extended attributes.
52
+ * 5. (current) 4 KiB. Changed flags
29
53
  * @internal @hidden
30
54
  */
31
- export declare const _inode_version = 3;
55
+ export declare const _inode_version = 5;
56
+ /**
57
+ * Inode flags
58
+ * @see `S_*` in `include/linux/fs.h` (around L2325)
59
+ * @experimental
60
+ */
61
+ export declare enum InodeFlags {
62
+ /** Writes are synced at once */
63
+ Sync = 1,
64
+ /** Do not update access times */
65
+ NoAtime = 2,
66
+ /** Append-only file */
67
+ Append = 4,
68
+ /** Immutable file */
69
+ Immutable = 8,
70
+ /** removed, but still open directory */
71
+ Dead = 16,
72
+ /** Inode is not counted to quota */
73
+ NoQuota = 32,
74
+ /** Directory modifications are synchronous */
75
+ Dirsync = 64,
76
+ /** Do not update file c/mtime */
77
+ NoCMtime = 128,
78
+ /** Do not truncate: swapon got its bmaps */
79
+ SwapFile = 256,
80
+ /** Inode is fs-internal */
81
+ Private = 512,
82
+ /** Inode has an associated IMA struct */
83
+ IMA = 1024,
84
+ /** Automount/referral quasi-directory */
85
+ AutoMount = 2048,
86
+ /** no suid or xattr security attributes */
87
+ NoSec = 4096,
88
+ /** Direct Access, avoiding the page cache */
89
+ DAX = 8192,
90
+ /** Encrypted file (using fs/crypto/) */
91
+ Encrypted = 16384,
92
+ /** Casefolded file */
93
+ CaseFold = 32768,
94
+ /** Verity file (using fs/verity/) */
95
+ Verity = 65536,
96
+ /** File is in use by the kernel (eg. fs/cachefiles) */
97
+ KernelFile = 131072
98
+ }
99
+ /** User visible flags */
100
+ export declare const userVisibleFlags = 253951;
101
+ /** User modifiable flags */
102
+ export declare const userModifiableFlags = 229631;
32
103
  /**
33
104
  * Generic inode definition that can easily be serialized.
34
105
  * @category Internals
35
106
  * @internal
36
- * @todo [BREAKING] Remove 58 byte Inode upgrade path
37
107
  */
38
- export declare class Inode implements InodeLike {
39
- constructor(data?: ArrayBufferLike | ArrayBufferView | Readonly<Partial<InodeLike>>);
40
- data: number;
108
+ export declare class Inode extends BufferView implements InodeLike {
109
+ constructor(...args: ConstructorParameters<typeof BufferView> | [Readonly<Partial<InodeLike>>]);
110
+ accessor data: number;
41
111
  /** For future use */
42
- __data_old: number;
43
- size: number;
44
- mode: number;
45
- nlink: number;
46
- uid: number;
47
- gid: number;
48
- atimeMs: number;
49
- birthtimeMs: number;
50
- mtimeMs: number;
51
- ctimeMs: number;
52
- ino: number;
112
+ accessor __data_old: number;
113
+ accessor size: number;
114
+ accessor mode: number;
115
+ accessor nlink: number;
116
+ accessor uid: number;
117
+ accessor gid: number;
118
+ accessor atimeMs: number;
119
+ accessor birthtimeMs: number;
120
+ accessor mtimeMs: number;
121
+ /**
122
+ * The time the inode was changed.
123
+ *
124
+ * This is automatically updated whenever changed are made using `update()`.
125
+ */
126
+ accessor ctimeMs: number;
127
+ accessor ino: number;
53
128
  /** For future use */
54
- __ino_old: number;
55
- flags: number;
129
+ accessor __ino_old: number;
130
+ accessor flags: number;
56
131
  /** For future use */
57
- __padding: number;
132
+ protected accessor __after_flags: number;
133
+ /**
134
+ * The "version" of the inode/data.
135
+ * Unrelated to the inode format!
136
+ */
137
+ accessor version: number;
138
+ /**
139
+ * Padding up to 128 bytes.
140
+ * This ensures there is enough room for expansion without breaking the ABI.
141
+ * @internal
142
+ */
143
+ protected accessor __padding: Uint8Array;
144
+ accessor attributes: Attributes;
145
+ /**
146
+ * Since the attribute data uses dynamic arrays,
147
+ * it is necessary to add this so attributes can be added.
148
+ * @internal @hidden
149
+ */
150
+ protected accessor __data: Uint8Array;
58
151
  toString(): string;
59
152
  toJSON(): InodeLike;
60
153
  /**
@@ -73,7 +166,30 @@ export declare class Inode implements InodeLike {
73
166
  */
74
167
  update(data?: Partial<Readonly<InodeLike>>): boolean;
75
168
  }
169
+ export declare function isFile(metadata: {
170
+ mode: number;
171
+ }): boolean;
172
+ export declare function isDirectory(metadata: {
173
+ mode: number;
174
+ }): boolean;
175
+ export declare function isSymbolicLink(metadata: {
176
+ mode: number;
177
+ }): boolean;
178
+ export declare function isSocket(metadata: {
179
+ mode: number;
180
+ }): boolean;
181
+ export declare function isBlockDevice(metadata: {
182
+ mode: number;
183
+ }): boolean;
184
+ export declare function isCharacterDevice(metadata: {
185
+ mode: number;
186
+ }): boolean;
187
+ export declare function isFIFO(metadata: {
188
+ mode: number;
189
+ }): boolean;
76
190
  /**
77
- * @internal @hidden
191
+ * Checks if a given user/group has access to this item
192
+ * @param access The requested access, combination of `W_OK`, `R_OK`, and `X_OK`
193
+ * @internal
78
194
  */
79
- export declare const __inode_sz: number;
195
+ export declare function hasAccess($: V_Context, inode: Pick<InodeLike, 'mode' | 'uid' | 'gid'>, access: number): boolean;