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 final String ANALYTICS_URL = "https://www.google-analytics.com/collect"; | |
ahe
2014/09/03 08:51:31
I'm not sure this is related to channels.
lukechurch
2014/09/04 12:58:41
True. I thought that having a separate class to de
| |
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/03 08:51:31
Add period, and use [] instead of ().
lukechurch
2014/09/04 12:58:41
Done.
| |
19 class RateLimitingBufferedChannel extends Channel { | |
20 final List<String> _buffer = <String>[]; | |
21 final Channel _innerChannel; | |
22 final int bufferSizeLimit; | |
23 Timer _timer; | |
24 | |
25 RateLimitingBufferedChannel( | |
26 this._innerChannel, | |
27 { this.bufferSizeLimit: 10, | |
ahe
2014/09/03 08:51:31
Remove space after {.
lukechurch
2014/09/04 12:58:41
Done.
| |
28 double packetsPerSecond: 1.0}) { | |
29 if (!(packetsPerSecond > 0)) { | |
30 throw new ArgumentError("packetsPerSecond must be larger than zero"); | |
31 } | |
32 | |
33 int transmitDelay = (1000 / packetsPerSecond).floor(); | |
34 _timer = new Timer(new Duration(milliseconds: transmitDelay), () { | |
35 _onTimerTick(); | |
36 }); | |
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 |