bc4778927043d75464e74eaaa0d8da84dd7bf3de
[nit.git] / contrib / tnitter / src / push.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 # Tnitter support for push notifications
16 module push
17
18 import nitcorn
19 import json::serialization
20
21 import model
22 import database
23
24 # Tnitter push notification interface
25 class TnitterPush
26 super Action
27
28 # Intercept the full answer to set aside the connection and complete it later
29 redef fun prepare_respond_and_close(request, turi, connection)
30 do
31 push_connections.add connection
32 end
33 end
34
35 redef class Sys
36 # Connections left open for a push notification
37 private var push_connections = new Array[HttpServer]
38 end
39
40 redef class DB
41 # Reopen to trigger sending push notifications
42 redef fun post(user, text)
43 do
44 super
45
46 # Everyone gets the same response
47 var posts = list_posts(0, 16)
48 var response = new HttpResponse(400)
49 response.body = posts.serialize_to_json
50
51 for conn in push_connections do
52 # Complete the answer to `conn`
53 conn.respond response
54 conn.close
55 end
56
57 # Clients need to open new connections
58 push_connections.clear
59 end
60 end