Skip to content

Commit 95ef10a

Browse files
committed
feat: 🎸 use FanOut for Node events
1 parent 9a94072 commit 95ef10a

File tree

2 files changed

+21
-13
lines changed

2 files changed

+21
-13
lines changed

src/core/Node.ts

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,17 @@
1+
import { FanOut } from 'thingies/lib/fanout';
12
import process from '../process';
23
import { Buffer, bufferAllocUnsafe, bufferFrom } from '../internal/buffer';
34
import { constants, S } from '../constants';
4-
import { EventEmitter } from 'events';
5+
6+
export type NodeEventModify = [
7+
type: 'modify',
8+
];
9+
10+
export type NodeEventDelete = [
11+
type: 'delete',
12+
];
13+
14+
export type NodeEvent = NodeEventModify | NodeEventDelete;
515

616
const { S_IFMT, S_IFDIR, S_IFREG, S_IFLNK, S_IFCHR } = constants;
717
const getuid = (): number => process.getuid?.() ?? 0;
@@ -10,7 +20,9 @@ const getgid = (): number => process.getgid?.() ?? 0;
1020
/**
1121
* Node in a file system (like i-node, v-node).
1222
*/
13-
export class Node extends EventEmitter {
23+
export class Node {
24+
public readonly changes = new FanOut<NodeEvent>();
25+
1426
// i-node number.
1527
ino: number;
1628

@@ -35,7 +47,6 @@ export class Node extends EventEmitter {
3547
symlink: string;
3648

3749
constructor(ino: number, mode: number = 0o666) {
38-
super();
3950
this.mode = mode;
4051
this.ino = ino;
4152
}
@@ -222,7 +233,7 @@ export class Node extends EventEmitter {
222233

223234
touch() {
224235
this.mtime = new Date();
225-
this.emit('change', this);
236+
this.changes.emit(['modify']);
226237
}
227238

228239
canRead(uid: number = getuid(), gid: number = getgid()): boolean {
@@ -286,7 +297,7 @@ export class Node extends EventEmitter {
286297
}
287298

288299
del() {
289-
this.emit('delete', this);
300+
this.changes.emit(['delete']);
290301
}
291302

292303
toJSON() {

src/node/volume.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1992,17 +1992,14 @@ export class FSWatcher extends EventEmitter {
19921992
const node = link.getNode();
19931993
const onNodeChange = () => {
19941994
let filename = relative(this._filename, filepath);
1995-
1996-
if (!filename) {
1997-
filename = this._getName();
1998-
}
1999-
1995+
if (!filename) filename = this._getName();
20001996
return this.emit('change', 'change', filename);
20011997
};
2002-
node.on('change', onNodeChange);
2003-
1998+
const unsub = node.changes.listen(([type]) => {
1999+
if (type === 'modify') onNodeChange();
2000+
});
20042001
const removers = this._listenerRemovers.get(node.ino) ?? [];
2005-
removers.push(() => node.removeListener('change', onNodeChange));
2002+
removers.push(() => unsub());
20062003
this._listenerRemovers.set(node.ino, removers);
20072004
};
20082005

0 commit comments

Comments
 (0)