diff options
author | 2023-09-29 03:39:26 -0700 | |
---|---|---|
committer | 2023-09-29 03:39:26 -0700 | |
commit | 6afa78120ac0512bc55d00a8a1562d8f0eafa2c2 (patch) | |
tree | 6a413589452d966f42c1e97e39fd11a82308e565 /src/bun.js/bindings/JSSocketAddress.cpp | |
parent | 6514dcf4cbc63cff89f3cac59598872caf776f0b (diff) | |
download | bun-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.cpp | 61 |
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; +} |