evolution of the web
play

Evolution of the Web 1 Client Server 2 2 / 22 1 Client Server - PowerPoint PPT Presentation

E LIOM Tierless Web programming from the ground up Gabriel R ADANNE Jrme V OUILLON Vincent B ALAT Vasilis P APAVASILEIOU Evolution of the Web 1 Client Server 2 2 / 22 1 Client Server 2 2 / 22 1 Client Server DOM 2 2 / 22 1


  1. E LIOM Tierless Web programming from the ground up Gabriel R ADANNE Jérôme V OUILLON Vincent B ALAT Vasilis P APAVASILEIOU

  2. Evolution of the Web 1 Client Server 2 2 / 22

  3. 1 Client Server 2 2 / 22

  4. 1 Client Server DOM 2 2 / 22

  5. 1 Client Server DOM 2 2 / 22

  6. 1 Client Server DOM 2 Client 2 / 22

  7. 1 Client Server DOM 2 Client 2 / 22

  8. Client Mobile 1 Client Server DOM 2 Client 2 / 22

  9. Untyped Client Mobile 1 Client Server DOM 2 Client 2 / 22

  10. 3 / 22

  11. One language for everything 1 Client Server 2 4 / 22

  12. One language for everything 1 Client Server 2 Tierless languages: L INKS H OP U R /W EB E LIOM 4 / 22

  13. One language for everything 1 Client Server 2 Tierless languages: L INKS H OP U R /W EB E LIOM 4 / 22

  14. The O CSIGEN project E LIOM JS _ OF _ OCAML S ERVER OC AML 5 / 22

  15. The O CSIGEN project E LIOM JS _ OF _ OCAML S ERVER OC AML 5 / 22

  16. The O CSIGEN project Libraries Language extension JS _ OF _ OCAML S ERVER OC AML 5 / 22

  17. E LIOM ’s language extension 1 Examples of libraries in E LIOM 2 Widgets APIs 6 / 22

  18. Client and Server annotations Client Server Location annotations allow to use client and server code in the same program . 1 let % server s = ... 2 3 let % client c = ... 4 5 let % shared sh = ... The program is sliced during compilation. 7 / 22

  19. Building fragments of client code inside server code Fragments of client code can be included inside server code. 1 let % server x : int fragment = [% client 1 + 3 ] 8 / 22

  20. Building fragments of client code inside server code Fragments of client code can be included inside server code. 1 let % server x : int fragment = [% client 1 + 3 ] 1 let % server y = [ ("foo", x) ; ("bar", [% client 2]) ] 8 / 22

  21. Accessing server values in the client Injections allow to use server values on the client. 1 let % server s : int = 1 + 2 2 3 let % client c : int = ~%s + 1 9 / 22

  22. Everything at once We can combine injections and fragments. 1 let % server x : int fragment = [% client 1 + 3 ] 2 3 let % client c : int = 3 + ~%x 10 / 22

  23. Everything at once We can combine injections and fragments. 1 let % server x : int fragment = [% client 1 + 3 ] 2 3 let % client c : int = 3 + ~%x Gabriel Radanne and Jérôme Vouillon and Vincent Balat E LIOM : A core ML language for Tierless Web programming https://hal.archives-ouvertes.fr/hal-01349774 APLAS 2016 10 / 22

  24. E LIOM ’s language extension 1 Examples of libraries in E LIOM 2 Widgets APIs 11 / 22

  25. Counter widget A button with a counter. HTML for the button is generated on the server. The button has a client-side state: the counter. When the button is pressed, the counter is incremented on the client. The button is parameterized by a client-side action. 12 / 22

  26. Counter widget counter.eliom 1 let % server counter action = let state = [% client ref 0 ] in 2 button 3 ~button_type:‘Button 4 ~a:[a_onclick 5 [% client fun _ -> 6 incr ~%state; 7 ~%action !(~%state) ]] 8 [pcdata "Increment"] 9 13 / 22

  27. Counter widget counter.eliom 1 let % server counter action = let state = [% client ref 0 ] in 2 button 3 ~button_type:‘Button 4 ~a:[a_onclick 5 [% client fun _ -> 6 incr ~%state; 7 ~%action !(~%state) ]] 8 [pcdata "Increment"] 9 counter.eliomi 1 val % server counter: (int -> unit) fragment -> Html.t 13 / 22

  28. Execution E LIOM code 1 let % server counter action = let state = [% client ref 0 ] in 2 button 3 ~button_type:‘Button 4 ~a:[a_onclick 5 [% client fun _ -> 6 incr ~%state; 7 ~%action !(~%state) ]] 8 [pcdata "Increment"] 9 1 let fragment1 = ref 0 1 let counter action = let state = fragment1 in 2 2 3 let fragment2 state action = button 3 fun _ -> ~button_type:‘Button 4 4 ~a:[a_onclick incr (injection state); 5 5 (injection action) (fragment2 state action)] 6 6 !(injection state) [pcdata "Increment"] 7 7 Client code Server code 14 / 22

  29. Execution 1 let fragment1 = ref 0 1 let counter action = let state = fragment1 in 2 2 3 let fragment2 state action = button 3 fun _ -> ~button_type:‘Button 4 4 ~a:[a_onclick incr (injection state); 5 5 (injection action) (fragment2 state action)] 6 6 !(injection state) [pcdata "Increment"] 7 7 Client code Server code 1 Client Server 2 14 / 22

  30. Execution 1 let fragment1 = ref 0 1 let counter action = let state = fragment1 in 2 2 3 let fragment2 state action = button 3 fun _ -> ~button_type:‘Button 4 4 ~a:[a_onclick incr (injection state); 5 5 (injection action) (fragment2 state action)] 6 6 !(injection state) [pcdata "Increment"] 7 7 Client code Server code 1 Client Server 2 1 < button type = button onclick =...>Increment</ button > "state" → "fragment1" ; "action" → ... 14 / 22

  31. Counter widget What if we want to save the state of the counter on the server ? counter.eliomi 1 val % server counter: (int -> unit) fragment -> Html.t 15 / 22

  32. Remote Procedure Calls Remote Procedure Call (or RPC) is the action of a client calling the server without loading a new page and potentially getting a value back. Client Server 16 / 22

  33. Remote Procedure Calls A simplified RPC API: rpc.eliomi 1 type % server (’i,’o) t 2 type % client (’i,’o) t = ’i -> ’o 3 4 val % server create : (’i -> ’o) -> (’i, ’o) t 17 / 22

  34. Remote Procedure Calls A simplified RPC API: rpc.eliomi 1 type % server (’i,’o) t 2 type % client (’i,’o) t = ’i -> ’o 3 4 val % server create : (’i -> ’o) -> (’i, ’o) t An example using Rpc 1 let % server plus1 : (int, int) Rpc.t = Rpc.create ( fun x -> x + 1) 2 3 4 let % client f x = ~%plus1 x + 1 17 / 22

  35. Converters Converters are a way to converts datatype between server and client . Here is a schematized signature for ~% , the injection operator: 1 type % shared serial (* A serialization format *) 2 3 type % server (’a, ’b) converter = { serialize : ’a -> serial ; 4 deserialize : (serial -> ’b) fragment ; 5 6 } 7 8 (* Not a real type signature *) 9 val % client (~%) : (’a, ’b) converter -> ’a (* server *) -> ’b (* client *) 10 18 / 22

  36. Implementing RPC with converters 1 type % server (’i,’o) t = { url : string ; 2 handler: ’i -> ’o ; 3 4 } 5 6 type % client (’i, ’o) t = ’i -> ’o 7 8 let serialize t = serialize_string t.url 9 let deserialize x = let url = deserialize_string x in 10 fun i -> AJAX.get url i 11 19 / 22

  37. Widget + Rpc We can now use counter and Rpc together! 1 val % server save_counter : int -> unit 2 val % server counter : (int -> unit) fragment -> Html.t 3 4 let % server save_counter_rpc : (int, unit) Rpc.t = Rpc.create save_counter 5 6 7 let % server widget_with_save : Html.t = let f = [% client ~%save_counter_rpc] in 8 counter f 9 20 / 22

  38. Conclusion Typesafe client-server communication The whole OC AML ecosystem Encapsulation and composition for widgets In the paper: Implementation of bigger examples and other APIs All of this is implemented and used: https://ocsigen.org 21 / 22

  39. Questions ?

  40. Remote Procedure Calls Client Server 22 / 22

  41. Client-server reactive HTML Client Server DOM 22 / 22

  42. Bus/Multicast Client Server Client 22 / 22

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend