aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/bindings/webcore/WebSocket.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/bun.js/bindings/webcore/WebSocket.h')
-rw-r--r--src/bun.js/bindings/webcore/WebSocket.h165
1 files changed, 165 insertions, 0 deletions
diff --git a/src/bun.js/bindings/webcore/WebSocket.h b/src/bun.js/bindings/webcore/WebSocket.h
new file mode 100644
index 000000000..03c0d7709
--- /dev/null
+++ b/src/bun.js/bindings/webcore/WebSocket.h
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include "ContextDestructionObserver.h"
+#include "EventTarget.h"
+#include "ExceptionOr.h"
+#include <wtf/URL.h>
+#include <wtf/HashSet.h>
+#include <wtf/Lock.h>
+
+namespace uWS {
+template<bool, bool, typename>
+struct WebSocket;
+}
+
+namespace JSC {
+class ArrayBuffer;
+class ArrayBufferView;
+}
+
+namespace WebCore {
+
+// class Blob;
+class WebSocket final : public RefCounted<WebSocket>, public EventTargetWithInlineData, public ContextDestructionObserver {
+ WTF_MAKE_ISO_ALLOCATED(WebSocket);
+
+public:
+ static ASCIILiteral subprotocolSeparator();
+
+ static ExceptionOr<Ref<WebSocket>> create(ScriptExecutionContext&, const String& url);
+ static ExceptionOr<Ref<WebSocket>> create(ScriptExecutionContext&, const String& url, const String& protocol);
+ static ExceptionOr<Ref<WebSocket>> create(ScriptExecutionContext&, const String& url, const Vector<String>& protocols);
+ ~WebSocket();
+
+ enum State {
+ CONNECTING = 0,
+ OPEN = 1,
+ CLOSING = 2,
+ CLOSED = 3,
+
+ };
+
+ ExceptionOr<void> connect(const String& url);
+ ExceptionOr<void> connect(const String& url, const String& protocol);
+ ExceptionOr<void> connect(const String& url, const Vector<String>& protocols);
+
+ ExceptionOr<void> send(const String& message);
+ ExceptionOr<void> send(JSC::ArrayBuffer&);
+ ExceptionOr<void> send(JSC::ArrayBufferView&);
+ // ExceptionOr<void> send(Blob&);
+
+ ExceptionOr<void> close(std::optional<unsigned short> code, const String& reason);
+
+ const URL& url() const;
+ State readyState() const;
+ unsigned bufferedAmount() const;
+
+ String protocol() const;
+ String extensions() const;
+
+ String binaryType() const;
+ ExceptionOr<void> setBinaryType(const String&);
+
+ ScriptExecutionContext* scriptExecutionContext() const final;
+
+ using RefCounted::deref;
+ using RefCounted::ref;
+ void didConnect();
+ void didClose(unsigned unhandledBufferedAmount, unsigned short code, const String& reason);
+ void didConnect(us_socket_t* socket, char* bufferedData, size_t bufferedDataSize);
+ void didFailWithErrorCode(int32_t code);
+
+ void didReceiveMessage(String&& message);
+ void didReceiveData(const char* data, size_t length);
+ void didReceiveBinaryData(Vector<uint8_t>&&);
+
+private:
+ typedef union AnyWebSocket {
+ WebSocketClient* client;
+ WebSocketClientTLS* clientSSL;
+ uWS::WebSocket<false, true, WebCore::WebSocket*>* server;
+ uWS::WebSocket<true, true, WebCore::WebSocket*>* serverSSL;
+ } AnyWebSocket;
+ enum ConnectedWebSocketKind {
+ None,
+ Client,
+ ClientSSL,
+ Server,
+ ServerSSL
+ };
+
+ explicit WebSocket(ScriptExecutionContext&);
+ explicit WebSocket(ScriptExecutionContext&, const String& url);
+
+ void dispatchErrorEventIfNeeded();
+
+ // void contextDestroyed() final;
+ // void suspend(ReasonForSuspension) final;
+ // void resume() final;
+ // void stop() final;
+ // const char* activeDOMObjectName() const final;
+
+ EventTargetInterface eventTargetInterface() const final;
+
+ void refEventTarget() final { ref(); }
+ void derefEventTarget() final { deref(); }
+
+ void didReceiveMessageError(WTF::StringImpl::StaticStringImpl* reason);
+ void didUpdateBufferedAmount(unsigned bufferedAmount);
+ void didStartClosingHandshake();
+
+ void sendWebSocketString(const String& message);
+ void sendWebSocketData(const char* data, size_t length);
+
+ void failAsynchronously();
+
+ enum class BinaryType { Blob,
+ ArrayBuffer };
+
+ State m_state { CONNECTING };
+ URL m_url;
+ unsigned m_bufferedAmount { 0 };
+ unsigned m_bufferedAmountAfterClose { 0 };
+ BinaryType m_binaryType { BinaryType::ArrayBuffer };
+ String m_subprotocol;
+ String m_extensions;
+ void* m_upgradeClient { nullptr };
+ bool m_isSecure { false };
+ AnyWebSocket m_connectedWebSocket { nullptr };
+ ConnectedWebSocketKind m_connectedWebSocketKind { ConnectedWebSocketKind::None };
+
+ bool m_dispatchedErrorEvent { false };
+ // RefPtr<PendingActivity<WebSocket>> m_pendingActivity;
+};
+
+} // namespace WebCore