Skip to content

Commit

Permalink
Add ping to WebSocket
Browse files Browse the repository at this point in the history
Summary:
Idle WebSocket connections get reset after a few minutes of inactivity. To prevent this, most WebSocket implementations offer sending special ping messages. This PR adds a method `sendPing()` to  WebSocket. Ping payloads are not supported.

Manual testing can be done by adding `connection.on('ping', _ => console.log('Received ping'));` to a ws connection or using a packet sniffer while sending pings.
Closes #8505

Differential Revision: D3516260

Pulled By: dmmiller

fbshipit-source-id: cfebf5899188ae53254d5be6b666a9075e0eed89
  • Loading branch information
dbasedow authored and Facebook Github Bot 4 committed Jul 5, 2016
1 parent f48baba commit 4ac4f86
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 0 deletions.
5 changes: 5 additions & 0 deletions Libraries/WebSocket/RCTWebSocketModule.m
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,11 @@ - (void)dealloc
[_sockets[socketID] send:message];
}

RCT_EXPORT_METHOD(ping:(nonnull NSNumber *)socketID)
{
[_sockets[socketID] sendPing:NULL];
}

RCT_EXPORT_METHOD(close:(nonnull NSNumber *)socketID)
{
[_sockets[socketID] close];
Expand Down
8 changes: 8 additions & 0 deletions Libraries/WebSocket/WebSocket.js
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,14 @@ class WebSocket extends EventTarget(...WEBSOCKET_EVENTS) {
throw new Error('Unsupported data type');
}

ping(): void {
if (this.readyState === this.CONNECTING) {
throw new Error('INVALID_STATE_ERR');
}

RCTWebSocketModule.ping(this._socketId);
}

_close(code?: number, reason?: string): void {
if (Platform.OS === 'android') {
// See https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,21 @@ public void sendBinary(String base64String, int id) {
}
}

@ReactMethod
public void ping(int id) {
WebSocket client = mWebSocketConnections.get(id);
if (client == null) {
// This is a programmer error
throw new RuntimeException("Cannot send a message. Unknown WebSocket id " + id);
}
try {
Buffer buffer = new Buffer();
client.sendPing(buffer);
} catch (IOException | IllegalStateException e) {
notifyWebSocketFailed(id, e.getMessage());
}
}

private void notifyWebSocketFailed(int id, String message) {
WritableMap params = Arguments.createMap();
params.putInt("id", id);
Expand Down

0 comments on commit 4ac4f86

Please sign in to comment.