1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465openBrrmoduleWorker=Brr_webworkers.Worker(* When a query is sent to the Worker we keep the Future result in an indexed
table so that the on_message function will be able to determine the Future when
the answer is posted by the Worker.
The Worker works synchronously so we expect answer to arrive in order. *)typeworker={worker:Worker.t;queue:(Protocol.answer->unit)Queue.t}letadd_futworkerres=Queue.addresworker.queueletres_futworkerv=(Queue.takeworker.queue)vletmake_workerurl=letworker=Worker.create@@Jstr.of_stringurlinletqueue=Queue.create()inletworker={worker;queue}inleton_messagem=letm=Ev.as_typeminletdata_marshaled:bytes=Brr_io.Message.Ev.dataminletdata:Protocol.answer=Marshal.from_bytesdata_marshaled0inres_futworkerdatainlet_listener=Ev.listenBrr_io.Message.Ev.messageon_message@@Worker.as_targetworker.workerinworker(* todo share that with worker *)typeaction=Completion|Type_enclosing|Errorstypeerrors=Protocol.errorlistletquery~actionworker(*todo: other queries*)=letfut,set=Fut.create()inadd_futworkerset;Worker.postworker.worker(Marshal.to_bytesaction[]);futletquery_errorsworker(source:string)=letopenFut.Syntaxinletaction=Protocol.All_errorssourceinlet+(data:Protocol.answer)=query~actionworkerinConsole.(log["Received errors:";data]);matchdatawithProtocol.Errorserrors->errors|_->assertfalseletquery_completionsworker(source:string)position=letopenFut.Syntaxinletaction=Protocol.Complete_prefix(source,position)inlet+(data:Protocol.answer)=query~actionworkerinConsole.(log["Received completions:";data]);matchdatawithProtocol.Completionscompl->compl|_->assertfalseletquery_typeworker(source:string)position=letopenFut.Syntaxinletaction=Protocol.Type_enclosing(source,position)inlet+(data:Protocol.answer)=query~actionworkerinConsole.(log["Received typed enclosings:";data]);matchdatawithProtocol.Typed_enclosingsl->l|_->assertfalseletadd_cmisworkercmis=letopenFut.Syntaxinletaction=Protocol.Add_cmiscmisinlet+(data:Protocol.answer)=query~actionworkerinConsole.(log["Received response from adding cmis:";data]);matchdatawithProtocol.Added_cmis->()|_->assertfalse