in src/bun.js/bindings/webcore/WebSocket.cpp [1264:1454]
void WebSocket::didFailWithErrorCode(int32_t code)
{
// from new WebSocket() -> connect()
if (m_state == CLOSED)
return;
this->m_upgradeClient = nullptr;
this->m_connectedWebSocketKind = ConnectedWebSocketKind::None;
this->m_connectedWebSocket.client = nullptr;
switch (code) {
// cancel
case 0: {
break;
}
// invalid_response
case 1: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Invalid response");
didReceiveClose(CleanStatus::NotClean, 1002, message);
break;
}
// expected_101_status_code
case 2: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Expected 101 status code");
didReceiveClose(CleanStatus::NotClean, 1002, message);
break;
}
// missing_upgrade_header
case 3: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Missing upgrade header");
didReceiveClose(CleanStatus::NotClean, 1002, message);
break;
}
// missing_connection_header
case 4: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Missing connection header");
didReceiveClose(CleanStatus::NotClean, 1002, message);
break;
}
// missing_websocket_accept_header
case 5: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Missing websocket accept header");
didReceiveClose(CleanStatus::NotClean, 1002, message);
break;
}
// invalid_upgrade_header
case 6: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Invalid upgrade header");
didReceiveClose(CleanStatus::NotClean, 1002, message);
break;
}
// invalid_connection_header
case 7: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Invalid connection header");
didReceiveClose(CleanStatus::NotClean, 1002, message);
break;
}
// invalid_websocket_version
case 8: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Invalid websocket version");
didReceiveClose(CleanStatus::NotClean, 1002, message);
break;
}
// mismatch_websocket_accept_header
case 9: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Mismatch websocket accept header");
didReceiveClose(CleanStatus::NotClean, 1002, message);
break;
}
// missing_client_protocol
case 10: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Missing client protocol");
didReceiveClose(CleanStatus::Clean, 1002, message);
break;
}
// mismatch_client_protocol
case 11: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Mismatch client protocol");
didReceiveClose(CleanStatus::Clean, 1002, message);
break;
}
// timeout
case 12: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Timeout");
didReceiveClose(CleanStatus::Clean, 1013, message);
break;
}
// closed
case 13: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Closed by client");
didReceiveClose(CleanStatus::Clean, 1000, message);
break;
}
// failed_to_write
case 14: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Failed to write");
didReceiveClose(CleanStatus::NotClean, 1006, message);
break;
}
// failed_to_connect
case 15: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Failed to connect");
didReceiveClose(CleanStatus::NotClean, 1006, message, true);
break;
}
// headers_too_large
case 16: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Headers too large");
didReceiveClose(CleanStatus::NotClean, 1007, message);
break;
}
// ended
case 17: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Connection ended");
didReceiveClose(CleanStatus::NotClean, 1006, message);
break;
}
// failed_to_allocate_memory
case 18: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Failed to allocate memory");
didReceiveClose(CleanStatus::NotClean, 1001, message);
break;
}
// control_frame_is_fragmented
case 19: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Protocol error - control frame is fragmented");
didReceiveClose(CleanStatus::NotClean, 1002, message);
break;
}
// invalid_control_frame
case 20: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Protocol error - invalid control frame");
didReceiveClose(CleanStatus::NotClean, 1002, message);
break;
}
// compression_unsupported
case 21: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Compression not implemented yet");
didReceiveClose(CleanStatus::Clean, 1011, message);
break;
}
// unexpected_mask_from_server
case 22: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Protocol error - unexpected mask from server");
didReceiveClose(CleanStatus::NotClean, 1002, message);
break;
}
// expected_control_frame
case 23: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Protocol error - expected control frame");
didReceiveClose(CleanStatus::NotClean, 1002, message);
break;
}
// unsupported_control_frame
case 24: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Protocol error - unsupported control frame");
didReceiveClose(CleanStatus::NotClean, 1002, message);
break;
}
// unexpected_opcode
case 25: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Protocol error - unexpected opcode");
didReceiveClose(CleanStatus::NotClean, 1002, message);
break;
}
// invalid_utf8
case 26: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("Server sent invalid UTF8");
didReceiveClose(CleanStatus::NotClean, 1003, message);
break;
}
// tls_handshake_failed
case 27: {
static NeverDestroyed<String> message = MAKE_STATIC_STRING_IMPL("TLS handshake failed");
didReceiveClose(CleanStatus::NotClean, 1015, message);
break;
}
}
m_state = CLOSED;
if (auto* context = scriptExecutionContext()) {
context->postTask([protectedThis = Ref { *this }](ScriptExecutionContext& context) {
protectedThis->decPendingActivityCount();
});
} else {
// we fallback if we don't have a context
this->decPendingActivityCount();
}
}