aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/bindings/JSSocketAddress.cpp
diff options
context:
space:
mode:
authorGravatar dave caruso <me@paperdave.net> 2023-09-29 03:39:26 -0700
committerGravatar GitHub <noreply@github.com> 2023-09-29 03:39:26 -0700
commit6afa78120ac0512bc55d00a8a1562d8f0eafa2c2 (patch)
tree6a413589452d966f42c1e97e39fd11a82308e565 /src/bun.js/bindings/JSSocketAddress.cpp
parent6514dcf4cbc63cff89f3cac59598872caf776f0b (diff)
downloadbun-6afa78120ac0512bc55d00a8a1562d8f0eafa2c2.tar.gz
bun-6afa78120ac0512bc55d00a8a1562d8f0eafa2c2.tar.zst
bun-6afa78120ac0512bc55d00a8a1562d8f0eafa2c2.zip
feat(runtime): implement `server.requestIp` + node:http `socket.address()` (#6165)
* [server] requestIp and AnyRequestContext Changed Request.uws_request to the new AnyRequestContext. This allows grabbing the IP from a Request. Unfinished. * [server] basic `requestIp` implementation Currently using uws's requestIpAsText, which always returns a ipv6 string. We should return a `SocketAddress` object to the user instead, which will contain the formatted address string and what type it is. We'll have to use requestIpAsBinary and parse that ourselves. * TypeScript docs, use `bun.String`, return `undefined` instead of `null` if we can't get the ip. * binary address formatting * uws getRemoteAddress binding * remove dead code * working * final touches:sparkles: * I will abide by the results of this poll. --------- Co-authored-by: Parzival-3141 <29632054+Parzival-3141@users.noreply.github.com>
Diffstat (limited to 'src/bun.js/bindings/JSSocketAddress.cpp')
-rw-r--r--src/bun.js/bindings/JSSocketAddress.cpp61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/bun.js/bindings/JSSocketAddress.cpp b/src/bun.js/bindings/JSSocketAddress.cpp
new file mode 100644
index 000000000..53084adb6
--- /dev/null
+++ b/src/bun.js/bindings/JSSocketAddress.cpp
@@ -0,0 +1,61 @@
+#include "JSSocketAddress.h"
+#include "ZigGlobalObject.h"
+#include "JavaScriptCore/JSObjectInlines.h"
+#include "JavaScriptCore/ObjectConstructor.h"
+#include "JavaScriptCore/JSCast.h"
+
+using namespace JSC;
+
+namespace Bun {
+namespace JSSocketAddress {
+
+// Using a structure with inlined offsets will be more lightweight than a class.
+
+Structure* createStructure(VM& vm, JSGlobalObject* globalObject)
+{
+ JSC::Structure* structure = globalObject->structureCache().emptyObjectStructureForPrototype(
+ globalObject,
+ globalObject->objectPrototype(),
+ 3);
+
+ JSC::PropertyOffset offset;
+ structure = structure->addPropertyTransition(
+ vm,
+ structure,
+ JSC::Identifier::fromString(vm, "address"_s),
+ 0,
+ offset);
+
+ structure = structure->addPropertyTransition(
+ vm,
+ structure,
+ JSC::Identifier::fromString(vm, "family"_s),
+ 0,
+ offset);
+
+ structure = structure->addPropertyTransition(
+ vm,
+ structure,
+ JSC::Identifier::fromString(vm, "port"_s),
+ 0,
+ offset);
+
+ return structure;
+}
+
+} // namespace JSSocketAddress
+} // namespace Bun
+
+extern "C" JSObject* JSSocketAddress__create(JSGlobalObject* globalObject, JSString* value, int32_t port, bool isIPv6)
+{
+ VM& vm = globalObject->vm();
+
+ auto* global = jsCast<Zig::GlobalObject*>(globalObject);
+
+ JSObject* thisObject = constructEmptyObject(vm, global->JSSocketAddressStructure());
+ thisObject->putDirectOffset(vm, 0, value);
+ thisObject->putDirectOffset(vm, 1, isIPv6 ? jsString(vm, Bun::JSSocketAddress::IPv6) : jsString(vm, Bun::JSSocketAddress::IPv4));
+ thisObject->putDirectOffset(vm, 2, jsNumber(port));
+
+ return thisObject;
+}