this repo has no description
at main 84 lines 2.4 kB view raw
1module Worker = Brr_webworkers.Worker 2open Brr 3 4type t = { 5 mutable worker : Worker.t; 6 url : string; (* wrapped data: URL *) 7 extra_load : string option; 8 mutable on_message_cb : (X_protocol.response -> unit); 9} 10 11let current_url = 12 let url = Window.location G.window in 13 let path = Jstr.to_string (Uri.path url) in 14 let url = 15 match List.rev (String.split_on_char '/' path) with 16 | [] | "" :: _ -> url 17 | _ :: rev_path -> ( 18 let path = Jstr.of_string @@ String.concat "/" @@ List.rev rev_path in 19 match Uri.with_uri ~path ~query:Jstr.empty ~fragment:Jstr.empty url with 20 | Ok url -> url 21 | Error _ -> url) 22 in 23 Jstr.to_string (Uri.to_jstr url) 24 25let origin = 26 Jstr.to_string (Jv.Jstr.get (Jv.get (Window.to_jv G.window) "location") "origin") 27 28let absolute_url url = 29 if String.starts_with ~prefix:"http:" url || String.starts_with ~prefix:"https:" url 30 then url 31 else if String.starts_with ~prefix:"/" url then 32 origin ^ url 33 else current_url ^ url 34 35let wrap_url ?extra_load url = 36 let url = absolute_url url in 37 let extra = 38 match extra_load with 39 | None -> "" 40 | Some extra -> "','" ^ absolute_url extra 41 in 42 let script = "importScripts('" ^ url ^ extra ^ "');" in 43 let script = Jstr.of_string script in 44 let url = 45 match Base64.(encode (data_of_binary_jstr script)) with 46 | Ok data -> Jstr.to_string data 47 | Error _ -> assert false 48 in 49 "data:text/javascript;base64," ^ url 50 51let create_worker ?extra_load url = 52 Worker.create @@ Jstr.of_string @@ wrap_url ?extra_load url 53 54let register_listener t = 55 let fn m = 56 let m = Ev.as_type m in 57 let msg = Bytes.to_string @@ Brr_io.Message.Ev.data m in 58 t.on_message_cb (X_protocol.resp_of_string msg) 59 in 60 let _listener = 61 Ev.listen Brr_io.Message.Ev.message fn @@ Worker.as_target t.worker 62 in 63 () 64 65let make ?extra_load url = 66 let worker = create_worker ?extra_load url in 67 let t = { worker; url; extra_load; on_message_cb = (fun _ -> ()) } in 68 t 69 70let on_message t fn = 71 t.on_message_cb <- fn; 72 register_listener t 73 74let post t msg = Worker.post t.worker (X_protocol.req_to_bytes msg) 75 76let eval ~id ~line_number t code = 77 post t (Eval (id, line_number, code)) 78 79let fmt ~id t code = post t (Format (id, code)) 80 81let reset t = 82 Worker.terminate t.worker; 83 t.worker <- create_worker ?extra_load:t.extra_load t.url; 84 register_listener t