@zenfs/core 0.11.2 → 0.12.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/src/stats.ts CHANGED
@@ -14,45 +14,45 @@ export enum FileType {
14
14
  /**
15
15
  *
16
16
  */
17
- export interface StatsLike {
17
+ export interface StatsLike<T extends number | bigint = number | bigint> {
18
18
  /**
19
19
  * Size of the item in bytes.
20
20
  * For directories/symlinks, this is normally the size of the struct that represents the item.
21
21
  */
22
- size: number | bigint;
22
+ size: T;
23
23
  /**
24
24
  * Unix-style file mode (e.g. 0o644) that includes the item type
25
25
  * Type of the item can be FILE, DIRECTORY, SYMLINK, or SOCKET
26
26
  */
27
- mode: number | bigint;
27
+ mode: T;
28
28
  /**
29
29
  * time of last access, in milliseconds since epoch
30
30
  */
31
- atimeMs: number | bigint;
31
+ atimeMs: T;
32
32
  /**
33
33
  * time of last modification, in milliseconds since epoch
34
34
  */
35
- mtimeMs: number | bigint;
35
+ mtimeMs: T;
36
36
  /**
37
37
  * time of last time file status was changed, in milliseconds since epoch
38
38
  */
39
- ctimeMs: number | bigint;
39
+ ctimeMs: T;
40
40
  /**
41
41
  * time of file creation, in milliseconds since epoch
42
42
  */
43
- birthtimeMs: number | bigint;
43
+ birthtimeMs: T;
44
44
  /**
45
45
  * the id of the user that owns the file
46
46
  */
47
- uid: number | bigint;
47
+ uid: T;
48
48
  /**
49
49
  * the id of the group that owns the file
50
50
  */
51
- gid: number | bigint;
51
+ gid: T;
52
52
  /**
53
53
  * the ino
54
54
  */
55
- ino: number | bigint;
55
+ ino: T;
56
56
  }
57
57
 
58
58
  /**
@@ -1,204 +0,0 @@
1
- import type { Cred } from '../cred.js';
2
- import { NoSyncFile } from '../file.js';
3
- import { FileSystem } from '../filesystem.js';
4
- import { Stats } from '../stats.js';
5
- /**
6
- * @internal
7
- */
8
- export type ListingTree = {
9
- [key: string]: ListingTree | null;
10
- };
11
- /**
12
- * @internal
13
- */
14
- export interface ListingQueueNode<TData> {
15
- pwd: string;
16
- tree: ListingTree;
17
- parent: IndexDirInode<TData>;
18
- }
19
- /**
20
- * A simple class for storing a filesystem index. Assumes that all paths passed
21
- * to it are *absolute* paths.
22
- *
23
- * Can be used as a partial or a full index, although care must be taken if used
24
- * for the former purpose, especially when directories are concerned.
25
- *
26
- * @internal
27
- */
28
- export declare class FileIndex<TData> {
29
- /**
30
- * Static method for constructing indices from a JSON listing.
31
- * @param listing Directory listing generated by tools
32
- * @return A new FileIndex object.
33
- */
34
- static FromListing<T>(listing: ListingTree): FileIndex<T>;
35
- protected _index: Map<string, IndexDirInode<TData>>;
36
- /**
37
- * Constructs a new FileIndex.
38
- */
39
- constructor();
40
- files(): IndexFileInode<TData>[];
41
- /**
42
- * Adds the given absolute path to the index if it is not already in the index.
43
- * Creates any needed parent directories.
44
- * @param path The path to add to the index.
45
- * @param inode The inode for the
46
- * path to add.
47
- * @return 'True' if it was added or already exists, 'false' if there
48
- * was an issue adding it (e.g. item in path is a file, item exists but is
49
- * different).
50
- * @todo If adding fails and implicitly creates directories, we do not clean up
51
- * the new empty directories.
52
- */
53
- add(path: string, inode: IndexInode<TData>): boolean;
54
- /**
55
- * Adds the given absolute path to the index if it is not already in the index.
56
- * The path is added without special treatment (no joining of adjacent separators, etc).
57
- * Creates any needed parent directories.
58
- * @param path The path to add to the index.
59
- * @param inode The inode for the path to add.
60
- * @return 'True' if it was added or already exists, 'false' if there
61
- * was an issue adding it (e.g. item in path is a file, item exists but is
62
- * different).
63
- * @todo If adding fails and implicitly creates directories, we do not clean up the new empty directories.
64
- */
65
- addFast(path: string, inode: IndexInode<TData>): boolean;
66
- /**
67
- * Removes the given path. Can be a file or a directory.
68
- * @return The removed item,
69
- * or null if it did not exist.
70
- */
71
- remove(path: string): IndexInode<TData> | void;
72
- /**
73
- * Retrieves the directory listing of the given path.
74
- * @return An array of files in the given path, or 'null' if it does not exist.
75
- */
76
- ls(path: string): string[] | void;
77
- /**
78
- * Returns the inode of the given item.
79
- * @return Returns null if the item does not exist.
80
- */
81
- get(path: string): IndexInode<TData> | void | null;
82
- }
83
- /**
84
- * Generic interface for file/directory inodes.
85
- * Note that Stats objects are what we use for file inodes.
86
- */
87
- export declare abstract class IndexInode<TData> {
88
- data?: TData | undefined;
89
- constructor(data?: TData | undefined);
90
- /**
91
- * Whether this inode is for a file
92
- */
93
- abstract isFile(): this is IndexFileInode<TData>;
94
- /**
95
- * Whether this inode is for a directory
96
- */
97
- abstract isDirectory(): this is IndexDirInode<TData>;
98
- abstract toStats(): Stats;
99
- }
100
- /**
101
- * Inode for a file. Stores an arbitrary (filesystem-specific) data payload.
102
- */
103
- export declare class IndexFileInode<TData> extends IndexInode<TData> {
104
- isFile(): boolean;
105
- isDirectory(): boolean;
106
- toStats(): Stats;
107
- }
108
- /**
109
- * Inode for a directory. Currently only contains the directory listing.
110
- */
111
- export declare class IndexDirInode<TData> extends IndexInode<TData> {
112
- /**
113
- * @internal
114
- */
115
- _listing: Map<string, IndexInode<TData>>;
116
- isFile(): boolean;
117
- isDirectory(): boolean;
118
- /**
119
- * Return a Stats object for this inode.
120
- * @todo Should probably remove this at some point. This isn't the responsibility of the FileIndex.
121
- */
122
- get stats(): Stats;
123
- /**
124
- * Alias of getStats()
125
- * @todo Remove this at some point. This isn't the responsibility of the FileIndex.
126
- */
127
- toStats(): Stats;
128
- /**
129
- * Returns the directory listing for this directory. Paths in the directory are
130
- * relative to the directory's path.
131
- * @return The directory listing for this directory.
132
- */
133
- get listing(): string[];
134
- /**
135
- * Returns the inode for the indicated item, or null if it does not exist.
136
- * @param path Name of item in this directory.
137
- */
138
- get(path: string): IndexInode<TData> | void;
139
- /**
140
- * Add the given item to the directory listing. Note that the given inode is
141
- * not copied, and will be mutated by the DirInode if it is a DirInode.
142
- * @param path Item name to add to the directory listing.
143
- * @param inode The inode for the
144
- * item to add to the directory inode.
145
- * @return True if it was added, false if it already existed.
146
- */
147
- add(path: string, inode: IndexInode<TData>): boolean;
148
- /**
149
- * Removes the given item from the directory listing.
150
- * @param path Name of item to remove from the directory listing.
151
- * @return Returns the item
152
- * removed, or null if the item did not exist.
153
- */
154
- remove(path: string): IndexInode<TData> | void;
155
- }
156
- declare const IndexFS_base: (abstract new (...args: any[]) => {
157
- metadata(): import("../filesystem.js").FileSystemMetadata;
158
- rename(oldPath: string, newPath: string, cred: Cred): Promise<void>;
159
- renameSync(oldPath: string, newPath: string, cred: Cred): void;
160
- createFile(path: string, flag: string, mode: number, cred: Cred): Promise<import("../file.js").File>;
161
- createFileSync(path: string, flag: string, mode: number, cred: Cred): import("../file.js").File;
162
- unlink(path: string, cred: Cred): Promise<void>;
163
- unlinkSync(path: string, cred: Cred): void;
164
- rmdir(path: string, cred: Cred): Promise<void>;
165
- rmdirSync(path: string, cred: Cred): void;
166
- mkdir(path: string, mode: number, cred: Cred): Promise<void>;
167
- mkdirSync(path: string, mode: number, cred: Cred): void;
168
- link(srcpath: string, dstpath: string, cred: Cred): Promise<void>;
169
- linkSync(srcpath: string, dstpath: string, cred: Cred): void;
170
- sync(path: string, data: Uint8Array, stats: Readonly<Stats>): Promise<void>;
171
- syncSync(path: string, data: Uint8Array, stats: Readonly<Stats>): void;
172
- ready(): Promise<void>;
173
- stat(path: string, cred: Cred): Promise<Stats>;
174
- statSync(path: string, cred: Cred): Stats;
175
- openFile(path: string, flag: string, cred: Cred): Promise<import("../file.js").File>;
176
- openFileSync(path: string, flag: string, cred: Cred): import("../file.js").File;
177
- readdir(path: string, cred: Cred): Promise<string[]>;
178
- readdirSync(path: string, cred: Cred): string[];
179
- exists(path: string, cred: Cred): Promise<boolean>;
180
- existsSync(path: string, cred: Cred): boolean;
181
- }) & typeof FileSystem;
182
- export declare abstract class IndexFS<TData> extends IndexFS_base {
183
- protected _index: FileIndex<TData>;
184
- constructor(index: ListingTree);
185
- stat(path: string): Promise<Stats>;
186
- statSync(path: string): Stats;
187
- openFile(path: string, flag: string, cred: Cred): Promise<NoSyncFile<this>>;
188
- openFileSync(path: string, flag: string, cred: Cred): NoSyncFile<this>;
189
- readdir(path: string): Promise<string[]>;
190
- readdirSync(path: string): string[];
191
- protected abstract statFileInode(inode: IndexFileInode<TData>, path: string): Promise<Stats>;
192
- protected abstract statFileInodeSync(inode: IndexFileInode<TData>, path: string): Stats;
193
- protected abstract openFileInode(inode: IndexFileInode<TData>, path: string, flag: string): Promise<NoSyncFile<this>>;
194
- protected abstract openFileInodeSync(inode: IndexFileInode<TData>, path: string, flag: string): NoSyncFile<this>;
195
- }
196
- export declare abstract class SyncIndexFS<TData> extends IndexFS<TData> {
197
- protected statFileInode(inode: IndexFileInode<TData>, path: string): Promise<Stats>;
198
- protected openFileInode(inode: IndexFileInode<TData>, path: string, flag: string): Promise<NoSyncFile<this>>;
199
- }
200
- export declare abstract class AsyncIndexFS<TData> extends IndexFS<TData> {
201
- protected statFileInodeSync(inode: IndexFileInode<TData>, path: string): Stats;
202
- protected openFileInodeSync(inode: IndexFileInode<TData>, path: string, flag: string): NoSyncFile<this>;
203
- }
204
- export {};
@@ -1,410 +0,0 @@
1
- import { ErrnoError, Errno } from '../error.js';
2
- import { basename, dirname, join } from '../emulation/path.js';
3
- import { NoSyncFile, flagToMode, isWriteable } from '../file.js';
4
- import { FileSystem, Readonly } from '../filesystem.js';
5
- import { FileType, Stats } from '../stats.js';
6
- /**
7
- * A simple class for storing a filesystem index. Assumes that all paths passed
8
- * to it are *absolute* paths.
9
- *
10
- * Can be used as a partial or a full index, although care must be taken if used
11
- * for the former purpose, especially when directories are concerned.
12
- *
13
- * @internal
14
- */
15
- export class FileIndex {
16
- /**
17
- * Static method for constructing indices from a JSON listing.
18
- * @param listing Directory listing generated by tools
19
- * @return A new FileIndex object.
20
- */
21
- static FromListing(listing) {
22
- const index = new FileIndex();
23
- // Add a root DirNode.
24
- const rootInode = new IndexDirInode();
25
- index._index.set('/', rootInode);
26
- const queue = [{ pwd: '', tree: listing, parent: rootInode }];
27
- while (queue.length > 0) {
28
- let inode;
29
- const { tree, pwd, parent } = queue.pop();
30
- for (const node in tree) {
31
- if (!Object.hasOwn(tree, node)) {
32
- continue;
33
- }
34
- const children = tree[node];
35
- if (children) {
36
- const path = pwd + '/' + node;
37
- inode = new IndexDirInode();
38
- index._index.set(path, inode);
39
- queue.push({ pwd: path, tree: children, parent: inode });
40
- }
41
- else {
42
- // This inode doesn't have correct size information, noted with -1.
43
- inode = new IndexFileInode(new Stats({ mode: FileType.FILE | 0o555 }));
44
- }
45
- if (!parent) {
46
- continue;
47
- }
48
- parent._listing.set(node, inode);
49
- }
50
- }
51
- return index;
52
- }
53
- /**
54
- * Constructs a new FileIndex.
55
- */
56
- constructor() {
57
- // Maps directory paths to directory inodes, which contain files.
58
- this._index = new Map();
59
- // _index is a single-level key,value store that maps *directory* paths to
60
- // DirInodes. File information is only contained in DirInodes themselves.
61
- // Create the root directory.
62
- this.add('/', new IndexDirInode());
63
- }
64
- files() {
65
- const files = [];
66
- for (const dir of this._index.values()) {
67
- for (const file of dir.listing) {
68
- const item = dir.get(file);
69
- if (!item) {
70
- continue;
71
- }
72
- if (!item.isFile()) {
73
- continue;
74
- }
75
- files.push(item);
76
- }
77
- }
78
- return files;
79
- }
80
- /**
81
- * Adds the given absolute path to the index if it is not already in the index.
82
- * Creates any needed parent directories.
83
- * @param path The path to add to the index.
84
- * @param inode The inode for the
85
- * path to add.
86
- * @return 'True' if it was added or already exists, 'false' if there
87
- * was an issue adding it (e.g. item in path is a file, item exists but is
88
- * different).
89
- * @todo If adding fails and implicitly creates directories, we do not clean up
90
- * the new empty directories.
91
- */
92
- add(path, inode) {
93
- if (!inode) {
94
- throw new ErrnoError(Errno.EINVAL, 'Inode must be specified', path, 'FileIndex.add');
95
- }
96
- if (!path.startsWith('/')) {
97
- throw new ErrnoError(Errno.EINVAL, 'Path not absolute', path, 'FileIndex.add');
98
- }
99
- // Check if it already exists.
100
- if (this._index.has(path)) {
101
- return this._index.get(path) === inode;
102
- }
103
- const dirpath = dirname(path);
104
- const hasParent = this._index.has(dirpath);
105
- const parent = hasParent ? this._index.get(dirpath) : new IndexDirInode();
106
- // Try to add to its parent directory first.
107
- if (!hasParent && path != '/') {
108
- if (!this.add(dirpath, parent)) {
109
- return false;
110
- }
111
- }
112
- // Add to parent.
113
- if (path != '/' && !parent.add(basename(path), inode)) {
114
- return false;
115
- }
116
- // If a directory, add to the index.
117
- if (inode.isDirectory()) {
118
- this._index.set(path, inode);
119
- }
120
- return true;
121
- }
122
- /**
123
- * Adds the given absolute path to the index if it is not already in the index.
124
- * The path is added without special treatment (no joining of adjacent separators, etc).
125
- * Creates any needed parent directories.
126
- * @param path The path to add to the index.
127
- * @param inode The inode for the path to add.
128
- * @return 'True' if it was added or already exists, 'false' if there
129
- * was an issue adding it (e.g. item in path is a file, item exists but is
130
- * different).
131
- * @todo If adding fails and implicitly creates directories, we do not clean up the new empty directories.
132
- */
133
- addFast(path, inode) {
134
- const parentPath = dirname(path);
135
- const itemName = basename(path);
136
- // Try to add to its parent directory first.
137
- let parent = this._index.get(parentPath);
138
- if (!parent) {
139
- // Create parent.
140
- parent = new IndexDirInode();
141
- this.addFast(parentPath, parent);
142
- }
143
- if (!parent.add(itemName, inode)) {
144
- return false;
145
- }
146
- // If adding a directory, add to the index as well.
147
- if (inode.isDirectory()) {
148
- this._index.set(path, inode);
149
- }
150
- return true;
151
- }
152
- /**
153
- * Removes the given path. Can be a file or a directory.
154
- * @return The removed item,
155
- * or null if it did not exist.
156
- */
157
- remove(path) {
158
- const dirpath = dirname(path);
159
- // Try to remove it from its parent directory first.
160
- const parent = this._index.get(dirpath);
161
- if (!parent) {
162
- return;
163
- }
164
- // Remove from parent.
165
- const inode = parent.remove(basename(path));
166
- if (!inode) {
167
- return;
168
- }
169
- if (!inode.isDirectory()) {
170
- return inode;
171
- }
172
- // If a directory, remove from the index, and remove children.
173
- const children = inode.listing;
174
- for (const child of children) {
175
- this.remove(join(path, child));
176
- }
177
- // Remove the directory from the index, unless it's the root.
178
- if (path != '/') {
179
- this._index.delete(path);
180
- }
181
- }
182
- /**
183
- * Retrieves the directory listing of the given path.
184
- * @return An array of files in the given path, or 'null' if it does not exist.
185
- */
186
- ls(path) {
187
- return this._index.get(path)?.listing;
188
- }
189
- /**
190
- * Returns the inode of the given item.
191
- * @return Returns null if the item does not exist.
192
- */
193
- get(path) {
194
- const dirpath = dirname(path);
195
- // Retrieve from its parent directory.
196
- const parent = this._index.get(dirpath);
197
- // Root case
198
- if (dirpath == path) {
199
- return parent;
200
- }
201
- return parent?.get(basename(path));
202
- }
203
- }
204
- /**
205
- * Generic interface for file/directory inodes.
206
- * Note that Stats objects are what we use for file inodes.
207
- */
208
- export class IndexInode {
209
- constructor(data) {
210
- this.data = data;
211
- }
212
- }
213
- /**
214
- * Inode for a file. Stores an arbitrary (filesystem-specific) data payload.
215
- */
216
- export class IndexFileInode extends IndexInode {
217
- isFile() {
218
- return true;
219
- }
220
- isDirectory() {
221
- return false;
222
- }
223
- toStats() {
224
- return new Stats({ mode: FileType.FILE | 0o666, size: 4096 });
225
- }
226
- }
227
- /**
228
- * Inode for a directory. Currently only contains the directory listing.
229
- */
230
- export class IndexDirInode extends IndexInode {
231
- constructor() {
232
- super(...arguments);
233
- /**
234
- * @internal
235
- */
236
- this._listing = new Map();
237
- }
238
- isFile() {
239
- return false;
240
- }
241
- isDirectory() {
242
- return true;
243
- }
244
- /**
245
- * Return a Stats object for this inode.
246
- * @todo Should probably remove this at some point. This isn't the responsibility of the FileIndex.
247
- */
248
- get stats() {
249
- return new Stats({ mode: FileType.DIRECTORY | 0o555, size: 4096 });
250
- }
251
- /**
252
- * Alias of getStats()
253
- * @todo Remove this at some point. This isn't the responsibility of the FileIndex.
254
- */
255
- toStats() {
256
- return this.stats;
257
- }
258
- /**
259
- * Returns the directory listing for this directory. Paths in the directory are
260
- * relative to the directory's path.
261
- * @return The directory listing for this directory.
262
- */
263
- get listing() {
264
- return [...this._listing.keys()];
265
- }
266
- /**
267
- * Returns the inode for the indicated item, or null if it does not exist.
268
- * @param path Name of item in this directory.
269
- */
270
- get(path) {
271
- return this._listing.get(path);
272
- }
273
- /**
274
- * Add the given item to the directory listing. Note that the given inode is
275
- * not copied, and will be mutated by the DirInode if it is a DirInode.
276
- * @param path Item name to add to the directory listing.
277
- * @param inode The inode for the
278
- * item to add to the directory inode.
279
- * @return True if it was added, false if it already existed.
280
- */
281
- add(path, inode) {
282
- if (this._listing.has(path)) {
283
- return false;
284
- }
285
- this._listing.set(path, inode);
286
- return true;
287
- }
288
- /**
289
- * Removes the given item from the directory listing.
290
- * @param path Name of item to remove from the directory listing.
291
- * @return Returns the item
292
- * removed, or null if the item did not exist.
293
- */
294
- remove(path) {
295
- const item = this._listing.get(path);
296
- if (!item) {
297
- return;
298
- }
299
- this._listing.delete(path);
300
- return item;
301
- }
302
- }
303
- export class IndexFS extends Readonly(FileSystem) {
304
- constructor(index) {
305
- super();
306
- this._index = FileIndex.FromListing(index);
307
- }
308
- async stat(path) {
309
- const inode = this._index.get(path);
310
- if (!inode) {
311
- throw ErrnoError.With('ENOENT', path, 'stat');
312
- }
313
- if (inode.isDirectory()) {
314
- return inode.stats;
315
- }
316
- if (inode.isFile()) {
317
- return this.statFileInode(inode, path);
318
- }
319
- throw new ErrnoError(Errno.EINVAL, 'Invalid inode.');
320
- }
321
- statSync(path) {
322
- const inode = this._index.get(path);
323
- if (!inode) {
324
- throw ErrnoError.With('ENOENT', path, 'stat');
325
- }
326
- if (inode.isDirectory()) {
327
- return inode.stats;
328
- }
329
- if (inode.isFile()) {
330
- return this.statFileInodeSync(inode, path);
331
- }
332
- throw new ErrnoError(Errno.EINVAL, 'Invalid inode.');
333
- }
334
- async openFile(path, flag, cred) {
335
- if (isWriteable(flag)) {
336
- // You can't write to files on this file system.
337
- throw new ErrnoError(Errno.EPERM, path);
338
- }
339
- // Check if the path exists, and is a file.
340
- const inode = this._index.get(path);
341
- if (!inode) {
342
- throw ErrnoError.With('ENOENT', path, 'openFile');
343
- }
344
- if (!inode.toStats().hasAccess(flagToMode(flag), cred)) {
345
- throw ErrnoError.With('EACCES', path, 'openFile');
346
- }
347
- if (inode.isDirectory()) {
348
- const stats = inode.stats;
349
- return new NoSyncFile(this, path, flag, stats, stats.fileData);
350
- }
351
- return this.openFileInode(inode, path, flag);
352
- }
353
- openFileSync(path, flag, cred) {
354
- if (isWriteable(flag)) {
355
- // You can't write to files on this file system.
356
- throw new ErrnoError(Errno.EPERM, path);
357
- }
358
- // Check if the path exists, and is a file.
359
- const inode = this._index.get(path);
360
- if (!inode) {
361
- throw ErrnoError.With('ENOENT', path, 'openFile');
362
- }
363
- if (!inode.toStats().hasAccess(flagToMode(flag), cred)) {
364
- throw ErrnoError.With('EACCES', path, 'openFile');
365
- }
366
- if (inode.isDirectory()) {
367
- const stats = inode.stats;
368
- return new NoSyncFile(this, path, flag, stats, stats.fileData);
369
- }
370
- return this.openFileInodeSync(inode, path, flag);
371
- }
372
- async readdir(path) {
373
- // Check if it exists.
374
- const inode = this._index.get(path);
375
- if (!inode) {
376
- throw ErrnoError.With('ENOENT', path, 'readdir');
377
- }
378
- if (inode.isDirectory()) {
379
- return inode.listing;
380
- }
381
- throw ErrnoError.With('ENOTDIR', path, 'readdir');
382
- }
383
- readdirSync(path) {
384
- // Check if it exists.
385
- const inode = this._index.get(path);
386
- if (!inode) {
387
- throw ErrnoError.With('ENOENT', path, 'readdir');
388
- }
389
- if (inode.isDirectory()) {
390
- return inode.listing;
391
- }
392
- throw ErrnoError.With('ENOTDIR', path, 'readdir');
393
- }
394
- }
395
- export class SyncIndexFS extends IndexFS {
396
- async statFileInode(inode, path) {
397
- return this.statFileInodeSync(inode, path);
398
- }
399
- async openFileInode(inode, path, flag) {
400
- return this.openFileInodeSync(inode, path, flag);
401
- }
402
- }
403
- export class AsyncIndexFS extends IndexFS {
404
- statFileInodeSync(inode, path) {
405
- throw ErrnoError.With('ENOSYS', path, 'AsyncIndexFS.statFileInodeSync');
406
- }
407
- openFileInodeSync(inode, path, flag) {
408
- throw ErrnoError.With('ENOSYS', path, 'AsyncIndexFS.openFileInodeSync');
409
- }
410
- }