Skip to content

Commit 984e5eb

Browse files
author
Kerry Archibald
committed
process incoming poll relations
1 parent 5ca533c commit 984e5eb

File tree

2 files changed

+51
-9
lines changed

2 files changed

+51
-9
lines changed

src/models/poll.ts

+35-6
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { TypedEventEmitter } from "./typed-event-emitter";
2424

2525
export enum PollEvent {
2626
New = "Poll.new",
27+
End = "Poll.end",
2728
Update = "Poll.update",
2829
Responses = "Poll.Responses",
2930
Destroy = "Poll.Destroy",
@@ -32,7 +33,7 @@ export enum PollEvent {
3233
export type PollEventHandlerMap = {
3334
[PollEvent.Update]: (event: MatrixEvent, poll: Poll) => void;
3435
[PollEvent.Destroy]: (pollIdentifier: string) => void;
35-
[PollEvent.Destroy]: (pollIdentifier: string) => void;
36+
[PollEvent.End]: () => void;
3637
[PollEvent.Responses]: (responses: Relations) => void;
3738
};
3839

@@ -51,7 +52,7 @@ export class Poll extends TypedEventEmitter<Exclude<PollEvent, PollEvent.New>, P
5152
private pollEvent: PollStartEvent | undefined;
5253
private fetchingResponsesPromise: null | Promise<void> = null;
5354
private responses: null | Relations = null;
54-
private closeEvent: MatrixEvent | undefined;
55+
private endEvent: MatrixEvent | undefined;
5556

5657
public constructor(private rootEvent: MatrixEvent, private matrixClient: MatrixClient) {
5758
super();
@@ -65,7 +66,7 @@ export class Poll extends TypedEventEmitter<Exclude<PollEvent, PollEvent.New>, P
6566

6667
public get isEnded(): boolean {
6768
// @TODO(kerrya) should be false while responses are loading?
68-
return !!this.closeEvent;
69+
return !!this.endEvent;
6970
}
7071

7172
public setPollInstance(event: MatrixEvent): void {
@@ -96,6 +97,33 @@ export class Poll extends TypedEventEmitter<Exclude<PollEvent, PollEvent.New>, P
9697
return this.responses!;
9798
}
9899

100+
public onNewRelation(event: MatrixEvent): void {
101+
if (M_POLL_END.matches(event.getType())) {
102+
this.endEvent = event;
103+
this.emit(PollEvent.End);
104+
}
105+
106+
// wait for poll to be initialised
107+
// @TODO(kerrya) races here?
108+
if (!this.responses) {
109+
return;
110+
}
111+
112+
if (event.isDecryptionFailure()) {
113+
// undecryptableRelationsCount++
114+
return;
115+
}
116+
const pollCloseTimestamp = this.endEvent?.getTs() || Number.MAX_SAFE_INTEGER;
117+
if (
118+
M_POLL_RESPONSE.matches(event.getType()) &&
119+
// response made before poll closed
120+
event.getTs() <= pollCloseTimestamp
121+
) {
122+
this.responses.addEvent(event);
123+
}
124+
125+
}
126+
99127
private async fetchResponses(): Promise<void> {
100128
this.fetchingResponsesPromise = new Promise<void>(() => {});
101129

@@ -116,8 +144,8 @@ export class Poll extends TypedEventEmitter<Exclude<PollEvent, PollEvent.New>, P
116144
const responses = new Relations('m.reference', M_POLL_RESPONSE.name, this.matrixClient);
117145
let undecryptableRelationsCount = 0;
118146

119-
const pollCloseEvent = allRelations.events.find(event => M_POLL_END.matches(event.getType()));
120-
const pollCloseTimestamp = pollCloseEvent?.getTs() || Number.MAX_SAFE_INTEGER;
147+
const pollEndEvent = allRelations.events.find(event => M_POLL_END.matches(event.getType()));
148+
const pollCloseTimestamp = pollEndEvent?.getTs() || Number.MAX_SAFE_INTEGER;
121149

122150
allRelations.events.forEach(event => {
123151
if (event.isDecryptionFailure()) {
@@ -135,8 +163,9 @@ export class Poll extends TypedEventEmitter<Exclude<PollEvent, PollEvent.New>, P
135163

136164
console.log('hhh', 'relations!!', responses);
137165

166+
138167
this.responses = responses;
139-
this.closeEvent = pollCloseEvent;
168+
this.endEvent = pollEndEvent;
140169
this.emit(PollEvent.Responses, this.responses);
141170
}
142171
}

src/models/room.ts

+16-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17-
import { M_POLL_START, Optional } from "matrix-events-sdk";
17+
import { M_POLL_RESPONSE, M_POLL_START, Optional } from "matrix-events-sdk";
1818

1919
import {
2020
EventTimelineSet,
@@ -1878,16 +1878,29 @@ export class Room extends ReadReceipt<RoomEmittedEvents, RoomEventHandlerMap> {
18781878
this.emit(PollEvent.New, poll);
18791879
}
18801880

1881+
const processPollRelationEvent = (event: MatrixEvent) => {
1882+
const relationEventId = event.getRelation()?.event_id;
1883+
if (relationEventId && this.polls.has(relationEventId)) {
1884+
const poll = this.polls.get(relationEventId);
1885+
poll?.onNewRelation(event);
1886+
}
1887+
}
1888+
1889+
const processPollEvent = (event: MatrixEvent) => {
1890+
processPollStartEvent(event);
1891+
processPollRelationEvent(event);
1892+
}
1893+
18811894
events.forEach((event: MatrixEvent) => {
18821895
matrixClient.decryptEventIfNeeded(event);
18831896

18841897
if (event.isBeingDecrypted() || event.isDecryptionFailure()) {
18851898
// add an event listener for once the event is decrypted.
18861899
event.once(MatrixEventEvent.Decrypted, async () => {
1887-
processPollStartEvent(event);
1900+
processPollEvent(event);
18881901
});
18891902
} else {
1890-
processPollStartEvent(event);
1903+
processPollEvent(event);
18911904
}
18921905
});
18931906
}

0 commit comments

Comments
 (0)