gloo_worker/actor/
registrar.rs1use std::fmt;
2use std::marker::PhantomData;
3
4use serde::de::Deserialize;
5use serde::ser::Serialize;
6
7use super::lifecycle::WorkerLifecycleEvent;
8use super::messages::{FromWorker, ToWorker};
9use super::native_worker::{DedicatedWorker, NativeWorkerExt, WorkerSelf};
10use super::scope::WorkerScope;
11use super::traits::Worker;
12use crate::codec::{Bincode, Codec};
13
14pub struct WorkerRegistrar<W, CODEC = Bincode>
16where
17 W: Worker,
18 CODEC: Codec,
19{
20 _marker: PhantomData<(W, CODEC)>,
21}
22
23impl<W: Worker> fmt::Debug for WorkerRegistrar<W> {
24 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
25 f.write_str("WorkerRegistrar<_>")
26 }
27}
28
29impl<W, CODEC> WorkerRegistrar<W, CODEC>
30where
31 W: Worker + 'static,
32 CODEC: Codec,
33{
34 pub(crate) fn new() -> Self {
35 Self {
36 _marker: PhantomData,
37 }
38 }
39
40 pub fn encoding<C>(&self) -> WorkerRegistrar<W, C>
42 where
43 C: Codec,
44 {
45 WorkerRegistrar::new()
46 }
47
48 pub fn register(&self)
50 where
51 CODEC: Codec,
52 W::Input: Serialize + for<'de> Deserialize<'de>,
53 W::Output: Serialize + for<'de> Deserialize<'de>,
54 {
55 let scope = WorkerScope::<W>::new::<CODEC>();
56 let upd = WorkerLifecycleEvent::Create(scope.clone());
57 scope.send(upd);
58 let handler = move |msg: ToWorker<W>| {
59 let upd = WorkerLifecycleEvent::Remote(msg);
60 scope.send(upd);
61 };
62 let loaded: FromWorker<W> = FromWorker::WorkerLoaded;
63 let worker = DedicatedWorker::worker_self();
64 worker.set_on_packed_message::<_, CODEC, _>(handler);
65 worker.post_packed_message::<_, CODEC>(loaded);
66 }
67}