aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js
diff options
context:
space:
mode:
authorGravatar Silas Rech <silas.rech@protonmail.com> 2023-06-27 00:35:48 +0200
committerGravatar GitHub <noreply@github.com> 2023-06-26 15:35:48 -0700
commit16598555f137112a3df2da5d8f2ee8edb496484f (patch)
treead389ba4b312e82e4fcdd867e4d013d5a0d20fbb /src/bun.js
parenta732999da578ca92a1d9e633036225a32e77529d (diff)
downloadbun-16598555f137112a3df2da5d8f2ee8edb496484f.tar.gz
bun-16598555f137112a3df2da5d8f2ee8edb496484f.tar.zst
bun-16598555f137112a3df2da5d8f2ee8edb496484f.zip
`.randomInt()` support (#3357)
* Add initial .randomInt() fallback * Add basic .randomInt() test * Attempt creating a native implementation * Switch to JSC.wrapWithHasContainer * Switch to .jsNumberFromUint64(), it seems like using just .jsNumber() causes the number to overflow in some cases * Regenerate out folder after rebasing
Diffstat (limited to 'src/bun.js')
-rw-r--r--src/bun.js/bindings/JSSinkLookupTable.h2
-rw-r--r--src/bun.js/bindings/bindings.zig1
-rw-r--r--src/bun.js/webcore.zig20
3 files changed, 22 insertions, 1 deletions
diff --git a/src/bun.js/bindings/JSSinkLookupTable.h b/src/bun.js/bindings/JSSinkLookupTable.h
index e4ed81629..f8518bc5e 100644
--- a/src/bun.js/bindings/JSSinkLookupTable.h
+++ b/src/bun.js/bindings/JSSinkLookupTable.h
@@ -1,4 +1,4 @@
-// Automatically generated from src/bun.js/bindings/JSSink.cpp using /home/cirospaciari/Repos/bun/src/bun.js/WebKit/Source/JavaScriptCore/create_hash_table. DO NOT EDIT!
+// Automatically generated from src/bun.js/bindings/JSSink.cpp using /Users/silas/Workspace/opensource/bun/src/bun.js/WebKit/Source/JavaScriptCore/create_hash_table. DO NOT EDIT!
diff --git a/src/bun.js/bindings/bindings.zig b/src/bun.js/bindings/bindings.zig
index 00833c71d..2b800ab8b 100644
--- a/src/bun.js/bindings/bindings.zig
+++ b/src/bun.js/bindings/bindings.zig
@@ -5568,6 +5568,7 @@ pub const __DOMCall__reader_u64 = @import("../api/bun.zig").FFI.Reader.Class.fun
pub const __DOMCall__reader_intptr = @import("../api/bun.zig").FFI.Reader.Class.functionDefinitions.intptr;
pub const __Crypto_getRandomValues = @import("../webcore.zig").Crypto.Class.functionDefinitions.getRandomValues;
pub const __Crypto_randomUUID = @import("../webcore.zig").Crypto.Class.functionDefinitions.randomUUID;
+pub const __Crypto_randomInt = @import("../webcore.zig").Crypto.Class.functionDefinitions.randomInt;
pub const __Crypto_timingSafeEqual = @import("../webcore.zig").Crypto.Class.functionDefinitions.timingSafeEqual;
pub const DOMCalls = .{
@import("../api/bun.zig").FFI,
diff --git a/src/bun.js/webcore.zig b/src/bun.js/webcore.zig
index a5009e09e..fd69b0262 100644
--- a/src/bun.js/webcore.zig
+++ b/src/bun.js/webcore.zig
@@ -10,6 +10,7 @@ const std = @import("std");
const bun = @import("root").bun;
const string = bun.string;
pub const AbortSignal = @import("./bindings/bindings.zig").AbortSignal;
+pub const JSValue = @import("./bindings/bindings.zig").JSValue;
pub const Lifetime = enum {
clone,
@@ -374,6 +375,7 @@ pub const Crypto = struct {
.getRandomValues = JSC.DOMCall("Crypto", @This(), "getRandomValues", JSC.JSValue, JSC.DOMEffect.top),
.randomUUID = JSC.DOMCall("Crypto", @This(), "randomUUID", *JSC.JSString, JSC.DOMEffect.top),
.timingSafeEqual = JSC.DOMCall("Crypto", @This(), "timingSafeEqual", JSC.JSValue, JSC.DOMEffect.top),
+ .randomInt = .{ .rfn = &JSC.wrapWithHasContainer(Crypto, "randomInt", false, false, false) },
.scryptSync = .{ .rfn = &JSC.wrapWithHasContainer(Crypto, "scryptSync", false, false, false) },
},
.{},
@@ -698,6 +700,24 @@ pub const Crypto = struct {
return JSC.ZigString.init(&out).toValueGC(globalThis);
}
+ pub fn randomInt(globalThis: *JSC.JSGlobalObject, min_value: ?JSValue, max_value: ?JSValue) JSValue {
+ _ = globalThis;
+
+ var at_least: u52 = 0;
+ var at_most: u52 = std.math.maxInt(u52);
+
+ if (min_value) |min| {
+ if (max_value) |max| {
+ if (min.isNumber()) at_least = min.to(u52);
+ if (max.isNumber()) at_most = max.to(u52);
+ } else {
+ if (min.isNumber()) at_most = min.to(u52);
+ }
+ }
+
+ return JSValue.jsNumberFromUint64(std.crypto.random.intRangeAtMost(u52, at_least, at_most));
+ }
+
pub fn randomUUIDWithoutTypeChecks(
globalThis: *JSC.JSGlobalObject,
_: *anyopaque,