Chromium Code Reviews| 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 |