0 | module Crypto.Random.JS
 1 |
 2 | import Crypto.Random
 3 | import System.FFI
 4 | import Data.Vect
 5 | import Utils.Misc
 6 | import Data.Buffer
 7 | import System.Info
 8 |
 9 | %foreign "node:lambda:n => require('crypto').randomBytes(n)"
10 | prim_io__randomBytes : Int -> PrimIO Buffer
11 |
12 | -- Test this
13 | %foreign "javascript:lambda:n => crypto.getRandomValues(new Uint8Array(n))"
14 | prim_io__getRandomValues : Int -> PrimIO Buffer
15 |
16 | buffer_content : HasIO io => (Int -> PrimIO Buffer) -> (n : Nat) -> io (Vect n Bits8)
17 | buffer_content f n = do
18 |   buffer <- primIO $ f (cast n)
19 |   traverse (getBits8 buffer) $ map (cast . finToNat) range
20 |
21 | public export
22 | HasIO io => MonadRandom io where
23 |   random_bytes Z = pure []
24 |   random_bytes n =
25 |     case codegen of
26 |       "node" => buffer_content prim_io__randomBytes n
27 |       "javascript" => buffer_content prim_io__getRandomValues n
28 |       _ => assert_total $ idris_crash "no random backend availible"
29 |