Skip to content

Commit f37dd4e

Browse files
committed
refactor(logstream-did-update): improve resource management
Register a destructor for the modifier to ensure the Logstream is properly unsubscribed when the modifier is destroyed. Replace ad-hoc unsubscribe logic in modify() with a dedicated cleanup function. Use a lambda callback to invoke the provided callback with the current logstream, removing unnecessary stored callback references and improving code clarity.
1 parent ea15d50 commit f37dd4e

File tree

1 file changed

+13
-13
lines changed

1 file changed

+13
-13
lines changed

app/modifiers/logstream-did-update.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,40 +3,40 @@
33
import type ActionCableConsumerService from 'codecrafters-frontend/services/action-cable-consumer';
44
import type Store from '@ember-data/store';
55
import Logstream from 'codecrafters-frontend/utils/logstream';
6-
import Modifier from 'ember-modifier';
6+
import Modifier, { type ArgsFor } from 'ember-modifier';
77
import { inject as service } from '@ember/service';
88
import { registerDestructor } from '@ember/destroyable';
99
import { action } from '@ember/object';
10+
import type { Owner } from '@ember/test-helpers/build-owner';
1011

1112
interface Signature {
1213
Args: {
1314
Positional: [(logstream: Logstream) => void, string];
1415
};
1516
}
1617

18+
function cleanup(instance: LogstreamDidUpdateModifier) {
19+
if (instance.logstream) {
20+
instance.logstream.unsubscribe();
21+
}
22+
}
23+
1724
export default class LogstreamDidUpdateModifier extends Modifier<Signature> {
1825
@service declare actionCableConsumer: ActionCableConsumerService;
1926
@service declare store: Store;
2027

21-
callback?: (logstream: Logstream) => void;
2228
logstream?: Logstream;
2329

24-
@action
25-
handleLogstreamDidPoll(): void {
26-
this.callback!(this.logstream!);
30+
constructor(owner: unknown, args: ArgsFor<Signature>) {
31+
super(owner as Owner, args);
32+
registerDestructor(this, cleanup);
2733
}
2834

2935
modify(_element: HTMLElement, [callback, logstreamId]: Signature['Args']['Positional']) {
30-
this.logstream = new Logstream(logstreamId, this.actionCableConsumer, this.store, this.handleLogstreamDidPoll);
31-
this.callback = callback;
36+
cleanup(this);
3237

33-
console.log(`subscribing to logstream#${logstreamId}`);
38+
this.logstream = new Logstream(logstreamId, this.actionCableConsumer, this.store, () => callback(this.logstream!));
3439
this.logstream.subscribe();
35-
36-
registerDestructor(this, () => {
37-
console.log(`unsubscribing from logstream#${logstreamId}`);
38-
this.logstream?.unsubscribe();
39-
});
4040
}
4141
}
4242

0 commit comments

Comments
 (0)