1 /** 2 Multicasts an input stream to multiple output streams. 3 4 Copyright: © 2014-2016 RejectedSoftware e.K. 5 License: Subject to the terms of the MIT license, as written in the included LICENSE.txt file. 6 Authors: Eric Cornelius 7 */ 8 module vibe.stream.multicast; 9 10 import vibe.core.core; 11 import vibe.core.stream; 12 13 import std.exception; 14 15 MulticastStream createMulticastStream(scope OutputStream[] outputs...) 16 { 17 return new MulticastStream(outputs, true); 18 } 19 20 21 class MulticastStream : OutputStream { 22 private { 23 OutputStream[] m_outputs; 24 } 25 26 deprecated("Use createMulticastStream instead.") 27 this(OutputStream[] outputs ...) 28 { 29 this(outputs, true); 30 } 31 32 /// private 33 this(scope OutputStream[] outputs, bool dummy) 34 { 35 // NOTE: investigate .dup dmd workaround 36 m_outputs = outputs.dup; 37 } 38 39 void finalize() 40 { 41 flush(); 42 } 43 44 void flush() 45 { 46 foreach (output; m_outputs) 47 output.flush(); 48 } 49 50 size_t write(in ubyte[] bytes, IOMode mode) 51 { 52 if (!m_outputs.length) return bytes.length; 53 54 auto ret = m_outputs[0].write(bytes, mode); 55 56 foreach (output; m_outputs[1 .. $]) 57 output.write(bytes[0 .. ret]); 58 59 return ret; 60 } 61 62 alias write = OutputStream.write; 63 }