@eleven-am/pondsocket 0.1.48 → 0.1.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/channel.js +11 -2
- package/client/channel.test.js +19 -1
- package/package.json +1 -1
- package/server/presence/presenceEngine.js +1 -1
- package/types.d.ts +28 -16
package/client/channel.js
CHANGED
|
@@ -74,10 +74,10 @@ class Channel {
|
|
|
74
74
|
});
|
|
75
75
|
}
|
|
76
76
|
/**
|
|
77
|
-
* @desc Monitors the
|
|
77
|
+
* @desc Monitors the channel state of the channel.
|
|
78
78
|
* @param callback - The callback to call when the connection state changes.
|
|
79
79
|
*/
|
|
80
|
-
|
|
80
|
+
onChannelStateChange(callback) {
|
|
81
81
|
return this._joinState.subscribe((data) => {
|
|
82
82
|
callback(data);
|
|
83
83
|
});
|
|
@@ -165,6 +165,15 @@ class Channel {
|
|
|
165
165
|
isConnected() {
|
|
166
166
|
return this._joinState.value === enums_1.ChannelState.JOINED || this._joinState.value === enums_1.ChannelState.JOINING;
|
|
167
167
|
}
|
|
168
|
+
/**
|
|
169
|
+
* @desc Monitors the connection state of the channel.
|
|
170
|
+
* @param callback - The callback to call when the connection state changes.
|
|
171
|
+
*/
|
|
172
|
+
onConnectionChange(callback) {
|
|
173
|
+
return this.onChannelStateChange((state) => {
|
|
174
|
+
callback(state === enums_1.ChannelState.JOINED || state === enums_1.ChannelState.JOINING);
|
|
175
|
+
});
|
|
176
|
+
}
|
|
168
177
|
_send(event, payload, receivers = 'all_users') {
|
|
169
178
|
const message = {
|
|
170
179
|
action: enums_1.ClientActions.BROADCAST,
|
package/client/channel.test.js
CHANGED
|
@@ -83,7 +83,7 @@ describe('Channel', () => {
|
|
|
83
83
|
it('should notify subscribers when the channel state changes', () => {
|
|
84
84
|
const { channel, receiver } = createChannel();
|
|
85
85
|
const stateListener = jest.fn();
|
|
86
|
-
channel.
|
|
86
|
+
channel.onChannelStateChange(stateListener);
|
|
87
87
|
expect(stateListener).toHaveBeenCalledWith(enums_1.ChannelState.IDLE);
|
|
88
88
|
channel.join();
|
|
89
89
|
receiver.next({
|
|
@@ -98,6 +98,24 @@ describe('Channel', () => {
|
|
|
98
98
|
channel.leave();
|
|
99
99
|
expect(stateListener).toHaveBeenCalledWith(enums_1.ChannelState.CLOSED);
|
|
100
100
|
});
|
|
101
|
+
it('should notify subscribers when state changes BOOLEAN', () => {
|
|
102
|
+
const { channel, receiver } = createChannel();
|
|
103
|
+
const stateListener = jest.fn();
|
|
104
|
+
channel.onConnectionChange(stateListener);
|
|
105
|
+
expect(stateListener).toHaveBeenCalledWith(false);
|
|
106
|
+
channel.join();
|
|
107
|
+
receiver.next({
|
|
108
|
+
action: 'SYSTEM',
|
|
109
|
+
channelName: 'test',
|
|
110
|
+
event: 'SYSTEM',
|
|
111
|
+
payload: {
|
|
112
|
+
event: 'JOIN',
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
expect(stateListener).toHaveBeenCalledWith(true);
|
|
116
|
+
channel.leave();
|
|
117
|
+
expect(stateListener).toHaveBeenCalledWith(false);
|
|
118
|
+
});
|
|
101
119
|
it('should correctly send a message', () => {
|
|
102
120
|
const { channel, publisher, state } = createChannel();
|
|
103
121
|
expect(channel.channelState).toBe(enums_1.ChannelState.IDLE);
|
package/package.json
CHANGED
|
@@ -54,7 +54,7 @@ class PresenceEngine {
|
|
|
54
54
|
updatePresence(presenceKey, presence) {
|
|
55
55
|
const oldPresence = this._presenceMap.get(presenceKey);
|
|
56
56
|
if (oldPresence) {
|
|
57
|
-
this._presenceMap.set(presenceKey, presence);
|
|
57
|
+
this._presenceMap.set(presenceKey, Object.assign(Object.assign({}, oldPresence), presence));
|
|
58
58
|
this._presence.next({
|
|
59
59
|
type: enums_1.PresenceEventTypes.UPDATE,
|
|
60
60
|
changed: Object.assign(Object.assign({}, oldPresence), presence),
|
package/types.d.ts
CHANGED
|
@@ -5,6 +5,8 @@ import internal from 'stream';
|
|
|
5
5
|
import { Express } from 'express';
|
|
6
6
|
import { WebSocketServer, WebSocket } from 'ws';
|
|
7
7
|
|
|
8
|
+
import { ClientActions, PresenceEventTypes, ChannelState } from './enums';
|
|
9
|
+
|
|
8
10
|
export type PondPath = string | RegExp;
|
|
9
11
|
type NextFunction = () => void;
|
|
10
12
|
export type JoinParams = Record<string, any>;
|
|
@@ -15,24 +17,27 @@ export type EndpointHandler = (req: IncomingConnection, res: ConnectionResponse)
|
|
|
15
17
|
type SocketCache = Pick<RequestCache, 'socket' | 'clientId' | 'assigns'>;
|
|
16
18
|
type AuthorizeMiddleware = (request: JoinRequest, response: JoinResponse) => void | Promise<void>;
|
|
17
19
|
type SocketMiddlewareFunction = (req: IncomingMessage, socket: internal.Duplex, head: Buffer, next: NextFunction) => void;
|
|
20
|
+
export type ChannelReceivers = 'all_users' | 'all_except_sender' | string[];
|
|
21
|
+
export type ChannelEvent = Event | PresenceEvent;
|
|
18
22
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
+
interface Event {
|
|
24
|
+
action: 'SYSTEM' | 'BROADCAST' | 'ERROR';
|
|
25
|
+
event: string;
|
|
26
|
+
payload: PondMessage;
|
|
27
|
+
channelName: string;
|
|
23
28
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
export interface ClientMessage {
|
|
30
|
+
action: ClientActions;
|
|
31
|
+
channelName: string;
|
|
32
|
+
event: string;
|
|
33
|
+
payload: Record<string, any>;
|
|
34
|
+
addresses?: ChannelReceivers;
|
|
29
35
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
CLOSED = 'CLOSED',
|
|
36
|
+
interface PresenceEvent {
|
|
37
|
+
action: 'PRESENCE';
|
|
38
|
+
event: PresenceEventTypes;
|
|
39
|
+
channelName: string;
|
|
40
|
+
payload: PresencePayload;
|
|
36
41
|
}
|
|
37
42
|
interface RequestCache {
|
|
38
43
|
clientId: string;
|
|
@@ -99,6 +104,7 @@ interface PondSocketExpressApp extends Express {
|
|
|
99
104
|
*/
|
|
100
105
|
upgrade(path: PondPath, handler: EndpointHandler): Endpoint;
|
|
101
106
|
}
|
|
107
|
+
export type PondState = 'CONNECTING' | 'OPEN' | 'CLOSING' | 'CLOSED';
|
|
102
108
|
type Unsubscribe = () => void;
|
|
103
109
|
|
|
104
110
|
export interface PresencePayload {
|
|
@@ -134,7 +140,13 @@ export declare class Channel {
|
|
|
134
140
|
* @desc Monitors the connection state of the channel.
|
|
135
141
|
* @param callback - The callback to call when the connection state changes.
|
|
136
142
|
*/
|
|
137
|
-
public onConnectionChange(callback: (connected:
|
|
143
|
+
public onConnectionChange(callback: (connected: boolean) => void): Unsubscribe;
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* @desc Monitors the channel state of the channel.
|
|
147
|
+
* @param callback - The callback to call when the connection state changes.
|
|
148
|
+
*/
|
|
149
|
+
public onChannelStateChange (callback: (connected: ChannelState) => void): Unsubscribe;
|
|
138
150
|
|
|
139
151
|
/**
|
|
140
152
|
* @desc Detects when clients join the channel.
|