Completed
Pull Request — master (#110)
by Ruben de
75:02 queued 05:01
created

Throttler::getInstance()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 4
nc 2
nop 2
dl 0
loc 7
rs 9.4285
c 1
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
        $diff = $this->interval - (\microtime(true) - $this->lastTime);
65
66
        if ($diff > 0) {
67
            usleep((int)ceil($diff * 1000 * 1000));
68
        }
69
70
        $this->lastTime = \microtime(true);
71
    }
72
73
    private static $instances = [];
74
75
    public static function getInstance($key, $interval) {
76
        if (!isset(self::$instances[$key])) {
77
            self::$instances[$key] = new Throttler($interval);
78
        }
79
80
        return self::$instances[$key];
81
    }
82
}
83