Skip to content

Commit 1c7c9f4

Browse files
committed
refactorings
1 parent 9dca8a1 commit 1c7c9f4

File tree

3 files changed

+61
-64
lines changed

3 files changed

+61
-64
lines changed

backend/message.test.ts

+5-7
Original file line numberDiff line numberDiff line change
@@ -62,22 +62,20 @@ test("Send realtime", () => {
6262
const client0Heard: string[] = [];
6363
const client1Heard: string[] = [];
6464

65-
/* const rt0 = client0.joinRealtimeChannel()
66-
const rt1 = client1.joinRealtimeChannel()
67-
6865
const decoder = new TextDecoder()
69-
rt0.setListener((data) => { client0Heard.push(decoder.decode(data)) })
70-
rt1.setListener((data) => { client1Heard.push(decoder.decode(data)) })
66+
client0.connectRealtime((data) => { client0Heard.push(decoder.decode(data)); return true })
67+
client1.connectRealtime((data) => { client1Heard.push(decoder.decode(data)); return true })
7168

7269
const encoder = new TextEncoder()
7370

74-
rt0.send(new Uint8Array(encoder.encode("hi")))
71+
client0.sendRealtimeData(new Uint8Array(encoder.encode("hi")))
7572

7673
expect(client1Heard).toMatchObject([
7774
"hi"
7875
])
79-
expect(client0Heard).toMatchObject([]) */
76+
expect(client0Heard).toMatchObject([])
8077
});
78+
8179
test("distribute to self and other", () => {
8280
const [getMessages, onMessage] = track();
8381
const processor = createProcessor(onMessage);

backend/message.ts

+5-47
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ type UpdateListenerMulti = (updates: ReceivedStatusUpdate<any>[]) => boolean;
1111

1212
type ClearListener = () => boolean;
1313
type DeleteListener = () => boolean;
14-
type RealtimeListenerListener = (data: Uint8Array) => boolean;
14+
type RTListener = (data: Uint8Array) => boolean;
1515

1616
type Connect = (
1717
updateListener: UpdateListenerMulti,
@@ -22,7 +22,7 @@ type Connect = (
2222

2323
export type WebXdcMulti = {
2424
connect: Connect;
25-
connectRealtime: (listener: RealtimeListenerListener) => void;
25+
connectRealtime: (listener: RTListener) => void;
2626
sendUpdate: Webxdc<any>["sendUpdate"];
2727
sendRealtimeData: (data: Uint8Array) => void;
2828
};
@@ -37,51 +37,9 @@ export interface IProcessor {
3737
removeClient(id: string): void;
3838
}
3939

40-
export class RealtimeListener implements WebxdcRealtimeListener {
41-
private trashed = false;
42-
private listener: (data: Uint8Array) => void = () => {};
43-
44-
constructor(
45-
public sendHook: (data: Uint8Array) => void = () => {},
46-
public setListenerHook: () => void = () => {},
47-
private leaveHook: () => void = () => {},
48-
) {}
49-
50-
is_trashed(): boolean {
51-
return this.trashed;
52-
}
53-
54-
receive(data: Uint8Array) {
55-
if (this.trashed) {
56-
throw new Error("realtime listener is trashed and can no longer be used");
57-
}
58-
if (this.listener) {
59-
this.listener(data);
60-
}
61-
}
62-
63-
setListener(listener: (data: Uint8Array) => void) {
64-
this.setListenerHook();
65-
this.listener = listener;
66-
}
67-
68-
send(data: Uint8Array) {
69-
if (!(data instanceof Uint8Array)) {
70-
throw new Error("realtime listener data must be a Uint8Array");
71-
}
72-
this.sendHook(data);
73-
}
74-
75-
leave() {
76-
this.leaveHook();
77-
this.trashed = true;
78-
}
79-
}
80-
8140
class Client implements WebXdcMulti {
8241
updateListener: UpdateListenerMulti | null = null;
83-
realtimeListener: RealtimeListenerListener | null = null;
84-
realtime: RealtimeListener | null = null;
42+
realtimeListener: RTListener | null = null;
8543
clearListener: ClearListener | null = null;
8644
updateSerial: number | null = null;
8745
deleteListener: DeleteListener | null = null;
@@ -95,11 +53,11 @@ class Client implements WebXdcMulti {
9553
this.processor.distribute(this.id, update);
9654
}
9755

98-
sendRealtimeData(data: Uint8Array): void {
56+
sendRealtimeData(data: Uint8Array){
9957
this.processor.distributeRealtime(this.id, data);
10058
}
10159

102-
connectRealtime(listener: RealtimeListenerListener) {
60+
connectRealtime(listener: RTListener) {
10361
this.processor.onMessage({
10462
type: "connect-realtime",
10563
instanceId: this.id,

sim/create.ts

+51-10
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
import { Webxdc, ReceivedStatusUpdate } from "@webxdc/types";
2-
import { RealtimeListener as RTL } from "../backend/message";
1+
import { Webxdc, ReceivedStatusUpdate, RealtimeListener as WebxdcRealtimeListener } from "@webxdc/types";
32
type UpdatesMessage = {
43
type: "updates";
54
updates: ReceivedStatusUpdate<any>[];
65
};
76

8-
type SendRealtimeMessage = {
9-
type: "sendRealtime";
7+
type RealtimeMessage = {
8+
type: "realtime";
109
data: Uint8Array;
1110
};
1211

@@ -33,7 +32,7 @@ type Message =
3332
| ClearMessage
3433
| InfoMessage
3534
| DeleteMessage
36-
| SendRealtimeMessage;
35+
| RealtimeMessage;
3736

3837
export type TransportMessageCallback = (message: Message) => void;
3938

@@ -52,12 +51,54 @@ export type Transport = {
5251

5352
type Log = (...args: any[]) => void;
5453

54+
export class RealtimeListener implements WebxdcRealtimeListener {
55+
private trashed = false;
56+
private listener: (data: Uint8Array) => void = () => {};
57+
58+
constructor(
59+
public sendHook: (data: Uint8Array) => void = () => {},
60+
public setListenerHook: () => void = () => {},
61+
private leaveHook: () => void = () => {},
62+
) {}
63+
64+
is_trashed(): boolean {
65+
return this.trashed;
66+
}
67+
68+
receive(data: Uint8Array) {
69+
if (this.trashed) {
70+
throw new Error("realtime listener is trashed and can no longer be used");
71+
}
72+
if (this.listener) {
73+
this.listener(data);
74+
}
75+
}
76+
77+
setListener(listener: (data: Uint8Array) => void) {
78+
this.setListenerHook();
79+
this.listener = listener;
80+
}
81+
82+
send(data: Uint8Array) {
83+
if (!(data instanceof Uint8Array)) {
84+
throw new Error("realtime listener data must be a Uint8Array");
85+
}
86+
this.sendHook(data);
87+
}
88+
89+
leave() {
90+
this.leaveHook();
91+
this.trashed = true;
92+
}
93+
}
94+
5595
export function createWebXdc(
5696
transport: Transport,
5797
log: Log = () => {},
5898
): Webxdc<any> {
5999
let resolveUpdateListenerPromise: (() => void) | null = null;
60-
let realtime: RTL | null = null;
100+
let realtime: RealtimeListener | null = null;
101+
61102
const webXdc: Webxdc<any> = {
62103
sendUpdate: (update) => {
63104
transport.send({ type: "sendUpdate", update });
@@ -208,7 +249,7 @@ export function createWebXdc(
208249
},
209250

210251
joinRealtimeChannel: () => {
211-
realtime = new RTL(
252+
realtime = new RealtimeListener(
212253
() => {},
213254
() => {
214255
transport.send({ type: "setRealtimeListener" });
@@ -219,7 +260,7 @@ export function createWebXdc(
219260
);
220261
transport.onConnect(() => {
221262
realtime!.sendHook = (data) => {
222-
transport.send({ type: "sendRealtime", data } as SendRealtimeMessage);
263+
transport.send({ type: "realtime", data } as RealtimeMessage);
223264
log("send realtime", { data });
224265
};
225266
});
@@ -241,8 +282,8 @@ function isUpdatesMessage(data: Message): data is UpdatesMessage {
241282
return data.type === "updates";
242283
}
243284

244-
function isRealtimeMessage(data: Message): data is SendRealtimeMessage {
245-
return data.type === "sendRealtime";
285+
function isRealtimeMessage(data: Message): data is RealtimeMessage {
286+
return data.type === "realtime";
246287
}
247288

248289
function isClearMessage(data: Message): data is ClearMessage {

0 commit comments

Comments
 (0)