mirror of
https://github.com/oven-sh/bun
synced 2026-02-09 10:28:47 +00:00
### What does this PR do? BeforeOpen code is not necessary since we have `setOnSocketUpgraded` callback now,and we should NOT convert websocket to a response, make sure that no closed socket is passed to `JSNodeHTTPServerSocket`, change isIdle to be inside AsyncSocketData to be more reliable (works for websocket and normal sockets) ### How did you verify your code works? CI --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
92 lines
2.4 KiB
C++
92 lines
2.4 KiB
C++
#pragma once
|
|
/*
|
|
* Authored by Alex Hultman, 2018-2021.
|
|
* Intellectual property of third-party.
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef UWS_ASYNCSOCKETDATA_H
|
|
#define UWS_ASYNCSOCKETDATA_H
|
|
|
|
#include <string>
|
|
|
|
namespace uWS {
|
|
|
|
struct BackPressure {
|
|
std::string buffer;
|
|
unsigned int pendingRemoval = 0;
|
|
BackPressure(BackPressure &&other) {
|
|
buffer = std::move(other.buffer);
|
|
pendingRemoval = other.pendingRemoval;
|
|
}
|
|
BackPressure() = default;
|
|
void append(const char *data, size_t length) {
|
|
buffer.append(data, length);
|
|
}
|
|
void erase(unsigned int length) {
|
|
pendingRemoval += length;
|
|
/* Always erase a minimum of 1/32th the current backpressure */
|
|
if (pendingRemoval > (buffer.length() >> 5)) {
|
|
buffer.erase(0, pendingRemoval);
|
|
buffer.shrink_to_fit();
|
|
pendingRemoval = 0;
|
|
}
|
|
}
|
|
size_t length() {
|
|
return buffer.length() - pendingRemoval;
|
|
}
|
|
void clear() {
|
|
pendingRemoval = 0;
|
|
buffer.clear();
|
|
buffer.shrink_to_fit();
|
|
}
|
|
void reserve(size_t length) {
|
|
buffer.reserve(length + pendingRemoval);
|
|
}
|
|
void resize(size_t length) {
|
|
buffer.resize(length + pendingRemoval);
|
|
}
|
|
const char *data() {
|
|
return buffer.data() + pendingRemoval;
|
|
}
|
|
size_t size() {
|
|
return length();
|
|
}
|
|
/* The total length, incuding pending removal */
|
|
size_t totalLength() {
|
|
return buffer.length();
|
|
}
|
|
};
|
|
|
|
/* Depending on how we want AsyncSocket to function, this will need to change */
|
|
|
|
template <bool SSL>
|
|
struct AsyncSocketData {
|
|
/* This will do for now */
|
|
BackPressure buffer;
|
|
|
|
/* Allow move constructing us */
|
|
AsyncSocketData(BackPressure &&backpressure) : buffer(std::move(backpressure)) {
|
|
|
|
}
|
|
|
|
/* Or empty */
|
|
AsyncSocketData() = default;
|
|
bool isIdle = false;
|
|
};
|
|
|
|
}
|
|
|
|
#endif // UWS_ASYNCSOCKETDATA_H
|