OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | |
2 // for details. All rights reserved. Use of this source code is governed by a | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 library microlytics.channels; | |
6 | |
7 import 'dart:async'; | |
8 | |
9 const String ANALYTICS_URL = "https://ssl.google-analytics.com/collect"; | |
ahe
2014/09/05 07:51:36
Sorry, I know I suggested using ssl. here, but the
| |
10 | |
11 abstract class Channel { | |
12 void sendData(String data); | |
13 void shutdown() {} | |
14 } | |
15 | |
16 /// [Channel] that implements a leaky bucket | |
17 /// algorithm to provide rate limiting. | |
18 /// See [http://en.wikipedia.org/wiki/Leaky_bucket]. | |
ahe
2014/09/05 07:51:36
Just a thought. You might want to consider this al
| |
19 class RateLimitingBufferedChannel extends Channel { | |
20 final List<String> _buffer = <String>[]; | |
ahe
2014/09/05 07:51:36
Wouldn't a Queue be a better fit?
| |
21 final Channel _innerChannel; | |
22 final int _bufferSizeLimit; | |
23 Timer _timer; | |
24 | |
25 RateLimitingBufferedChannel( | |
26 this._innerChannel, | |
27 {int bufferSizeLimit: 10, | |
28 double packetsPerSecond: 1.0}) | |
29 : this._bufferSizeLimit = bufferSizeLimit { | |
30 if (!(packetsPerSecond > 0)) { | |
31 throw new ArgumentError("packetsPerSecond must be larger than zero"); | |
ahe
2014/09/05 07:51:36
Not a proper sentence (no period).
| |
32 } | |
33 | |
34 int transmitDelay = (1000 / packetsPerSecond).floor(); | |
35 _timer = new Timer.periodic(new Duration(milliseconds: transmitDelay), | |
36 (_) => _onTimerTick() ); | |
ahe
2014/09/05 07:51:36
Weird formatting, and extra space between ) ).
Su
| |
37 } | |
38 | |
39 void _onTimerTick() { | |
40 if (_buffer.length > 0) { | |
41 String item = _buffer.removeLast(); | |
42 _innerChannel.sendData(item); | |
43 } | |
44 } | |
45 | |
46 void sendData(String data) { | |
47 if (_buffer.length >= _bufferSizeLimit) return; | |
48 _buffer.add(data); | |
49 } | |
50 | |
51 void shutdown() { | |
52 _timer.cancel(); | |
53 _innerChannel.shutdown(); | |
54 } | |
55 } | |
OLD | NEW |