forked from louthy/language-ext
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ActorDispatchJS.cs
64 lines (52 loc) · 2.22 KB
/
ActorDispatchJS.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
namespace LanguageExt
{
internal class ActorDispatchJS : IActorDispatch
{
public readonly ProcessId ProcessId;
public readonly ProcessId RelayId;
public readonly ActorItem Js;
public ActorDispatchJS(ProcessId pid, ProcessId relay, ActorItem js)
{
ProcessId = pid;
RelayId = relay;
Js = js;
}
public Map<string, ProcessId> GetChildren()
{
throw new NotImplementedException();
}
public IObservable<T> Observe<T>()
{
throw new NotImplementedException();
}
public IObservable<T> ObserveState<T>()
{
throw new NotImplementedException();
}
public Unit Tell(object message, ProcessId sender, Message.TagSpec tag) =>
Tell(message, sender, "user", Message.Type.User, tag);
public Unit TellSystem(SystemMessage message, ProcessId sender) =>
Tell(message, sender, "user", Message.Type.System, message.Tag);
public Unit TellUserControl(UserControlMessage message, ProcessId sender) =>
Tell(message, sender, "system", Message.Type.UserControl, message.Tag);
private Unit Tell(object message, ProcessId sender, string inbox, Message.Type type, Message.TagSpec tag)
{
var dto = RemoteMessageDTO.Create(message, ProcessId, sender, type, tag);
// The standard structure for remote js relay paths are "/root/js/{connection-id}/..."
var connectionId = ProcessId.Skip(2).Take(1).GetName().Value;
dto.To = ProcessId.Skip(3).Path;
var relayMsg = new OutboundRelayMsg(connectionId, dto, dto.To, sender, dto.RequestId != -1);
return Process.tell(RelayId, relayMsg, sender);
}
public Unit Ask(object message, ProcessId sender) =>
Tell(message, sender, "user", Message.Type.User, Message.TagSpec.UserAsk);
public Unit Publish(object message)
{
throw new NotSupportedException();
}
public Unit Kill() =>
// TODO: Not yet implemented on the JS side
ProcessId.Tell(SystemMessage.ShutdownProcess, ActorContext.Self);
}
}