reworking
[p2pool.git] / p2pool / worker_interface.py
1 from __future__ import division
2
3 import json
4 import traceback
5
6 from twisted.internet import defer
7
8 from util import jsonrpc, deferred_resource
9
10 class LongPollingWorkerInterface(deferred_resource.DeferredResource):
11     def __init__(self, work, compute):
12         self.work = work
13         self.compute = compute
14     
15     @defer.inlineCallbacks
16     def render_GET(self, request):
17         request.setHeader('X-Long-Polling', '/long-polling')
18         
19         res = self.compute((yield self.work.changed.get_deferred()))
20         
21         request.write(json.dumps({
22             'jsonrpc': '2.0',
23             'id': 0,
24             'result': res,
25             'error': None,
26         }))
27     render_POST = render_GET
28
29 class WorkerInterface(jsonrpc.Server):
30     extra_headers = {
31         'X-Long-Polling': '/long-polling',
32     }
33     
34     def __init__(self, work, compute, response_callback):
35         jsonrpc.Server.__init__(self)
36         
37         self.work = work
38         self.compute = compute
39         self.response_callback = response_callback
40         
41         self.putChild('long-polling',
42             LongPollingWorkerInterface(self.work, self.compute))
43         self.putChild('', self)
44     
45     def rpc_getwork(self, data=None):
46       try:
47         if data is not None:
48             return self.response_callback(data)
49         
50         return self.compute(self.work.value)
51       except ValueError:
52         traceback.print_exc()