2016-01-24 5 views
6

मैं अपने servant सर्वर पर एक कार्यक्षमता जोड़ने की कोशिश कर रहा हूं जो अमेज़ॅन एस 3 से एक फ़ाइल प्राप्त करेगी और उसे उपयोगकर्ता को वापस स्ट्रीम करेगा। क्योंकि फाइलें बड़ी हो सकती हैं क्योंकि मैं उन्हें स्थानीय रूप से डाउनलोड नहीं करना चाहता हूं और फिर उन्हें ग्राहकों को सेवा देना चाहता हूं, इसलिए मैं उन्हें सीधे एस 3 से ग्राहकों तक स्ट्रीम करना पसंद करूंगा।हास्केल नौकर और स्ट्रीमिंग

मैं Amazonka का उपयोग करता हूं जो मैं एस 3 के साथ करता हूं और मैं Conduit सिंक के रूप में एक एस 3 फ़ाइल के लिए स्ट्रीम प्राप्त कर सकता हूं।

लेकिन अब मुझे नहीं पता कि Sink से EitherT ServantErr IO a तक कैसे प्राप्त करें।

क्या कोई मुझे बता सकता है कि इसे कैसे करें या मुझे कुछ उदाहरण दिखाएं कि यह कैसे किया जा सकता है?

+0

वर्तमान में "स्ट्रीम एंडपॉइंट समर्थन" जोड़ने के लिए नौकर में एक पीआर है। https://github.com/haskell-servant/servant/pull/836 – erewok

उत्तर

4

नौकर में यह सब कुछ करने के लिए नहीं है, हालांकि सभी आवश्यक भागों उपलब्ध हैं।

आरंभ करने से पहले, मुझे लगता है कि यदि आप एक सिंक को स्ट्रीम कर सकते हैं, इसका मतलब है कि आप एक स्रोत

सबसे पहले (GetObjectResponse की gorsBody एक RsBody है, जो एक स्रोत है), नौकर प्रदान करता है HasServer का नया उदाहरण बनाकर, नए रिटर्न प्रकारों के लिए समर्थन जोड़ने की संभावना के साथ, हम EitherT ServantErr IO (Source ...) पर सेवा कर सकते हैं और इसे स्ट्रीम कर सकते हैं।

उस उदाहरण को बनाने के लिए, हमें route :: Proxy layout -> Server layout -> RoutingApplication लागू करना होगा। Server layout, इस मामले में, बस EitherT ServantErr IO layout, layout वह स्रोत है जिसे हम सर्वर बनाना चाहते हैं, इसलिए यह वह कार्य है जो स्रोत लौटाता है (और HTTP त्रुटि के साथ विफल हो सकता है)।

हम एक RoutingApplication एक समारोह है कि एक Request लेता है और एक RouteResult Response देता है, जो या तो एक बेजोड़ मार्ग त्रुटि, या एक प्रतिक्रिया का मतलब है वापस जाने के लिए है, जो है (निरंतरता शैली में) है। Request और Response दोनों मानक वाई हैं, नौकर नहीं, इसलिए अब हम इसे पार करने के तरीके को खोजने के लिए शेष पारिस्थितिक तंत्र को देख सकते हैं।

सौभाग्य से, हम दूर जाने की आवश्यकता नहीं है: Network.Wai.Conduit शामिल बस क्या हम route समारोह लागू करने की आवश्यकता: responseSource एक स्थिति मान, कुछ प्रतिक्रिया हेडर और अपने स्रोत लेता है और आप एक Response देता है।

तो, यह करने के लिए काफी काम है, लेकिन हमें जो भी चाहिए वह वहां है। source of the instance HasServer * (Get ...) देखकर मदद मिल सकती है।

+0

मुझे लगता है कि WAI स्तर पर ऐसा करने के तरीके के बारे में एक स्पष्टीकरण/संदर्भ जोड़ना अच्छा होगा यह समझने के लिए कि यह नौकर स्तर में कैसे फिट बैठता है। मेरे लिए यह स्पष्ट नहीं है कि 'मार्ग' रिटर्न क्या है और यहां निरंतरता शैली सेटअप के बारे में क्या सोचना है। – user239558

संबंधित मुद्दे