Skip to content

Commit 4e7ab46

Browse files
committed
fix: grouped client bug
1 parent 787bef6 commit 4e7ab46

File tree

5 files changed

+47
-25
lines changed

5 files changed

+47
-25
lines changed

Readme.MD

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ Many times this happens that Websocket server sends data to Browser without bein
5555
// SERVER
5656
const { clients, router, server } = new RestifyWebSocket.Server()
5757
clients.find('*').get('/stocks/goldman-sachs', {
58-
data: [1, 2, 3] // it is body because we are sending for browser
58+
data: [1, 2, 3] // it is not body, like typical fetch, because we are sending for browser
5959
})
6060

6161
### Multiple Tabs Communication

src/client.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ export type ClientPromiseStore = Record<
2424
}
2525
>;
2626

27+
const stringify = (v: any) => {
28+
return JSON.stringify(v);
29+
};
2730
export class Client {
2831
id: number = -1;
2932
socket: WebSocket;
@@ -34,9 +37,9 @@ export class Client {
3437
const { forget, ...remaining } = options;
3538
if (!forget) {
3639
this.id += 1;
37-
message = JSON.stringify({ ...remaining, [method]: url, id: this.id });
40+
message = stringify({ ...remaining, [method]: url, id: this.id });
3841
} else {
39-
message = JSON.stringify({ ...remaining, [method]: url });
42+
message = stringify({ ...remaining, [method]: url });
4043
}
4144
socket = this.socket;
4245
if (socket.CONNECTING === socket.readyState) {
@@ -88,7 +91,7 @@ export class ServerClient {
8891
method(method: 'get' | 'post' | 'put' | 'patch' | 'delete', url: string, options: ServerClientRequest = {}) {
8992
const { data, ...remaining } = options;
9093
let sockets = this.sockets,
91-
message = JSON.stringify({ [method]: url, data: data, ...remaining });
94+
message = stringify({ [method]: url, data: data, ...remaining });
9295
sockets = this.sockets;
9396
sockets.forEach((socket) => socket.send(message));
9497
}

src/index.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ type X = WebSocket | string;
88
type WebSocketPlusOptions = {
99
firstReconnectDelay?: number;
1010
maxReconnectDelay?: number;
11+
connectWithDelay?: number;
1112
};
1213
type Options = ClientOptions & WebSocketPlusOptions;
1314
type Events = 'open' | 'close' | 'message' | 'error';
@@ -101,7 +102,7 @@ class RestifyWebSocket<T extends X> {
101102
>;
102103
connect(options: Options = {}) {
103104
const { firstReconnectDelay = 100, maxReconnectDelay = 30000, ...nativeOptions } = options;
104-
const socket: WebSocket = new WebSocket(this.url, this.url.split(':')[0], options);
105+
const socket: WebSocket = new WebSocket(this.url, this.url.split(':')[0], nativeOptions);
105106
this.socket = socket;
106107
let event: Events;
107108
for (event in this.eventStore) {
@@ -167,11 +168,16 @@ class RestifyWebSocket<T extends X> {
167168
let socket: WebSocket;
168169
if (typeof urlOrSocket === 'string') {
169170
this.url = urlOrSocket;
170-
socket = this.connect(options);
171+
if (options.connectWithDelay) {
172+
setTimeout(() => {
173+
socket = this.connect(options);
174+
}, options.connectWithDelay);
175+
} else socket = this.connect(options);
171176
} else {
172177
socket = urlOrSocket;
173178
this.onSocketCreated(socket);
174179
}
180+
if (options.connectWithDelay) return;
175181
this.socket = socket;
176182
}
177183
onConnect(cb: () => void) {

src/receiver.ts

+7-5
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ export type ReceiverRoute = {
2424
};
2525
export type ReceiverRequest<P extends object = object> = {} & MatchResult<P>;
2626

27+
type Params = Record<string, string | number>;
28+
2729
export class Receiver {
2830
store: ReceiverStore = {
2931
get: [],
@@ -39,19 +41,19 @@ export class Receiver {
3941
callbacks,
4042
});
4143
}
42-
get<P extends object = object>(url: string, ...callbacks: ReceiverCallback<P>[]) {
44+
get<P extends object = Params>(url: string, ...callbacks: ReceiverCallback<P>[]) {
4345
this.registerRoute('get', url, ...callbacks);
4446
}
45-
put<P extends object = object>(url: string, ...callbacks: ReceiverCallback<P>[]) {
47+
put<P extends object = Params>(url: string, ...callbacks: ReceiverCallback<P>[]) {
4648
this.registerRoute('put', url, ...callbacks);
4749
}
48-
post<P extends object = object>(url: string, ...callbacks: ReceiverCallback<P>[]) {
50+
post<P extends object = Params>(url: string, ...callbacks: ReceiverCallback<P>[]) {
4951
this.registerRoute('post', url, ...callbacks);
5052
}
51-
patch<P extends object = object>(url: string, ...callbacks: ReceiverCallback<P>[]) {
53+
patch<P extends object = Params>(url: string, ...callbacks: ReceiverCallback<P>[]) {
5254
this.registerRoute('patch', url, ...callbacks);
5355
}
54-
delete<P extends object = object>(url: string, ...callbacks: ReceiverCallback<P>[]) {
56+
delete<P extends object = Params>(url: string, ...callbacks: ReceiverCallback<P>[]) {
5557
this.registerRoute('delete', url, ...callbacks);
5658
}
5759
async listener(message: ReceiverResponse) {

src/router.ts

+25-14
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,32 @@ export type RouterResponse = {
1414
status: (code: HttpStatusCode | null) => RouterResponse;
1515
data?: any | null;
1616
groupedClients: ServerClient;
17+
socket: WebSocket;
1718
send: (data: any) => RouterResponse;
18-
group: Omit<RouterResponse, 'group' | 'othersInGroup' | 'groupedClients'>;
19-
othersInGroup: Omit<RouterResponse, 'group' | 'othersInGroup' | 'groupedClients'>;
19+
group: Omit<RouterResponse, 'group' | 'othersInGroup' | 'groupedClients' | 'socket' | 'clients'>;
20+
othersInGroup: Omit<RouterResponse, 'group' | 'othersInGroup' | 'groupedClients' | 'socket' | 'clients'>;
21+
clients: ServerClients;
2022
};
21-
export type RouterRequest = {
23+
export type RouterRequest<P extends object = object> = {
2224
id?: number;
2325
body?: any;
2426
get?: string;
2527
post?: string;
2628
put?: string;
2729
patch?: string;
2830
delete?: string;
29-
} & MatchResult<Record<string, string | number>>;
30-
export type RouterCallback = (request: RouterRequest, response: RouterResponse) => Promise<void>;
31+
} & MatchResult<P>;
32+
export type RouterCallback<P extends object = object> = (
33+
request: RouterRequest<P>,
34+
response: RouterResponse
35+
) => Promise<void>;
3136
export type Route = {
3237
literalRoute: string;
3338
match: MatchFunction<any>;
3439
callbacks: RouterCallback[];
3540
};
3641

42+
type Params = Record<string, string | number>;
3743
export class Router {
3844
store: RouterStore = {
3945
get: [],
@@ -50,19 +56,19 @@ export class Router {
5056
callbacks,
5157
});
5258
}
53-
get(url: string, ...callbacks: RouterCallback[]) {
59+
get<P extends object = Params>(url: string, ...callbacks: RouterCallback<P>[]) {
5460
this.registerRoute('get', url, ...callbacks);
5561
}
56-
put(url: string, ...callbacks: RouterCallback[]) {
62+
put<P extends object = Params>(url: string, ...callbacks: RouterCallback<P>[]) {
5763
this.registerRoute('put', url, ...callbacks);
5864
}
59-
post(url: string, ...callbacks: RouterCallback[]) {
65+
post<P extends object = Params>(url: string, ...callbacks: RouterCallback<P>[]) {
6066
this.registerRoute('post', url, ...callbacks);
6167
}
62-
patch(url: string, ...callbacks: RouterCallback[]) {
68+
patch<P extends object = Params>(url: string, ...callbacks: RouterCallback<P>[]) {
6369
this.registerRoute('patch', url, ...callbacks);
6470
}
65-
delete(url: string, ...callbacks: RouterCallback[]) {
71+
delete<P extends object = Params>(url: string, ...callbacks: RouterCallback<P>[]) {
6672
this.registerRoute('delete', url, ...callbacks);
6773
}
6874
async listener(message: RouterRequest, socket: WebSocket) {
@@ -86,9 +92,14 @@ export class Router {
8692
method = 'delete';
8793
store = this.store.delete;
8894
}
89-
const groupedClients = this.clients.find(socket['groupId']);
95+
const clients = this.clients;
9096
const response: RouterResponse = {
91-
groupedClients,
97+
socket,
98+
clients: this.clients,
99+
get groupedClients() {
100+
console.log(socket['groupId']);
101+
return clients.find(socket['groupId']);
102+
},
92103
status: function (status: HttpStatusCode | null) {
93104
if (this.code !== undefined)
94105
throw new Error(`Cannot overwrite status status(${status}) from previously set status(${this.code}) `);
@@ -138,12 +149,12 @@ export class Router {
138149
socket.send(JSON.stringify({ _id: message.id, data: response.data, status: response.code }));
139150
}
140151
if (response.group.data != null || response.group.code != null) {
141-
groupedClients.method(method, message[method], {
152+
response.groupedClients.method(method, message[method], {
142153
data: response.group.data,
143154
});
144155
}
145156
if (response.othersInGroup.data != null || response.othersInGroup.code != null) {
146-
groupedClients.method(method, message[method], {
157+
response.groupedClients.method(method, message[method], {
147158
data: response.data,
148159
});
149160
}

0 commit comments

Comments
 (0)