aboutsummaryrefslogtreecommitdiff
path: root/src/javascript
diff options
context:
space:
mode:
Diffstat (limited to 'src/javascript')
-rw-r--r--src/javascript/jsc/JavascriptCore.zig1
m---------src/javascript/jsc/WebKit0
-rw-r--r--src/javascript/jsc/bindings/headers-cpp.h2
-rw-r--r--src/javascript/jsc/bindings/headers.h2
-rw-r--r--src/javascript/jsc/javascript.zig28
-rw-r--r--src/javascript/jsc/webcore/response.zig121
6 files changed, 135 insertions, 19 deletions
diff --git a/src/javascript/jsc/JavascriptCore.zig b/src/javascript/jsc/JavascriptCore.zig
index 4e9bbf4c4..612009a1f 100644
--- a/src/javascript/jsc/JavascriptCore.zig
+++ b/src/javascript/jsc/JavascriptCore.zig
@@ -33,7 +33,6 @@ pub const JSType = enum(c_uint) {
kJSTypeString,
kJSTypeObject,
kJSTypeSymbol,
- _,
};
pub const kJSTypeUndefined = @enumToInt(JSType.kJSTypeUndefined);
pub const kJSTypeNull = @enumToInt(JSType.kJSTypeNull);
diff --git a/src/javascript/jsc/WebKit b/src/javascript/jsc/WebKit
-Subproject e7d31961d4bf98b3e8b1df3ea0398ea1517a61d
+Subproject 1d5ca69e3eedd5b4d1197bbb90860b254a8a8ee
diff --git a/src/javascript/jsc/bindings/headers-cpp.h b/src/javascript/jsc/bindings/headers-cpp.h
index 400697777..0e941988c 100644
--- a/src/javascript/jsc/bindings/headers-cpp.h
+++ b/src/javascript/jsc/bindings/headers-cpp.h
@@ -1,4 +1,4 @@
-//-- AUTOGENERATED FILE -- 1631179623
+//-- AUTOGENERATED FILE -- 1631342881
// clang-format off
#pragma once
diff --git a/src/javascript/jsc/bindings/headers.h b/src/javascript/jsc/bindings/headers.h
index 125937a59..e7029c777 100644
--- a/src/javascript/jsc/bindings/headers.h
+++ b/src/javascript/jsc/bindings/headers.h
@@ -1,4 +1,4 @@
-//-- AUTOGENERATED FILE -- 1631179623
+//-- AUTOGENERATED FILE -- 1631342881
// clang-format: off
#pragma once
diff --git a/src/javascript/jsc/javascript.zig b/src/javascript/jsc/javascript.zig
index 5349aaec1..a84437851 100644
--- a/src/javascript/jsc/javascript.zig
+++ b/src/javascript/jsc/javascript.zig
@@ -260,6 +260,27 @@ pub const Bun = struct {
}
}
+ var public_path_temp_str: [std.fs.MAX_PATH_BYTES]u8 = undefined;
+
+ pub fn getPublicPathJS(
+ this: void,
+ ctx: js.JSContextRef,
+ function: js.JSObjectRef,
+ thisObject: js.JSObjectRef,
+ arguments: []const js.JSValueRef,
+ exception: js.ExceptionRef,
+ ) js.JSValueRef {
+ var zig_str: ZigString = ZigString.Empty;
+ JSValue.toZigString(JSValue.fromRef(arguments[0]), &zig_str, VirtualMachine.vm.global);
+
+ const to = zig_str.slice();
+
+ var stream = std.io.fixedBufferStream(&public_path_temp_str);
+ var writer = stream.writer();
+ getPublicPath(to, @TypeOf(&writer), &writer);
+ return ZigString.init(stream.buffer[0..stream.pos]).toValueGC(VirtualMachine.vm.global).asRef();
+ }
+
pub const Class = NewClass(
void,
.{
@@ -302,6 +323,13 @@ pub const Bun = struct {
.@"return" = "string",
},
},
+ .getPublicPath = .{
+ .rfn = Bun.getPublicPathJS,
+ .ts = d.ts{
+ .name = "getPublicPath",
+ .@"return" = "string",
+ },
+ },
},
.{
.main = .{
diff --git a/src/javascript/jsc/webcore/response.zig b/src/javascript/jsc/webcore/response.zig
index 1cd60e6bb..31e9d70ff 100644
--- a/src/javascript/jsc/webcore/response.zig
+++ b/src/javascript/jsc/webcore/response.zig
@@ -330,6 +330,66 @@ pub const Fetch = struct {
var fetch_body_string: MutableString = undefined;
var fetch_body_string_loaded = false;
+ const JSType = js.JSType;
+
+ const fetch_error_no_args = "fetch() expects a string but received no arguments.";
+ const fetch_error_blank_url = "fetch() URL must not be blank string.";
+ const JSTypeErrorEnum = std.enums.EnumArray(JSType, string);
+ const fetch_type_error_names: JSTypeErrorEnum = brk: {
+ var errors = JSTypeErrorEnum.initUndefined();
+ errors.set(JSType.kJSTypeUndefined, "Undefined");
+ errors.set(JSType.kJSTypeNull, "Null");
+ errors.set(JSType.kJSTypeBoolean, "Boolean");
+ errors.set(JSType.kJSTypeNumber, "Number");
+ errors.set(JSType.kJSTypeString, "String");
+ errors.set(JSType.kJSTypeObject, "Object");
+ errors.set(JSType.kJSTypeSymbol, "Symbol");
+ break :brk errors;
+ };
+
+ const fetch_type_error_string_values = .{
+ std.fmt.comptimePrint("fetch() expects a string, but received {s}", .{fetch_type_error_names.get(JSType.kJSTypeUndefined)}),
+ std.fmt.comptimePrint("fetch() expects a string, but received {s}", .{fetch_type_error_names.get(JSType.kJSTypeNull)}),
+ std.fmt.comptimePrint("fetch() expects a string, but received {s}", .{fetch_type_error_names.get(JSType.kJSTypeBoolean)}),
+ std.fmt.comptimePrint("fetch() expects a string, but received {s}", .{fetch_type_error_names.get(JSType.kJSTypeNumber)}),
+ std.fmt.comptimePrint("fetch() expects a string, but received {s}", .{fetch_type_error_names.get(JSType.kJSTypeString)}),
+ std.fmt.comptimePrint("fetch() expects a string, but received {s}", .{fetch_type_error_names.get(JSType.kJSTypeObject)}),
+ std.fmt.comptimePrint("fetch() expects a string, but received {s}", .{fetch_type_error_names.get(JSType.kJSTypeSymbol)}),
+ };
+
+ const fetch_type_error_strings: JSTypeErrorEnum = brk: {
+ var errors = JSTypeErrorEnum.initUndefined();
+ errors.set(
+ JSType.kJSTypeUndefined,
+ std.mem.span(fetch_type_error_string_values[0]),
+ );
+ errors.set(
+ JSType.kJSTypeNull,
+ std.mem.span(fetch_type_error_string_values[1]),
+ );
+ errors.set(
+ JSType.kJSTypeBoolean,
+ std.mem.span(fetch_type_error_string_values[2]),
+ );
+ errors.set(
+ JSType.kJSTypeNumber,
+ std.mem.span(fetch_type_error_string_values[3]),
+ );
+ errors.set(
+ JSType.kJSTypeString,
+ std.mem.span(fetch_type_error_string_values[4]),
+ );
+ errors.set(
+ JSType.kJSTypeObject,
+ std.mem.span(fetch_type_error_string_values[5]),
+ );
+ errors.set(
+ JSType.kJSTypeSymbol,
+ std.mem.span(fetch_type_error_string_values[6]),
+ );
+ break :brk errors;
+ };
+
pub const Class = NewClass(
void,
.{ .name = "fetch" },
@@ -342,6 +402,7 @@ pub const Fetch = struct {
.{},
);
+ const fetch_error_cant_fetch_same_origin = "fetch to same-origin on the server is not supported yet - sorry! (it would just hang forever)";
pub fn call(
this: void,
ctx: js.JSContextRef,
@@ -350,13 +411,14 @@ pub const Fetch = struct {
arguments: []const js.JSValueRef,
exception: js.ExceptionRef,
) js.JSObjectRef {
- if (arguments.len == 0 or arguments.len > 2) return js.JSValueMakeNull(ctx);
- var http_client = HTTPClient.init(getAllocator(ctx), .GET, ZigURL{}, .{}, "");
- var headers: ?Headers = null;
- var body: string = "";
+ if (arguments.len == 0) {
+ const fetch_error = fetch_error_no_args;
+ return JSPromise.rejectedPromiseValue(VirtualMachine.vm.global, ZigString.init(fetch_error).toErrorInstance(VirtualMachine.vm.global)).asRef();
+ }
if (!js.JSValueIsString(ctx, arguments[0])) {
- return js.JSValueMakeNull(ctx);
+ const fetch_error = fetch_type_error_strings.get(js.JSValueGetType(ctx, arguments[0]));
+ return JSPromise.rejectedPromiseValue(VirtualMachine.vm.global, ZigString.init(fetch_error).toErrorInstance(VirtualMachine.vm.global)).asRef();
}
var url_zig_str = ZigString.init("");
@@ -365,10 +427,29 @@ pub const Fetch = struct {
VirtualMachine.vm.global,
);
var url_str = url_zig_str.slice();
- if (url_str.len == 0) return js.JSValueMakeNull(ctx);
- http_client.url = ZigURL.parse(url_str);
+ if (url_str.len == 0) {
+ const fetch_error = fetch_error_blank_url;
+ return JSPromise.rejectedPromiseValue(VirtualMachine.vm.global, ZigString.init(fetch_error).toErrorInstance(VirtualMachine.vm.global)).asRef();
+ }
+
+ var dealloc_url_str = false;
+ if (url_str[0] == '/') {
+ url_str = strings.append(getAllocator(ctx), VirtualMachine.vm.bundler.options.origin.origin, url_str) catch unreachable;
+ dealloc_url_str = true;
+ }
+ defer if (dealloc_url_str) getAllocator(ctx).free(url_str);
+
+ var http_client = HTTPClient.init(getAllocator(ctx), .GET, ZigURL.parse(url_str), .{}, "");
+
+ if (http_client.url.origin.len > 0 and strings.eql(http_client.url.origin, VirtualMachine.vm.bundler.options.origin.origin)) {
+ const fetch_error = fetch_error_cant_fetch_same_origin;
+ return JSPromise.rejectedPromiseValue(VirtualMachine.vm.global, ZigString.init(fetch_error).toErrorInstance(VirtualMachine.vm.global)).asRef();
+ }
+
+ var headers: ?Headers = null;
+ var body: string = "";
- if (arguments.len == 2 and js.JSValueIsObject(ctx, arguments[1])) {
+ if (arguments.len >= 2 and js.JSValueIsObject(ctx, arguments[1])) {
var array = js.JSObjectCopyPropertyNames(ctx, arguments[1]);
defer js.JSPropertyNameArrayRelease(array);
const count = js.JSPropertyNameArrayGetCount(array);
@@ -391,7 +472,7 @@ pub const Fetch = struct {
if (js.JSStringIsEqualToUTF8CString(property_name_ref, "body")) {
if (js.JSObjectGetProperty(ctx, arguments[1], property_name_ref, null)) |value| {
var body_ = Body.extractBody(ctx, value, false, null, exception);
- if (exception != null) return js.JSValueMakeNull(ctx);
+ if (exception.* != null) return js.JSValueMakeNull(ctx);
switch (body_.value) {
.ArrayBuffer => |arraybuffer| {
body = arraybuffer.ptr[0..arraybuffer.byte_len];
@@ -409,7 +490,7 @@ pub const Fetch = struct {
if (js.JSObjectGetProperty(ctx, arguments[1], property_name_ref, null)) |value| {
var string_ref = js.JSValueToStringCopy(ctx, value, exception);
- if (exception != null) return js.JSValueMakeNull(ctx);
+ if (exception.* != null) return js.JSValueMakeNull(ctx);
defer js.JSStringRelease(string_ref);
var method_name_buf: [16]u8 = undefined;
var method_name = method_name_buf[0..js.JSStringGetUTF8CString(string_ref, &method_name_buf, method_name_buf.len)];
@@ -435,7 +516,14 @@ pub const Fetch = struct {
}
var http_response = http_client.send(body, &fetch_body_string) catch |err| {
- const fetch_error = std.fmt.allocPrint(getAllocator(ctx), "Fetch error: {s}", .{@errorName(err)}) catch unreachable;
+ const fetch_error = std.fmt.allocPrint(
+ getAllocator(ctx),
+ "Fetch error: {s}\nURL: \"{s}\"",
+ .{
+ @errorName(err),
+ url_str,
+ },
+ ) catch unreachable;
return JSPromise.rejectedPromiseValue(VirtualMachine.vm.global, ZigString.init(fetch_error).toErrorInstance(VirtualMachine.vm.global)).asRef();
};
@@ -1129,18 +1217,19 @@ pub const Body = struct {
} else |err| {}
}
- var str: ZigString = ZigString.Empty;
- JSValue.fromRef(body_ref).toZigString(&str, VirtualMachine.vm.global);
+ var wtf_string = JSValue.fromRef(body_ref).toWTFString(VirtualMachine.vm.global);
- if (str.len == 0) {
+ if (wtf_string.isEmpty()) {
body.value = .{ .String = "" };
return body;
}
- body.value = Value{ .String = str.slice() };
+ body.value = Value{
+ .String = wtf_string.characters8()[0..wtf_string.length()],
+ };
// body.ptr = body.
// body.len = body.value.String.len;str.characters8()[0..len] };
-
+
return body;
},
.kJSTypeObject => {