From b44494d53abc0eca8fd51fd3cca4dea8aefbbc8f Mon Sep 17 00:00:00 2001 From: Dmitrii Pevunov Date: Tue, 1 Apr 2025 02:04:05 +0400 Subject: [PATCH 1/4] SecureRandom.javaSecuritySecureRandom for two effect types --- .../cats/effect/std/SecureRandomCompanionPlatform.scala | 5 ++++- .../cats/effect/std/SecureRandomCompanionPlatform.scala | 5 ++++- .../cats/effect/std/SecureRandomCompanionPlatform.scala | 5 ++++- std/shared/src/main/scala/cats/effect/std/SecureRandom.scala | 5 ++++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/std/js/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala b/std/js/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala index 95aaca72d3..7b2b50e58f 100644 --- a/std/js/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala +++ b/std/js/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala @@ -115,7 +115,10 @@ private[std] trait SecureRandomCompanionPlatform { } def javaSecuritySecureRandom[F[_]: Sync]: F[SecureRandom[F]] = - Sync[F].delay(unsafeJavaSecuritySecureRandom()) + javaSecuritySecureRandomGeneric + + def javaSecuritySecureRandomGeneric[F[_]: Sync, G[_]: Sync]: F[SecureRandom[G]] = + Sync[F].delay(unsafeJavaSecuritySecureRandom[G]()) private[effect] def unsafeJavaSecuritySecureRandom[F[_]: Sync](): SecureRandom[F] = new ScalaRandom[F](Applicative[F].pure(new JavaSecureRandom())) with SecureRandom[F] {} diff --git a/std/jvm/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala b/std/jvm/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala index 6d55c388f6..6bb7790467 100644 --- a/std/jvm/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala +++ b/std/jvm/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala @@ -44,7 +44,10 @@ private[std] trait SecureRandomCompanionPlatform { new ScalaRandom[F](Applicative[F].pure(random), Sync.Type.Blocking) with SecureRandom[F] {} def javaSecuritySecureRandom[F[_]: Sync]: F[SecureRandom[F]] = - Sync[F].delay(unsafeJavaSecuritySecureRandom()) + javaSecuritySecureRandomGeneric + + def javaSecuritySecureRandomGeneric[F[_]: Sync, G[_]: Sync]: F[SecureRandom[G]] = + Sync[F].delay(unsafeJavaSecuritySecureRandom[G]()) /** * Ported from https://github.com/http4s/http4s/. diff --git a/std/native/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala b/std/native/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala index 2aa8ca8d89..407972d806 100644 --- a/std/native/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala +++ b/std/native/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala @@ -58,7 +58,10 @@ private[std] trait SecureRandomCompanionPlatform { } def javaSecuritySecureRandom[F[_]: Sync]: F[SecureRandom[F]] = - Sync[F].delay(unsafeJavaSecuritySecureRandom()) + javaSecuritySecureRandomGeneric + + def javaSecuritySecureRandomGeneric[F[_]: Sync, G[_]: Sync]: F[SecureRandom[G]] = + Sync[F].delay(unsafeJavaSecuritySecureRandom[G]()) private[effect] def unsafeJavaSecuritySecureRandom[F[_]: Sync](): SecureRandom[F] = new ScalaRandom[F](Applicative[F].pure(new JavaSecureRandom())) with SecureRandom[F] {} diff --git a/std/shared/src/main/scala/cats/effect/std/SecureRandom.scala b/std/shared/src/main/scala/cats/effect/std/SecureRandom.scala index 991e266690..e14842497e 100644 --- a/std/shared/src/main/scala/cats/effect/std/SecureRandom.scala +++ b/std/shared/src/main/scala/cats/effect/std/SecureRandom.scala @@ -137,6 +137,9 @@ object SecureRandom extends SecureRandomCompanionPlatform { * errors. */ override def javaSecuritySecureRandom[F[_]: Sync]: F[SecureRandom[F]] = - super.javaSecuritySecureRandom[F] + javaSecuritySecureRandomGeneric + + override def javaSecuritySecureRandomGeneric[F[_]: Sync, G[_]: Sync]: F[SecureRandom[G]] = + super.javaSecuritySecureRandomGeneric[F, G] } From 4bcd1a4a8b72fa695ee6783bf6fb00b5cd936692 Mon Sep 17 00:00:00 2001 From: Dmitrii Pevunov Date: Tue, 8 Apr 2025 18:47:22 +0400 Subject: [PATCH 2/4] added a bit of docs --- .../src/main/scala/cats/effect/std/SecureRandom.scala | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/std/shared/src/main/scala/cats/effect/std/SecureRandom.scala b/std/shared/src/main/scala/cats/effect/std/SecureRandom.scala index e14842497e..392b5a0921 100644 --- a/std/shared/src/main/scala/cats/effect/std/SecureRandom.scala +++ b/std/shared/src/main/scala/cats/effect/std/SecureRandom.scala @@ -124,6 +124,9 @@ object SecureRandom extends SecureRandomCompanionPlatform { } /** + * Builds a `SecureRandom[F]` value for effect types that are [[cats.effect.kernel.Sync]] and + * initializes random state using the same effect type + * * On the JVM, delegates to [[java.security.SecureRandom]]. * * In browsers, delegates to the @@ -139,6 +142,10 @@ object SecureRandom extends SecureRandomCompanionPlatform { override def javaSecuritySecureRandom[F[_]: Sync]: F[SecureRandom[F]] = javaSecuritySecureRandomGeneric + /** + * Builds a `SecureRandom[G]` value for effect types that are [[cats.effect.kernel.Sync]] but + * initializes random state using another effect constructor + */ override def javaSecuritySecureRandomGeneric[F[_]: Sync, G[_]: Sync]: F[SecureRandom[G]] = super.javaSecuritySecureRandomGeneric[F, G] From 9c230d2632b41652ebc740acbada603312c95d6a Mon Sep 17 00:00:00 2001 From: darkest Date: Sun, 25 May 2025 19:10:21 +0400 Subject: [PATCH 3/4] updated naming to match Ref --- .../std/SecureRandomCompanionPlatform.scala | 7 ++++-- .../std/SecureRandomCompanionPlatform.scala | 7 ++++-- .../std/SecureRandomCompanionPlatform.scala | 9 ++++--- .../scala/cats/effect/std/SecureRandom.scala | 25 ++++++++++++++++--- 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/std/js/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala b/std/js/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala index 7b2b50e58f..4ffe111546 100644 --- a/std/js/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala +++ b/std/js/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala @@ -114,10 +114,13 @@ private[std] trait SecureRandomCompanionPlatform { } } + @deprecated("Use 'of' instead", "3.7.0") def javaSecuritySecureRandom[F[_]: Sync]: F[SecureRandom[F]] = - javaSecuritySecureRandomGeneric + Sync[F].delay(unsafeJavaSecuritySecureRandom()) - def javaSecuritySecureRandomGeneric[F[_]: Sync, G[_]: Sync]: F[SecureRandom[G]] = + def of[F[_]: Sync]: F[SecureRandom[F]] = in[F, F] + + def in[F[_]: Sync, G[_]: Sync]: F[SecureRandom[G]] = Sync[F].delay(unsafeJavaSecuritySecureRandom[G]()) private[effect] def unsafeJavaSecuritySecureRandom[F[_]: Sync](): SecureRandom[F] = diff --git a/std/jvm/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala b/std/jvm/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala index 6bb7790467..04a499597c 100644 --- a/std/jvm/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala +++ b/std/jvm/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala @@ -43,10 +43,13 @@ private[std] trait SecureRandomCompanionPlatform { private def javaUtilRandomBlocking[F[_]: Sync](random: JavaSecureRandom): SecureRandom[F] = new ScalaRandom[F](Applicative[F].pure(random), Sync.Type.Blocking) with SecureRandom[F] {} + @deprecated("Use 'of' instead", "3.7.0") def javaSecuritySecureRandom[F[_]: Sync]: F[SecureRandom[F]] = - javaSecuritySecureRandomGeneric + Sync[F].delay(unsafeJavaSecuritySecureRandom()) - def javaSecuritySecureRandomGeneric[F[_]: Sync, G[_]: Sync]: F[SecureRandom[G]] = + def of[F[_]: Sync]: F[SecureRandom[F]] = in[F, F] + + def in[F[_]: Sync, G[_]: Sync]: F[SecureRandom[G]] = Sync[F].delay(unsafeJavaSecuritySecureRandom[G]()) /** diff --git a/std/native/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala b/std/native/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala index 407972d806..f455845729 100644 --- a/std/native/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala +++ b/std/native/src/main/scala/cats/effect/std/SecureRandomCompanionPlatform.scala @@ -57,11 +57,14 @@ private[std] trait SecureRandomCompanionPlatform { } + @deprecated("Use 'of' instead", "3.7.0") def javaSecuritySecureRandom[F[_]: Sync]: F[SecureRandom[F]] = - javaSecuritySecureRandomGeneric + Sync[F].delay(unsafeJavaSecuritySecureRandom()) - def javaSecuritySecureRandomGeneric[F[_]: Sync, G[_]: Sync]: F[SecureRandom[G]] = - Sync[F].delay(unsafeJavaSecuritySecureRandom[G]()) + def of[F[_]: Sync]: F[SecureRandom[F]] = in[F, F] + + def in[F[_]: Sync, G[_]: Sync]: F[SecureRandom[G]] = + Sync[F].delay(unsafeJavaSecuritySecureRandom()) private[effect] def unsafeJavaSecuritySecureRandom[F[_]: Sync](): SecureRandom[F] = new ScalaRandom[F](Applicative[F].pure(new JavaSecureRandom())) with SecureRandom[F] {} diff --git a/std/shared/src/main/scala/cats/effect/std/SecureRandom.scala b/std/shared/src/main/scala/cats/effect/std/SecureRandom.scala index 392b5a0921..e25046dfb6 100644 --- a/std/shared/src/main/scala/cats/effect/std/SecureRandom.scala +++ b/std/shared/src/main/scala/cats/effect/std/SecureRandom.scala @@ -139,14 +139,31 @@ object SecureRandom extends SecureRandomCompanionPlatform { * on Linux, macOS, and BSD. Unsupported platforms such as Windows will encounter link-time * errors. */ - override def javaSecuritySecureRandom[F[_]: Sync]: F[SecureRandom[F]] = - javaSecuritySecureRandomGeneric + override def javaSecuritySecureRandom[F[_]: Sync]: F[SecureRandom[F]] = of + + /** + * Builds a `SecureRandom[F]` value for effect types that are [[cats.effect.kernel.Sync]] and + * initializes random state using the same effect type + * + * On the JVM, delegates to [[java.security.SecureRandom]]. + * + * In browsers, delegates to the + * [[https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API Web Crypto API]]. + * + * In Node.js, delegates to the [[https://nodejs.org/api/crypto.html crypto module]]. + * + * On Native, delegates to + * [[https://man7.org/linux/man-pages/man3/getentropy.3.html getentropy]] which is supported + * on Linux, macOS, and BSD. Unsupported platforms such as Windows will encounter link-time + * errors. + */ + override def of[F[_]: Sync]: F[SecureRandom[F]] = in[F, F] /** * Builds a `SecureRandom[G]` value for effect types that are [[cats.effect.kernel.Sync]] but * initializes random state using another effect constructor */ - override def javaSecuritySecureRandomGeneric[F[_]: Sync, G[_]: Sync]: F[SecureRandom[G]] = - super.javaSecuritySecureRandomGeneric[F, G] + override def in[F[_]: Sync, G[_]: Sync]: F[SecureRandom[G]] = + Sync[F].delay(unsafeJavaSecuritySecureRandom[G]()) } From a332e322fb57176369ddd0f784d53c752da72592 Mon Sep 17 00:00:00 2001 From: dpevunov-cp Date: Wed, 6 Aug 2025 17:34:17 +0400 Subject: [PATCH 4/4] to restart ci