In JS, we can do something like:
blob = new Blob(["Hello World"], {type: "application/javascript"})
URL.createObjectURL(blob)
This allows us to encode a string into an Object URL, so that requesting the URL return the string (as a blob).
Is there a way to do this in Brr? I can not find createObjectURL
while grepping through the codebase.
I donât think thereâs a binding to that particular function (I donât see anything in Brr.Uri
), so youâll have to do it yourself. Something along the lines of
module Url : sig
val create_object_url : Brr.Blob.t -> Jstr.t
end = struct
let url = Jv.get Jv.global "URL"
let create_object_url blob =
Jv.call url "createObjectURL" [| (Brr.Blob.to_jv blob) |]
|> Jv.to_jstr
end
let () =
let init = Brr.Blob.init ~type':(Jstr.v "application/javascript") () in
let s = Url.create_object_url (Brr.Blob.of_jstr ~init (Jstr.v "Hello World")) in
Brr.Console.log [ s ]
1 Like
Dumb (on my part) question: independently, I was trying:
external create_object_url_from_blob : Brr.Blob.t -> Brr.Uri.t = "URL.createObjectURL"
however, when I try to call it, I get a runtime error of:
Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'createObjectURL')
It appears âURLâ is undefined for some reason in this case. What am I doing wrong ?
The external
keyword is not meant to be used in that way. In ânormalâ OCaml code it is used to call C functions. When compiling to JS with jsoo, you have to follow this guidance for writing JS stubs. Typically you wonât need to use it. Exceptions are when you are trying to provide JS support to an OCaml library that uses C code. For example, see Cstruct ocaml-cstruct/cstruct.js at main ¡ mirage/ocaml-cstruct ¡ GitHub
1 Like