diff options
| -rw-r--r-- | src/bun.js/api/bun/dns_resolver.zig | 71 | ||||
| -rw-r--r-- | src/bun.js/bindings/bindings.zig | 30 | ||||
| -rw-r--r-- | test/bun.js/node-dns.test.js | 34 | 
3 files changed, 75 insertions, 60 deletions
| diff --git a/src/bun.js/api/bun/dns_resolver.zig b/src/bun.js/api/bun/dns_resolver.zig index 08202a09e..ef1c6bc4a 100644 --- a/src/bun.js/api/bun/dns_resolver.zig +++ b/src/bun.js/api/bun/dns_resolver.zig @@ -629,11 +629,10 @@ pub fn ResolveInfoRequest(comptime cares_type: type, comptime type_name: []const          pub fn init(              cache: DNSResolver.LookupCacheHit(@This()),              resolver: ?*DNSResolver, -            name_str: *const JSC.ZigString.Slice, +            name: []const u8,              globalThis: *JSC.JSGlobalObject,              comptime cache_field: []const u8,          ) !*@This() { -            const name = name_str.slice();              var request = try globalThis.allocator().create(@This());              var hasher = std.hash.Wyhash.init(0);              hasher.update(name); @@ -643,7 +642,7 @@ pub fn ResolveInfoRequest(comptime cares_type: type, comptime type_name: []const              request.* = .{                  .resolver_for_caching = resolver,                  .hash = hash, -                .head = .{ .poll_ref = poll_ref, .globalThis = globalThis, .promise = JSC.JSPromise.Strong.init(globalThis), .allocated = false, .name = name_str }, +                .head = .{ .poll_ref = poll_ref, .globalThis = globalThis, .promise = JSC.JSPromise.Strong.init(globalThis), .allocated = false, .name = name },              };              request.tail = &request.head;              if (cache == .new) { @@ -943,9 +942,9 @@ pub fn CAresLookup(comptime cares_type: type, comptime type_name: []const u8) ty          poll_ref: JSC.PollRef,          allocated: bool = false,          next: ?*@This() = null, -        name: *const JSC.ZigString.Slice, +        name: []const u8, -        pub fn init(globalThis: *JSC.JSGlobalObject, allocator: std.mem.Allocator, name: *const JSC.ZigString.Slice) !*@This() { +        pub fn init(globalThis: *JSC.JSGlobalObject, allocator: std.mem.Allocator, name: []const u8) !*@This() {              var this = try allocator.create(@This());              var poll_ref = JSC.PollRef.init();              poll_ref.ref(globalThis.bunVM()); @@ -998,7 +997,7 @@ pub fn CAresLookup(comptime cares_type: type, comptime type_name: []const u8) ty          pub fn deinit(this: *@This()) void {              this.poll_ref.unrefOnNextTick(this.globalThis.bunVM()); -            this.name.deinit(); +            bun.default_allocator.free(this.name);              if (this.allocated)                  this.globalThis.allocator().destroy(this); @@ -1529,7 +1528,7 @@ pub const DNSResolver = struct {              return .zero;          } -        const name = name_str.toSlice(globalThis, bun.default_allocator); +        const name = name_str.toSliceClone(globalThis, bun.default_allocator);          var vm = globalThis.bunVM();          var resolver = vm.rareData().globalDNSResolver(vm); @@ -1546,25 +1545,25 @@ pub const DNSResolver = struct {                  return resolver.doLookup(name.slice(), 0, options, globalThis);              },              RecordType.CNAME => { -                return resolver.doResolveCAres(c_ares.struct_hostent, "cname", &name, globalThis); +                return resolver.doResolveCAres(c_ares.struct_hostent, "cname", name.slice(), globalThis);              },              RecordType.MX => { -                return resolver.doResolveCAres(c_ares.struct_ares_mx_reply, "mx", &name, globalThis); +                return resolver.doResolveCAres(c_ares.struct_ares_mx_reply, "mx", name.slice(), globalThis);              },              RecordType.NS => { -                return resolver.doResolveCAres(c_ares.struct_hostent, "ns", &name, globalThis); +                return resolver.doResolveCAres(c_ares.struct_hostent, "ns", name.slice(), globalThis);              },              RecordType.PTR => { -                return resolver.doResolveCAres(c_ares.struct_hostent, "ptr", &name, globalThis); +                return resolver.doResolveCAres(c_ares.struct_hostent, "ptr", name.slice(), globalThis);              },              RecordType.SOA => { -                return resolver.doResolveCAres(c_ares.struct_ares_soa_reply, "soa", &name, globalThis); +                return resolver.doResolveCAres(c_ares.struct_ares_soa_reply, "soa", name.slice(), globalThis);              },              RecordType.SRV => { -                return resolver.doResolveCAres(c_ares.struct_ares_srv_reply, "srv", &name, globalThis); +                return resolver.doResolveCAres(c_ares.struct_ares_srv_reply, "srv", name.slice(), globalThis);              },              RecordType.TXT => { -                return resolver.doResolveCAres(c_ares.struct_ares_txt_reply, "txt", &name, globalThis); +                return resolver.doResolveCAres(c_ares.struct_ares_txt_reply, "txt", name.slice(), globalThis);              },          }      } @@ -1663,12 +1662,12 @@ pub const DNSResolver = struct {              return .zero;          } -        const name = name_str.toSlice(globalThis, bun.default_allocator); +        const name = name_str.toSliceClone(globalThis, bun.default_allocator);          var vm = globalThis.bunVM();          var resolver = vm.rareData().globalDNSResolver(vm); -        return resolver.doResolveCAres(c_ares.struct_ares_srv_reply, "srv", &name, globalThis); +        return resolver.doResolveCAres(c_ares.struct_ares_srv_reply, "srv", name.slice(), globalThis);      }      pub fn resolveSoa(globalThis: *JSC.JSGlobalObject, callframe: *JSC.CallFrame) callconv(.C) JSC.JSValue { @@ -1694,12 +1693,12 @@ pub const DNSResolver = struct {              return .zero;          } -        const name = name_str.toSlice(globalThis, bun.default_allocator); +        const name = name_str.toSliceClone(globalThis, bun.default_allocator);          var vm = globalThis.bunVM();          var resolver = vm.rareData().globalDNSResolver(vm); -        return resolver.doResolveCAres(c_ares.struct_ares_soa_reply, "soa", &name, globalThis); +        return resolver.doResolveCAres(c_ares.struct_ares_soa_reply, "soa", name.slice(), globalThis);      }      pub fn resolveCaa(globalThis: *JSC.JSGlobalObject, callframe: *JSC.CallFrame) callconv(.C) JSC.JSValue { @@ -1725,12 +1724,12 @@ pub const DNSResolver = struct {              return .zero;          } -        const name = name_str.toSlice(globalThis, bun.default_allocator); +        const name = name_str.toSliceClone(globalThis, bun.default_allocator);          var vm = globalThis.bunVM();          var resolver = vm.rareData().globalDNSResolver(vm); -        return resolver.doResolveCAres(c_ares.struct_ares_caa_reply, "caa", &name, globalThis); +        return resolver.doResolveCAres(c_ares.struct_ares_caa_reply, "caa", name.slice(), globalThis);      }      pub fn resolveNs(globalThis: *JSC.JSGlobalObject, callframe: *JSC.CallFrame) callconv(.C) JSC.JSValue { @@ -1756,12 +1755,12 @@ pub const DNSResolver = struct {              return .zero;          } -        const name = name_str.toSlice(globalThis, bun.default_allocator); +        const name = name_str.toSliceClone(globalThis, bun.default_allocator);          var vm = globalThis.bunVM();          var resolver = vm.rareData().globalDNSResolver(vm); -        return resolver.doResolveCAres(c_ares.struct_hostent, "ns", &name, globalThis); +        return resolver.doResolveCAres(c_ares.struct_hostent, "ns", name.slice(), globalThis);      }      pub fn resolvePtr(globalThis: *JSC.JSGlobalObject, callframe: *JSC.CallFrame) callconv(.C) JSC.JSValue { @@ -1787,12 +1786,12 @@ pub const DNSResolver = struct {              return .zero;          } -        const name = name_str.toSlice(globalThis, bun.default_allocator); +        const name = name_str.toSliceClone(globalThis, bun.default_allocator);          var vm = globalThis.bunVM();          var resolver = vm.rareData().globalDNSResolver(vm); -        return resolver.doResolveCAres(c_ares.struct_hostent, "ptr", &name, globalThis); +        return resolver.doResolveCAres(c_ares.struct_hostent, "ptr", name.slice(), globalThis);      }      pub fn resolveCname(globalThis: *JSC.JSGlobalObject, callframe: *JSC.CallFrame) callconv(.C) JSC.JSValue { @@ -1818,12 +1817,12 @@ pub const DNSResolver = struct {              return .zero;          } -        const name = name_str.toSlice(globalThis, bun.default_allocator); +        const name = name_str.toSliceClone(globalThis, bun.default_allocator);          var vm = globalThis.bunVM();          var resolver = vm.rareData().globalDNSResolver(vm); -        return resolver.doResolveCAres(c_ares.struct_hostent, "cname", &name, globalThis); +        return resolver.doResolveCAres(c_ares.struct_hostent, "cname", name.slice(), globalThis);      }      pub fn resolveMx(globalThis: *JSC.JSGlobalObject, callframe: *JSC.CallFrame) callconv(.C) JSC.JSValue { @@ -1849,12 +1848,12 @@ pub const DNSResolver = struct {              return .zero;          } -        const name = name_str.toSlice(globalThis, bun.default_allocator); +        const name = name_str.toSliceClone(globalThis, bun.default_allocator);          var vm = globalThis.bunVM();          var resolver = vm.rareData().globalDNSResolver(vm); -        return resolver.doResolveCAres(c_ares.struct_ares_mx_reply, "mx", &name, globalThis); +        return resolver.doResolveCAres(c_ares.struct_ares_mx_reply, "mx", name.slice(), globalThis);      }      pub fn resolveNaptr(globalThis: *JSC.JSGlobalObject, callframe: *JSC.CallFrame) callconv(.C) JSC.JSValue { @@ -1880,12 +1879,12 @@ pub const DNSResolver = struct {              return .zero;          } -        const name = name_str.toSlice(globalThis, bun.default_allocator); +        const name = name_str.toSliceClone(globalThis, bun.default_allocator);          var vm = globalThis.bunVM();          var resolver = vm.rareData().globalDNSResolver(vm); -        return resolver.doResolveCAres(c_ares.struct_ares_naptr_reply, "naptr", &name, globalThis); +        return resolver.doResolveCAres(c_ares.struct_ares_naptr_reply, "naptr", name.slice(), globalThis);      }      pub fn resolveTxt(globalThis: *JSC.JSGlobalObject, callframe: *JSC.CallFrame) callconv(.C) JSC.JSValue { @@ -1911,17 +1910,15 @@ pub const DNSResolver = struct {              return .zero;          } -        const name = name_str.toSlice(globalThis, bun.default_allocator); +        const name = name_str.toSliceClone(globalThis, bun.default_allocator);          var vm = globalThis.bunVM();          var resolver = vm.rareData().globalDNSResolver(vm); -        return resolver.doResolveCAres(c_ares.struct_ares_txt_reply, "txt", &name, globalThis); +        return resolver.doResolveCAres(c_ares.struct_ares_txt_reply, "txt", name.slice(), globalThis);      } -    pub fn doResolveCAres(this: *DNSResolver, comptime cares_type: type, comptime type_name: []const u8, name_str: *const JSC.ZigString.Slice, globalThis: *JSC.JSGlobalObject) JSC.JSValue { -        var name = name_str.slice(); - +    pub fn doResolveCAres(this: *DNSResolver, comptime cares_type: type, comptime type_name: []const u8, name: []const u8, globalThis: *JSC.JSGlobalObject) JSC.JSValue {          var channel: *c_ares.Channel = switch (this.getChannel()) {              .result => |res| res,              .err => |err| { @@ -1943,7 +1940,7 @@ pub const DNSResolver = struct {          var cache = this.getOrPutIntoResolvePendingCache(ResolveInfoRequest(cares_type, type_name), key, cache_name);          if (cache == .inflight) {              // CAresLookup will have the name ownership -            var cares_lookup = CAresLookup(cares_type, type_name).init(globalThis, globalThis.allocator(), name_str) catch unreachable; +            var cares_lookup = CAresLookup(cares_type, type_name).init(globalThis, globalThis.allocator(), name) catch unreachable;              cache.inflight.append(cares_lookup);              return cares_lookup.promise.value();          } @@ -1951,7 +1948,7 @@ pub const DNSResolver = struct {          var request = ResolveInfoRequest(cares_type, type_name).init(              cache,              this, -            name_str, // CAresLookup will have the ownership +            name, // CAresLookup will have the ownership              globalThis,              cache_name,          ) catch unreachable; diff --git a/src/bun.js/bindings/bindings.zig b/src/bun.js/bindings/bindings.zig index 9a775990c..fa7efa728 100644 --- a/src/bun.js/bindings/bindings.zig +++ b/src/bun.js/bindings/bindings.zig @@ -368,7 +368,7 @@ pub const ZigString = extern struct {          }          pub fn sliceZ(this: Slice) [:0]const u8 { -            return this.ptr[0..this.len:0]; +            return this.ptr[0..this.len :0];          }          pub fn toSliceZ(this: Slice, buf: []u8) [:0]const u8 { @@ -386,7 +386,7 @@ pub const ZigString = extern struct {              std.mem.copy(u8, buf[0..this.len], this.slice());              buf[this.len] = 0; -            return buf[0..this.len:0]; +            return buf[0..this.len :0];          }          pub fn mut(this: Slice) []u8 { @@ -604,7 +604,7 @@ pub const ZigString = extern struct {          if (this.len == 0)              return Slice.empty;          if (is16Bit(&this)) { -            var buffer = this.toOwnedSlice(allocator) catch unreachable; +            const buffer = this.toOwnedSlice(allocator) catch unreachable;              return Slice{                  .allocator = NullableAllocator.init(allocator),                  .ptr = buffer.ptr, @@ -613,7 +613,7 @@ pub const ZigString = extern struct {          }          if (!this.isUTF8() and !strings.isAllASCII(untagged(this.ptr)[0..this.len])) { -            var buffer = this.toOwnedSlice(allocator) catch unreachable; +            const buffer = this.toOwnedSlice(allocator) catch unreachable;              return Slice{                  .allocator = NullableAllocator.init(allocator),                  .ptr = buffer.ptr, @@ -627,6 +627,17 @@ pub const ZigString = extern struct {          };      } +    pub fn toSliceClone(this: ZigString, allocator: std.mem.Allocator) Slice { +        if (this.len == 0) +            return Slice.empty; +        const buffer = this.toOwnedSlice(allocator) catch unreachable; +        return Slice{ +            .allocator = NullableAllocator.init(allocator), +            .ptr = buffer.ptr, +            .len = @truncate(u32, buffer.len), +        }; +    } +      pub fn toSliceZ(this: ZigString, allocator: std.mem.Allocator) Slice {          if (this.len == 0)              return Slice.empty; @@ -1305,6 +1316,7 @@ pub const JSString = extern struct {          return out;      } +    // doesn't always allocate      pub fn toSlice(          this: *JSString,          global: *JSGlobalObject, @@ -1315,6 +1327,16 @@ pub const JSString = extern struct {          return str.toSlice(allocator);      } +    pub fn toSliceClone( +        this: *JSString, +        global: *JSGlobalObject, +        allocator: std.mem.Allocator, +    ) ZigString.Slice { +        var str = ZigString.init(""); +        this.toZigString(global, &str); +        return str.toSliceClone(allocator); +    } +      pub fn toSliceZ(          this: *JSString,          global: *JSGlobalObject, diff --git a/test/bun.js/node-dns.test.js b/test/bun.js/node-dns.test.js index b3ee09d48..b84b8c9ba 100644 --- a/test/bun.js/node-dns.test.js +++ b/test/bun.js/node-dns.test.js @@ -25,7 +25,9 @@ test("dns.resolveSrv (_test._tcp.test.socketify.dev)", (done) => {    dns.resolveSrv("_test._tcp.test.socketify.dev", (err, results) => {      expect(err).toBeNull();      expect(results instanceof Array).toBe(true); -    expect(results[0].name).toBe("_dc-srv.130c90ab9de1._test._tcp.test.socketify.dev"); +    expect(results[0].name).toBe( +      "_dc-srv.130c90ab9de1._test._tcp.test.socketify.dev", +    );      expect(results[0].priority).toBe(50);      expect(results[0].weight).toBe(50);      expect(results[0].port).toBe(80); @@ -50,11 +52,9 @@ test("dns.resolveTxt (txt.socketify.dev)", (done) => {    });  }); -  test("dns.resolveSoa (bun.sh)", (done) => {    dns.resolveSoa("bun.sh", (err, result) => {      expect(err).toBeNull(); -          expect(result.serial).toBe(2295878541);      expect(result.refresh).toBe(10000);      expect(result.retry).toBe(2400); @@ -62,7 +62,6 @@ test("dns.resolveSoa (bun.sh)", (done) => {      expect(result.minttl).toBe(3600);      expect(result.nsname).toBe("hans.ns.cloudflare.com");      expect(result.hostmaster).toBe("dns.cloudflare.com"); -          done(err);    });  }); @@ -71,10 +70,10 @@ test("dns.resolveNaptr (naptr.socketify.dev)", (done) => {    dns.resolveNaptr("naptr.socketify.dev", (err, results) => {      expect(err).toBeNull();      expect(results instanceof Array).toBe(true); -    expect(results[0].flags).toBe('S'); -    expect(results[0].service).toBe('test'); -    expect(results[0].regexp).toBe(''); -    expect(results[0].replacement).toBe(''); +    expect(results[0].flags).toBe("S"); +    expect(results[0].service).toBe("test"); +    expect(results[0].regexp).toBe(""); +    expect(results[0].replacement).toBe("");      expect(results[0].order).toBe(1);      expect(results[0].preference).toBe(12);      done(err); @@ -86,29 +85,27 @@ test("dns.resolveCaa (caa.socketify.dev)", (done) => {      expect(err).toBeNull();      expect(results instanceof Array).toBe(true);      expect(results[0].critical).toBe(0); -    expect(results[0].issue).toBe('bun.sh'); +    expect(results[0].issue).toBe("bun.sh");      done(err);    });  }); -  test("dns.resolveMx (bun.sh)", (done) => {    dns.resolveMx("bun.sh", (err, results) => {      expect(err).toBeNull();      expect(results instanceof Array).toBe(true); -    expect(results[0].priority).toBe(10); -    expect(results[0].exchange).toBe('eforward1.registrar-servers.com'); +    const priority = results[0].priority; +    expect(priority >= 0 && priority < 65535).toBe(true); +    expect(results[0].exchange.includes(".registrar-servers.com")).toBe(true);      done(err);    });  }); - -  test("dns.resolveNs (bun.sh) ", (done) => {    dns.resolveNs("bun.sh", (err, results) => {      expect(err).toBeNull();      expect(results instanceof Array).toBe(true); -    expect(results[0]).toBe('hans.ns.cloudflare.com'); +    expect(results[0].includes(".ns.cloudflare.com")).toBe(true);      done(err);    });  }); @@ -117,7 +114,7 @@ test("dns.resolvePtr (ptr.socketify.dev)", (done) => {    dns.resolvePtr("ptr.socketify.dev", (err, results) => {      expect(err).toBeNull();      expect(results instanceof Array).toBe(true); -    expect(results[0]).toBe('bun.sh'); +    expect(results[0]).toBe("bun.sh");      done(err);    });  }); @@ -126,12 +123,11 @@ test("dns.resolveCname (cname.socketify.dev)", (done) => {    dns.resolveCname("cname.socketify.dev", (err, results) => {      expect(err).toBeNull();      expect(results instanceof Array).toBe(true); -    expect(results[0]).toBe('bun.sh'); +    expect(results[0]).toBe("bun.sh");      done(err);    });  }); -  test("dns.lookup (example.com)", (done) => {    dns.lookup("example.com", (err, address, family) => {      expect(err).toBeNull(); @@ -151,4 +147,4 @@ test("dns.lookup (localhost)", (done) => {      done(err);    }); -});
\ No newline at end of file +}); | 
