Completed
Pull Request — master (#125)
by thomas
03:07 queued 45s
created

Throttler::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 1
dl 0
loc 3
ccs 0
cts 3
cp 0
crap 2
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace Blocktrail\SDK;
4
5
use BitWasp\Bitcoin\Address\PayToPubKeyHashAddress;
6
use BitWasp\Bitcoin\Bitcoin;
7
use BitWasp\Bitcoin\Crypto\EcAdapter\EcSerializer;
8
use BitWasp\Bitcoin\Crypto\EcAdapter\Key\PublicKeyInterface;
9
use BitWasp\Bitcoin\Crypto\EcAdapter\Serializer\Signature\CompactSignatureSerializerInterface;
10
use BitWasp\Bitcoin\Crypto\Random\Random;
11
use BitWasp\Bitcoin\Key\Deterministic\HierarchicalKey;
12
use BitWasp\Bitcoin\Key\Deterministic\HierarchicalKeyFactory;
13
use BitWasp\Bitcoin\MessageSigner\MessageSigner;
14
use BitWasp\Bitcoin\MessageSigner\SignedMessage;
15
use BitWasp\Bitcoin\Mnemonic\Bip39\Bip39SeedGenerator;
16
use BitWasp\Bitcoin\Mnemonic\MnemonicFactory;
17
use BitWasp\Bitcoin\Network\NetworkFactory;
18
use BitWasp\Bitcoin\Transaction\TransactionFactory;
19
use BitWasp\Buffertools\Buffer;
20
use BitWasp\Buffertools\BufferInterface;
21
use Blocktrail\CryptoJSAES\CryptoJSAES;
22
use Blocktrail\SDK\Address\AddressReaderBase;
23
use Blocktrail\SDK\Address\BitcoinAddressReader;
24
use Blocktrail\SDK\Address\BitcoinCashAddressReader;
25
use Blocktrail\SDK\Address\CashAddress;
26
use Blocktrail\SDK\Backend\BlocktrailConverter;
27
use Blocktrail\SDK\Backend\BtccomConverter;
28
use Blocktrail\SDK\Backend\ConverterInterface;
29
use Blocktrail\SDK\Bitcoin\BIP32Key;
30
use Blocktrail\SDK\Connection\RestClient;
31
use Blocktrail\SDK\Exceptions\BlocktrailSDKException;
32
use Blocktrail\SDK\Network\BitcoinCash;
33
use Blocktrail\SDK\Connection\RestClientInterface;
34
use Blocktrail\SDK\Network\BitcoinCashRegtest;
35
use Blocktrail\SDK\Network\BitcoinCashTestnet;
36
use Blocktrail\SDK\V3Crypt\Encryption;
37
use Blocktrail\SDK\V3Crypt\EncryptionMnemonic;
38
use Blocktrail\SDK\V3Crypt\KeyDerivation;
39
40
class Throttler {
41
42
    /**
43
     * @var float|null
44
     */
45
    private $lastTime = null;
46
47
    /**
48
     * interval to wait in seconds, can be float
49
     *
50
     * @var float
51
     */
52
    private $interval;
53
54
    public function __construct($interval) {
55
        $this->interval = $interval;
56
    }
57
58
    public function waitForThrottle() {
59
        if (!$this->lastTime) {
60
            $this->lastTime = \microtime(true);
61
            return;
62
        }
63
64
        $now = \microtime(true);
65
        $diff = $this->interval - ($now - $this->lastTime);
66
67
        echo "Throttle routine \n";
68
        echo "* interval is {$this->interval}\n";
69
        echo "* now is {$now}\n";
70
        echo "* lastTime is {$this->lastTime}\n";
71
        echo "* wait time should be $diff\n";
72
73
        if ($diff > 0) {
74
            $usleep = (int)ceil($diff * 1000 * 1000);
75
            echo "do sleep ($diff, $usleep)\n";
76
            usleep($usleep);
77
        }
78
79
        if ($this->lastTime) {
80
            echo "Real diff ".(microtime(true)-$this->lastTime).PHP_EOL;
81
        }
82
        $this->lastTime = \microtime(true);
83
    }
84
85
    private static $instances = [];
86
87
    public static function getInstance($key, $interval) {
88
        if (!isset(self::$instances[$key])) {
89
            self::$instances[$key] = new Throttler($interval);
90
        }
91
92
        return self::$instances[$key];
93
    }
94
}
95