-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.elm
134 lines (114 loc) · 3.7 KB
/
app.elm
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
module App exposing (..)
import Html exposing (..)
import Html.Events exposing (..)
import Html.Attributes exposing (..)
import OpenTok
import Task
main : Program Flags Model Msg
main =
Html.programWithFlags
{ init = init
, view = view
, update = update
, subscriptions = subscriptions
}
type alias Model =
{ credentials : OpenTok.Credentials
, status : String
, isConnected : Bool
, isPublishing : Bool
, publisherStreamId : String
, streamIds : List String
}
type alias Flags =
{ credentials : OpenTok.Credentials
}
sendMsg : msg -> Cmd msg
sendMsg msg =
Task.succeed msg
|> Task.perform identity
init : Flags -> (Model, Cmd Msg)
init flags =
(Model flags.credentials "" False False "" [], sendMsg Connect)
subContainerId : String -> String
subContainerId streamId = "subscriberContainer" ++ streamId
type Msg
= Connect
| ConnectCallback OpenTok.ConnectCallbackResult
| Disconnect
| PublishCallback OpenTok.PublishCallbackResult
| Subscribe String
| SubscribeCallback OpenTok.SubscribeCallbackResult
| Unsubscribe String
| OnStreamCreated OpenTok.StreamEvent
| OnStreamDestroyed OpenTok.StreamEvent
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
Connect ->
( { model | status = "" }
, OpenTok.connect model.credentials
)
ConnectCallback result ->
( { model | isConnected = result.success, status = result.message }
, if result.success
then (OpenTok.publish (OpenTok.PublishOptions model.credentials.sessionId "publisherContainer"))
else Cmd.none
)
Disconnect ->
( { model | status = "", isConnected = False, isPublishing = False, publisherStreamId = "", streamIds = [] }
, OpenTok.disconnect (OpenTok.DisconnectOptions model.credentials.sessionId)
)
PublishCallback result ->
( { model | isPublishing = result.success, status = result.message, publisherStreamId = result.streamId }
, Cmd.none
)
Subscribe streamId ->
( model
, OpenTok.subscribe
(OpenTok.SubscribeOptions model.credentials.sessionId streamId (subContainerId streamId))
)
SubscribeCallback result ->
( { model | status = result.message }
, Cmd.none
)
Unsubscribe streamId ->
( model
, OpenTok.unsubscribe (OpenTok.UnsubscribeOptions model.credentials.sessionId streamId)
)
OnStreamCreated event ->
( { model | streamIds = (model.streamIds ++ [event.streamId]) }
, sendMsg (Subscribe event.streamId)
)
OnStreamDestroyed event ->
( { model | streamIds = (List.filter (\a -> a /= event.streamId) model.streamIds) }
, sendMsg (Unsubscribe event.streamId)
)
streamIdToContainer : String -> Html Msg
streamIdToContainer streamId =
div []
[ div [] [text ("Subscriber " ++ streamId)]
, div [id (subContainerId streamId)] []
]
view : Model -> Html Msg
view model =
div []
([ div [] [ text ("Connected: " ++ (if model.isConnected then "Yes" else "No")) ]
, if model.isConnected
then (button [onClick Disconnect] [text "Disconnect"])
else (button [onClick Connect] [ text "Connect" ])
, div [] [ text model.status ]
, div []
[ div [] [text (if model.isPublishing then "Publisher " ++ model.publisherStreamId else "Publisher")]
, div [id "publisherContainer"] []
]
] ++ (List.map streamIdToContainer model.streamIds))
subscriptions : Model -> Sub Msg
subscriptions model =
Sub.batch
[ OpenTok.connectCallback ConnectCallback
, OpenTok.publishCallback PublishCallback
, OpenTok.subscribeCallback SubscribeCallback
, OpenTok.onStreamCreated OnStreamCreated
, OpenTok.onStreamDestroyed OnStreamDestroyed
]