@electrum-cash/network 4.0.0-development.6391574314 → 4.0.0-development.6392223875

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -19,20 +19,11 @@ Install the library with NPM:
19
19
 
20
20
  Before you can use the library you need to include it in your project.
21
21
 
22
- If you only want to use a **single server**, load the `ElectrumClient` module:
23
-
24
22
  ```js
25
23
  // Load the electrum library.
26
24
  const { ElectrumClient } = require('electrum-cash');
27
25
  ```
28
26
 
29
- If you want to use **multiple servers**, load the `ElectrumCluster` module:
30
-
31
- ```js
32
- // Load the electrum library.
33
- const { ElectrumCluster } = require('electrum-cash');
34
- ```
35
-
36
27
  ### Usage on Web
37
28
 
38
29
  To use the library on the web, use the ESM import syntax and include the `ElectrumTransport` import:
@@ -64,29 +55,9 @@ const electrum = new ElectrumClient(
64
55
  );
65
56
  ```
66
57
 
67
- If you want to use multiple servers, initialize an `ElectrumCluster` and add some servers:
68
-
69
- *For more information on various cluster configurations, read the [cluster documentation](https://read.cash/@JonathanSilverblood/electrum-cash-strategic-use-of-clusters-83743111).*
70
-
71
- ```js
72
- // Initialize an electrum cluster where 2 out of 3 needs to be consistent, polled randomly with fail-over (default).
73
- const electrum = new ElectrumCluster('Electrum cluster example', '1.4.1', 2, 3);
74
-
75
- // Add some servers to the cluster.
76
- electrum.addServer('bch.imaginary.cash');
77
- electrum.addServer('electroncash.de');
78
- electrum.addServer('electroncash.dk');
79
- electrum.addServer('electron.jochen-hoenicke.de', 51002);
80
- electrum.addServer('electrum.imaginary.cash');
81
-
82
- // Wait for enough connections to be available.
83
- await electrum.ready();
84
- ```
85
-
86
-
87
58
  ### Request information
88
59
 
89
- Once your `ElectrumClient` or `ElectrumCluster` is connected and ready, you can call methods:
60
+ Once your `ElectrumClient` is connected and ready, you can call methods:
90
61
 
91
62
  *For a list of methods you can use, refer to the [Electrum Cash documentation](https://bitcoincash.network/electrum/).*
92
63
 
@@ -103,7 +74,7 @@ console.log(transactionHex);
103
74
 
104
75
  ### Subscribe to notifications.
105
76
 
106
- Once your `ElectrumClient` or `ElectrumCluster` is connected and ready, you can set up subscriptions to get notifications on events:
77
+ Once your `ElectrumClient` is connected and ready, you can set up subscriptions to get notifications on events:
107
78
 
108
79
  *For a list of methods you can subscribe to, refer to the [Electrum Cash documentation](https://bitcoincash.network/electrum/).*
109
80
 
@@ -147,13 +118,6 @@ If you're using a single `ElectrumClient`, call the `disconnect()` function:
147
118
  await electrum.disconnect();
148
119
  ```
149
120
 
150
- If you're using a `ElectrumCluster` with multiple servers, call the `shutdown()` function.
151
-
152
- ```js
153
- // Close all connections.
154
- await electrum.shutdown();
155
- ```
156
-
157
121
  ## Documentation
158
122
 
159
123
  For a complete list of methods and parameters, read the [API documentation](https://generalprotocols.gitlab.io/electrum-cash/library/).
package/dist/index.d.ts CHANGED
@@ -21,36 +21,6 @@ interface RPCErrorResponse extends RPCBase {
21
21
  error: RPCError;
22
22
  }
23
23
  type RPCResponse = RPCErrorResponse | RPCStatement;
24
- /**
25
- * Enum that denotes the ordering to use in an ElectrumCluster.
26
- * @enum {number}
27
- * @property {0} RANDOM Send requests to randomly selected servers in the cluster.
28
- * @property {1} PRIORITY Send requests to servers in the cluster in the order they were added.
29
- */
30
- export enum ClusterOrder {
31
- RANDOM = 0,
32
- PRIORITY = 1
33
- }
34
- /**
35
- * Enum that denotes the distribution setting to use in an ElectrumCluster.
36
- * @enum {number}
37
- * @property {0} ALL Send requests to all servers in the cluster.
38
- */
39
- export enum ClusterDistribution {
40
- ALL = 0
41
- }
42
- /**
43
- * Enum that denotes the ready status of an ElectrumCluster.
44
- * @enum {number}
45
- * @property {0} DISABLED The cluster is disabled and unusable.
46
- * @property {1} DEGRADED The cluster is degraded but still usable.
47
- * @property {2} READY The cluster is healthy and ready for use.
48
- */
49
- export enum ClusterStatus {
50
- DISABLED = 0,
51
- DEGRADED = 1,
52
- READY = 2
53
- }
54
24
  /**
55
25
  * Enum that denotes the availability of an ElectrumClient.
56
26
  * @enum {number}
@@ -138,9 +108,6 @@ export const DefaultParameters: {
138
108
  RECONNECT: number;
139
109
  TIMEOUT: number;
140
110
  PING_INTERVAL: number;
141
- CLUSTER_CONFIDENCE: number;
142
- CLUSTER_DISTRIBUTION: ClusterDistribution;
143
- CLUSTER_ORDER: ClusterOrder;
144
111
  USE_BIG_INT: boolean;
145
112
  };
146
113
  /**
@@ -1 +1 @@
1
- {"mappings":"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","sources":["lib/lib/util.ts","lib/lib/rpc-interfaces.ts","lib/lib/electrum-protocol.ts","lib/lib/enums.ts","lib/lib/interfaces.ts","lib/lib/constants.ts","lib/lib/electrum-socket.ts","lib/lib/electrum-connection.ts","lib/lib/electrum-client.ts","lib/lib/index.ts","lib/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,"export { default as ElectrumClient } from './electrum-client';\n\nexport * from './interfaces';\nexport * from './constants';\nexport * from './enums';\n"],"names":[],"version":3,"file":"index.d.ts.map"}
1
+ {"mappings":"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","sources":["lib/lib/util.ts","lib/lib/rpc-interfaces.ts","lib/lib/electrum-protocol.ts","lib/lib/enums.ts","lib/lib/interfaces.ts","lib/lib/constants.ts","lib/lib/electrum-socket.ts","lib/lib/electrum-connection.ts","lib/lib/electrum-client.ts","lib/lib/index.ts","lib/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,"export { default as ElectrumClient } from './electrum-client';\n\nexport * from './interfaces';\nexport * from './constants';\nexport * from './enums';\n"],"names":[],"version":3,"file":"index.d.ts.map"}
package/dist/index.mjs CHANGED
@@ -14,7 +14,6 @@ function $parcel$export(e, n, v, s) {
14
14
  // Create the debug logs.
15
15
  const $ef5ba40c8abe5a13$var$debug = {
16
16
  client: (0, $4QiMX$debug)("electrum-cash:client "),
17
- cluster: (0, $4QiMX$debug)("electrum-cash:cluster"),
18
17
  errors: (0, $4QiMX$debug)("electrum-cash:error "),
19
18
  warning: (0, $4QiMX$debug)("electrum-cash:warning"),
20
19
  network: (0, $4QiMX$debug)("electrum-cash:network"),
@@ -22,7 +21,6 @@ const $ef5ba40c8abe5a13$var$debug = {
22
21
  };
23
22
  // Set log colors.
24
23
  $ef5ba40c8abe5a13$var$debug.client.color = "2";
25
- $ef5ba40c8abe5a13$var$debug.cluster.color = "3";
26
24
  $ef5ba40c8abe5a13$var$debug.errors.color = "9";
27
25
  $ef5ba40c8abe5a13$var$debug.warning.color = "13";
28
26
  $ef5ba40c8abe5a13$var$debug.network.color = "4";
@@ -91,49 +89,6 @@ var $5abc8fb342687c03$exports = {};
91
89
 
92
90
  $parcel$export($5abc8fb342687c03$exports, "ElectrumTransport", () => $5abc8fb342687c03$export$d048df559e6d3842);
93
91
  $parcel$export($5abc8fb342687c03$exports, "DefaultParameters", () => $5abc8fb342687c03$export$f019be48b3aacb1a);
94
- var $a58372b18a18806e$exports = {};
95
-
96
- $parcel$export($a58372b18a18806e$exports, "ClusterOrder", () => $a58372b18a18806e$export$161fe3707f756bf9);
97
- $parcel$export($a58372b18a18806e$exports, "ClusterDistribution", () => $a58372b18a18806e$export$436a960acc41e848);
98
- $parcel$export($a58372b18a18806e$exports, "ClusterStatus", () => $a58372b18a18806e$export$c66b56bc0ff967ca);
99
- $parcel$export($a58372b18a18806e$exports, "ClientState", () => $a58372b18a18806e$export$c4f81c6d30ca200f);
100
- $parcel$export($a58372b18a18806e$exports, "ConnectionStatus", () => $a58372b18a18806e$export$7516420eb880ab68);
101
- // Disable indent rule for this file because it is broken (https://github.com/typescript-eslint/typescript-eslint/issues/1824)
102
- /* eslint-disable @typescript-eslint/indent */ /**
103
- * Enum that denotes the ordering to use in an ElectrumCluster.
104
- * @enum {number}
105
- * @property {0} RANDOM Send requests to randomly selected servers in the cluster.
106
- * @property {1} PRIORITY Send requests to servers in the cluster in the order they were added.
107
- */ var $a58372b18a18806e$export$161fe3707f756bf9;
108
- (function(ClusterOrder) {
109
- ClusterOrder[ClusterOrder["RANDOM"] = 0] = "RANDOM";
110
- ClusterOrder[ClusterOrder["PRIORITY"] = 1] = "PRIORITY";
111
- })($a58372b18a18806e$export$161fe3707f756bf9 || ($a58372b18a18806e$export$161fe3707f756bf9 = {}));
112
- var $a58372b18a18806e$export$436a960acc41e848;
113
- (function(ClusterDistribution) {
114
- ClusterDistribution[ClusterDistribution["ALL"] = 0] = "ALL";
115
- })($a58372b18a18806e$export$436a960acc41e848 || ($a58372b18a18806e$export$436a960acc41e848 = {}));
116
- var $a58372b18a18806e$export$c66b56bc0ff967ca;
117
- (function(ClusterStatus) {
118
- ClusterStatus[ClusterStatus["DISABLED"] = 0] = "DISABLED";
119
- ClusterStatus[ClusterStatus["DEGRADED"] = 1] = "DEGRADED";
120
- ClusterStatus[ClusterStatus["READY"] = 2] = "READY";
121
- })($a58372b18a18806e$export$c66b56bc0ff967ca || ($a58372b18a18806e$export$c66b56bc0ff967ca = {}));
122
- var $a58372b18a18806e$export$c4f81c6d30ca200f;
123
- (function(ClientState) {
124
- ClientState[ClientState["UNAVAILABLE"] = 0] = "UNAVAILABLE";
125
- ClientState[ClientState["AVAILABLE"] = 1] = "AVAILABLE";
126
- })($a58372b18a18806e$export$c4f81c6d30ca200f || ($a58372b18a18806e$export$c4f81c6d30ca200f = {}));
127
- var $a58372b18a18806e$export$7516420eb880ab68;
128
- (function(ConnectionStatus) {
129
- ConnectionStatus[ConnectionStatus["DISCONNECTED"] = 0] = "DISCONNECTED";
130
- ConnectionStatus[ConnectionStatus["CONNECTED"] = 1] = "CONNECTED";
131
- ConnectionStatus[ConnectionStatus["DISCONNECTING"] = 2] = "DISCONNECTING";
132
- ConnectionStatus[ConnectionStatus["CONNECTING"] = 3] = "CONNECTING";
133
- ConnectionStatus[ConnectionStatus["RECONNECTING"] = 4] = "RECONNECTING";
134
- })($a58372b18a18806e$export$7516420eb880ab68 || ($a58372b18a18806e$export$7516420eb880ab68 = {}));
135
-
136
-
137
92
  const $5abc8fb342687c03$export$d048df559e6d3842 = {
138
93
  TCP: {
139
94
  Port: 50001,
@@ -164,12 +119,6 @@ const $5abc8fb342687c03$export$f019be48b3aacb1a = {
164
119
  // Time between ping messages, in milliseconds. Pinging keeps the connection alive.
165
120
  // The reason for pinging this frequently is to detect connection problems early.
166
121
  PING_INTERVAL: 1000,
167
- // How many servers are required before we trust information provided.
168
- CLUSTER_CONFIDENCE: 1,
169
- // How many servers we send requests to.
170
- CLUSTER_DISTRIBUTION: (0, $a58372b18a18806e$export$436a960acc41e848).ALL,
171
- // What order we select servers to send requests to.
172
- CLUSTER_ORDER: (0, $a58372b18a18806e$export$161fe3707f756bf9).RANDOM,
173
122
  // If we use BigInt for numbers in json when parsing and returning json response from the server.
174
123
  USE_BIG_INT: false
175
124
  };
@@ -482,6 +431,30 @@ class $ea64e414b68fe23b$export$25b4633f61498e1 extends (0, $4QiMX$EventEmitter)
482
431
  }
483
432
 
484
433
 
434
+ var $a58372b18a18806e$exports = {};
435
+
436
+ $parcel$export($a58372b18a18806e$exports, "ClientState", () => $a58372b18a18806e$export$c4f81c6d30ca200f);
437
+ $parcel$export($a58372b18a18806e$exports, "ConnectionStatus", () => $a58372b18a18806e$export$7516420eb880ab68);
438
+ // Disable indent rule for this file because it is broken (https://github.com/typescript-eslint/typescript-eslint/issues/1824)
439
+ /* eslint-disable @typescript-eslint/indent */ /**
440
+ * Enum that denotes the availability of an ElectrumClient.
441
+ * @enum {number}
442
+ * @property {0} UNAVAILABLE The client is currently not available.
443
+ * @property {1} AVAILABLE The client is available for use.
444
+ */ var $a58372b18a18806e$export$c4f81c6d30ca200f;
445
+ (function(ClientState) {
446
+ ClientState[ClientState["UNAVAILABLE"] = 0] = "UNAVAILABLE";
447
+ ClientState[ClientState["AVAILABLE"] = 1] = "AVAILABLE";
448
+ })($a58372b18a18806e$export$c4f81c6d30ca200f || ($a58372b18a18806e$export$c4f81c6d30ca200f = {}));
449
+ var $a58372b18a18806e$export$7516420eb880ab68;
450
+ (function(ConnectionStatus) {
451
+ ConnectionStatus[ConnectionStatus["DISCONNECTED"] = 0] = "DISCONNECTED";
452
+ ConnectionStatus[ConnectionStatus["CONNECTED"] = 1] = "CONNECTED";
453
+ ConnectionStatus[ConnectionStatus["DISCONNECTING"] = 2] = "DISCONNECTING";
454
+ ConnectionStatus[ConnectionStatus["CONNECTING"] = 3] = "CONNECTING";
455
+ ConnectionStatus[ConnectionStatus["RECONNECTING"] = 4] = "RECONNECTING";
456
+ })($a58372b18a18806e$export$7516420eb880ab68 || ($a58372b18a18806e$export$7516420eb880ab68 = {}));
457
+
485
458
 
486
459
 
487
460
  /**
@@ -1221,5 +1194,5 @@ $620a18299ef8d6fd$export$2e2bcd8739ae039 = $620a18299ef8d6fd$var$ElectrumClient;
1221
1194
 
1222
1195
 
1223
1196
 
1224
- export {$620a18299ef8d6fd$export$2e2bcd8739ae039 as ElectrumClient, $a192ea5a4eec42d4$export$e1f38ab2b4ebdde6 as isVersionRejected, $a192ea5a4eec42d4$export$9598f0c76aa41d73 as isVersionNegotiated, $5abc8fb342687c03$export$d048df559e6d3842 as ElectrumTransport, $5abc8fb342687c03$export$f019be48b3aacb1a as DefaultParameters, $a58372b18a18806e$export$161fe3707f756bf9 as ClusterOrder, $a58372b18a18806e$export$436a960acc41e848 as ClusterDistribution, $a58372b18a18806e$export$c66b56bc0ff967ca as ClusterStatus, $a58372b18a18806e$export$c4f81c6d30ca200f as ClientState, $a58372b18a18806e$export$7516420eb880ab68 as ConnectionStatus};
1197
+ export {$620a18299ef8d6fd$export$2e2bcd8739ae039 as ElectrumClient, $a192ea5a4eec42d4$export$e1f38ab2b4ebdde6 as isVersionRejected, $a192ea5a4eec42d4$export$9598f0c76aa41d73 as isVersionNegotiated, $5abc8fb342687c03$export$d048df559e6d3842 as ElectrumTransport, $5abc8fb342687c03$export$f019be48b3aacb1a as DefaultParameters, $a58372b18a18806e$export$c4f81c6d30ca200f as ClientState, $a58372b18a18806e$export$7516420eb880ab68 as ConnectionStatus};
1225
1198
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"mappings":"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","sources":["lib/index.ts","lib/electrum-client.ts","lib/util.ts","lib/electrum-connection.ts","lib/electrum-protocol.ts","lib/interfaces.ts","lib/constants.ts","lib/enums.ts","lib/electrum-socket.ts","lib/rpc-interfaces.ts"],"sourcesContent":["export { default as ElectrumClient } from './electrum-client';\n\nexport * from './interfaces';\nexport * from './constants';\nexport * from './enums';\n","import debug from './util';\nimport ElectrumConnection from './electrum-connection';\nimport ElectrumProtocol from './electrum-protocol';\nimport { DefaultParameters } from './constants';\nimport { EventEmitter } from 'events';\nimport { ConnectionStatus } from './enums';\nimport { RPCParameter, isRPCNotification, isRPCErrorResponse, RPCNotification, RPCResponse } from './rpc-interfaces';\nimport type { ResolveFunction, RequestResolver, RequestResponse, TransportScheme } from './interfaces';\nimport { Mutex } from 'async-mutex';\n\n/**\n * Triggers when the underlying connection is established.\n *\n * @event ElectrumClient#connected\n */\n\n/**\n * Triggers when the underlying connection is lost.\n *\n * @event ElectrumClient#disconnected\n */\n\n/**\n * Triggers when the remote server sends data that is not a request response.\n *\n * @event ElectrumClient#notification\n */\n\n/**\n * High-level Electrum client that lets applications send requests and subscribe to notification events from a server.\n */\nclass ElectrumClient extends EventEmitter\n{\n\t// Declare instance variables\n\tpublic connection: ElectrumConnection;\n\n\t// Initialize an empty list of subscription metadata.\n\tprivate subscriptionMethods: Record<string, Set<string>> = {};\n\n\t// Start counting the request IDs from 0\n\tprivate requestId = 0;\n\n\t// Initialize an empty dictionary for keeping track of request resolvers\n\tprivate requestResolvers: { [index: number]: RequestResolver } = {};\n\n\t// Mutex lock used to prevent simultaneous connect() and disconnect() calls.\n\tprivate connectionLock = new Mutex();\n\n\t/**\n\t * Initializes an Electrum client.\n\t *\n\t * @param {string} application your application name, used to identify to the electrum host.\n\t * @param {string} version protocol version to use with the host.\n\t * @param {string} host fully qualified domain name or IP number of the host.\n\t * @param {number} port the TCP network port of the host.\n\t * @param {TransportScheme} scheme the transport scheme to use for connection\n\t * @param {number} timeout how long network delays we will wait for before taking action, in milliseconds.\n\t * @param {number} pingInterval the time between sending pings to the electrum host, in milliseconds.\n\t * @param {number} reconnectInterval the time between reconnection attempts to the electrum host, in milliseconds.\n\t * @param {boolean} useBigInt\t\t\t whether to use bigint for numbers in json response.\n\t *\n\t * @throws {Error} if `version` is not a valid version string.\n\t */\n\tconstructor(\n\t\tpublic application: string,\n\t\tpublic version: string,\n\t\tpublic host: string,\n\t\tpublic port: number = DefaultParameters.PORT,\n\t\tpublic scheme: TransportScheme = DefaultParameters.TRANSPORT_SCHEME,\n\t\tpublic timeout: number = DefaultParameters.TIMEOUT,\n\t\tpublic pingInterval: number = DefaultParameters.PING_INTERVAL,\n\t\tpublic reconnectInterval: number = DefaultParameters.RECONNECT,\n\t\tpublic useBigInt: boolean = DefaultParameters.USE_BIG_INT,\n\t)\n\t{\n\t\t// Initialize the event emitter.\n\t\tsuper();\n\n\t\t// Set up a connection to an electrum server.\n\t\tthis.connection = new ElectrumConnection(application, version, host, port, scheme, timeout, pingInterval, reconnectInterval, useBigInt);\n\t}\n\n\t/**\n\t * Connects to the remote server.\n\t *\n\t * @throws {Error} if the socket connection fails.\n\t * @returns a promise resolving when the connection is established.\n\t */\n\tasync connect(): Promise<void>\n\t{\n\t\t// Create a lock so that multiple connects/disconnects cannot race each other.\n\t\tconst unlock = await this.connectionLock.acquire();\n\n\t\ttry\n\t\t{\n\t\t\t// If we are already connected, do not attempt to connect again.\n\t\t\tif(this.connection.status === ConnectionStatus.CONNECTED)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Listen for parsed statements.\n\t\t\tthis.connection.on('statement', this.response.bind(this));\n\n\t\t\t// Hook up resubscription on connection.\n\t\t\tthis.connection.on('connect', this.resubscribeOnConnect.bind(this));\n\n\t\t\t// Relay connect and disconnect events.\n\t\t\tthis.connection.on('connect', this.emit.bind(this, 'connected'));\n\t\t\tthis.connection.on('disconnect', this.onConnectionDisconnect.bind(this));\n\n\t\t\t// Relay error events.\n\t\t\tthis.connection.on('error', this.emit.bind(this, 'error'));\n\n\t\t\t// Connect with the server.\n\t\t\tawait this.connection.connect();\n\t\t}\n\t\t// Always release our lock so that we do not end up in a stuck-state.\n\t\tfinally\n\t\t{\n\t\t\tunlock();\n\t\t}\n\t}\n\n\t/**\n\t * Disconnects from the remote server and removes all event listeners/subscriptions and open requests.\n\t *\n\t * @param {boolean} force disconnect even if the connection has not been fully established yet.\n\t * @param {boolean} retainSubscriptions retain subscription data so they will be restored on reconnection.\n\t *\n\t * @returns true if successfully disconnected, or false if there was no connection.\n\t */\n\tasync disconnect(force: boolean = false, retainSubscriptions: boolean = false): Promise<boolean>\n\t{\n\t\t// Create a lock so that multiple connects/disconnects cannot race each other.\n\t\tconst unlock = await this.connectionLock.acquire();\n\n\t\ttry\n\t\t{\n\t\t\tif(!retainSubscriptions)\n\t\t\t{\n\t\t\t\t// Cancel all event listeners.\n\t\t\t\tthis.removeAllListeners();\n\n\t\t\t\t// Remove all subscription data\n\t\t\t\tthis.subscriptionMethods = {};\n\t\t\t}\n\n\t\t\t// For each pending request..\n\t\t\tfor(const index in this.requestResolvers)\n\t\t\t{\n\t\t\t\t// Reject the request.\n\t\t\t\tconst requestResolver = this.requestResolvers[index];\n\t\t\t\trequestResolver(new Error('Manual disconnection'));\n\n\t\t\t\t// Remove the request.\n\t\t\t\tdelete this.requestResolvers[index];\n\t\t\t}\n\n\t\t\t// Disconnect from the remove server.\n\t\t\treturn await this.connection.disconnect(force);\n\t\t}\n\t\t// Always release our lock so that we do not end up in a stuck-state.\n\t\tfinally\n\t\t{\n\t\t\tunlock();\n\t\t}\n\t}\n\n\t/**\n\t * Calls a method on the remote server with the supplied parameters.\n\t *\n\t * @param {string} method name of the method to call.\n\t * @param {...string} parameters one or more parameters for the method.\n\t *\n\t * @throws {Error} if the client is disconnected.\n\t * @returns a promise that resolves with the result of the method or an Error.\n\t */\n\tasync request(method: string, ...parameters: RPCParameter[]): Promise<Error | RequestResponse>\n\t{\n\t\t// If we are not connected to a server..\n\t\tif(this.connection.status !== ConnectionStatus.CONNECTED)\n\t\t{\n\t\t\t// Reject the request with a disconnected error message.\n\t\t\tthrow(new Error(`Unable to send request to a disconnected server '${this.connection.host}'.`));\n\t\t}\n\n\t\t// Increase the request ID by one.\n\t\tthis.requestId += 1;\n\n\t\t// Store a copy of the request id.\n\t\tconst id = this.requestId;\n\n\t\t// Format the arguments as an electrum request object.\n\t\tconst message = ElectrumProtocol.buildRequestObject(method, parameters, id);\n\n\t\t// Define a function to wrap the request in a promise.\n\t\tconst requestResolver = (resolve: ResolveFunction<Error | RequestResponse>): void =>\n\t\t{\n\t\t\t// Add a request resolver for this promise to the list of requests.\n\t\t\tthis.requestResolvers[id] = (error?: Error, data?: RequestResponse) =>\n\t\t\t{\n\t\t\t\t// If the resolution failed..\n\t\t\t\tif(error)\n\t\t\t\t{\n\t\t\t\t\t// Resolve the promise with the error for the application to handle.\n\t\t\t\t\tresolve(error);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Resolve the promise with the request results.\n\t\t\t\t\tresolve(data as RequestResponse);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// Send the request message to the remote server.\n\t\t\tthis.connection.send(message);\n\t\t};\n\n\t\t// Write a log message.\n\t\tdebug.network(`Sending request '${method}' to '${this.connection.host}'`);\n\n\t\t// return a promise to deliver results later.\n\t\treturn new Promise<Error | RequestResponse>(requestResolver);\n\t}\n\n\t/**\n\t * Subscribes to the method and payload at the server.\n\t *\n\t * @note the response for the subscription request is issued as a notification event.\n\t *\n\t * @param {string} method one of the subscribable methods the server supports.\n\t * @param {...string} parameters one or more parameters for the method.\n\t *\n\t * @throws {Error} if the client is disconnected.\n\t * @returns a promise resolving when the subscription is established.\n\t */\n\tasync subscribe(method: string, ...parameters: RPCParameter[]): Promise<void>\n\t{\n\t\t// Initialize an empty list of subscription payloads, if needed.\n\t\tif(!this.subscriptionMethods[method])\n\t\t{\n\t\t\tthis.subscriptionMethods[method] = new Set<string>();\n\t\t}\n\n\t\t// Store the subscription parameters to track what data we have subscribed to.\n\t\tthis.subscriptionMethods[method].add(JSON.stringify(parameters));\n\n\t\t// Send initial subscription request.\n\t\tconst requestData = await this.request(method, ...parameters);\n\n\t\t// Construct a notification structure to package the initial result as a notification.\n\t\tconst notification =\n\t\t{\n\t\t\tjsonrpc: '2.0',\n\t\t\tmethod: method,\n\t\t\tparams: [ ...parameters, requestData ],\n\t\t};\n\n\t\t// Manually emit an event for the initial response.\n\t\tthis.emit('notification', notification);\n\t}\n\n\t/**\n\t * Unsubscribes to the method at the server and removes any callback functions\n\t * when there are no more subscriptions for the method.\n\t *\n\t * @param {string} method a previously subscribed to method.\n\t * @param {...string} parameters one or more parameters for the method.\n\t *\n\t * @throws {Error} if no subscriptions exist for the combination of the provided `method` and `parameters.\n\t * @throws {Error} if the client is disconnected.\n\t * @returns a promise resolving when the subscription is removed.\n\t */\n\tasync unsubscribe(method: string, ...parameters: RPCParameter[]): Promise<void>\n\t{\n\t\t// Throw an error if the client is disconnected.\n\t\tif(this.connection.status !== ConnectionStatus.CONNECTED)\n\t\t{\n\t\t\tthrow(new Error(`Unable to send unsubscribe request to a disconnected server '${this.connection.host}'.`));\n\t\t}\n\n\t\t// If this method has no subscriptions..\n\t\tif(!this.subscriptionMethods[method])\n\t\t{\n\t\t\t// Reject this promise with an explanation.\n\t\t\tthrow(new Error(`Cannot unsubscribe from '${method}' since the method has no subscriptions.`));\n\t\t}\n\n\t\t// Pack up the parameters as a long string.\n\t\tconst subscriptionParameters = JSON.stringify(parameters);\n\n\t\t// If the method payload could not be located..\n\t\tif(!this.subscriptionMethods[method].has(subscriptionParameters))\n\t\t{\n\t\t\t// Reject this promise with an explanation.\n\t\t\tthrow(new Error(`Cannot unsubscribe from '${method}' since it has no subscription with the given parameters.`));\n\t\t}\n\n\t\t// Remove this specific subscription payload from internal tracking.\n\t\tthis.subscriptionMethods[method].delete(subscriptionParameters);\n\n\t\t// Send unsubscription request to the server\n\t\t// NOTE: As a convenience we allow users to define the method as the subscribe or unsubscribe version.\n\t\tawait this.request(method.replace('.subscribe', '.unsubscribe'), ...parameters);\n\n\t\t// Write a log message.\n\t\tdebug.client(`Unsubscribed from '${String(method)}' for the '${subscriptionParameters}' parameters.`);\n\t}\n\n\t/**\n\t * Restores existing subscriptions without updating status or triggering manual callbacks.\n\t *\n\t * @throws {Error} if subscription data cannot be found for all stored event names.\n\t * @throws {Error} if the client is disconnected.\n\t * @returns a promise resolving to true when the subscriptions are restored.\n\t *\n\t * @ignore\n\t */\n\tprivate async resubscribeOnConnect(): Promise<void>\n\t{\n\t\t// Write a log message.\n\t\tdebug.client(`Connected to '${this.connection.hostIdentifier}'.`);\n\n\t\t// Initialize an empty list of resubscription promises.\n\t\tconst resubscriptionPromises = [];\n\n\t\t// For each method we have a subscription for..\n\t\tfor(const method in this.subscriptionMethods)\n\t\t{\n\t\t\t// .. and for each parameter we have previously been subscribed to..\n\t\t\tfor(const parameterJSON of this.subscriptionMethods[method].values())\n\t\t\t{\n\t\t\t\t// restore the parameters from JSON.\n\t\t\t\tconst parameters = JSON.parse(parameterJSON);\n\n\t\t\t\t// Send a subscription request.\n\t\t\t\tresubscriptionPromises.push(this.subscribe(method, ...parameters));\n\t\t\t}\n\n\t\t\t// Wait for all re-subscriptions to complete.\n\t\t\tawait Promise.all(resubscriptionPromises);\n\t\t}\n\n\t\t// Write a log message if there was any subscriptions to restore.\n\t\tif(resubscriptionPromises.length > 0)\n\t\t{\n\t\t\tdebug.client(`Restored ${resubscriptionPromises.length} previous subscriptions for '${this.connection.hostIdentifier}'`);\n\t\t}\n\t}\n\n\t/**\n\t * Parser messages from the remote server to resolve request promises and emit subscription events.\n\t *\n\t * @param {RPCNotification | RPCResponse} message the response message\n\t *\n\t * @throws {Error} if the message ID does not match an existing request.\n\t * @ignore\n\t */\n\tresponse(message: RPCNotification | RPCResponse): void\n\t{\n\t\t// If the received message is a notification, we forward it to all event listeners\n\t\tif(isRPCNotification(message))\n\t\t{\n\t\t\t// Write a log message.\n\t\t\tdebug.client(`Received notification for '${message.method}' from '${this.connection.host}'`);\n\n\t\t\t// Forward the message content to all event listeners.\n\t\t\tthis.emit('notification', message);\n\n\t\t\t// Return since it does not have an associated request resolver\n\t\t\treturn;\n\t\t}\n\n\t\t// If the response ID is null we cannot use it to index our request resolvers\n\t\tif(message.id === null)\n\t\t{\n\t\t\t// Throw an internal error, this should not happen.\n\t\t\tthrow(new Error('Internal error: Received an RPC response with ID null.'));\n\t\t}\n\n\t\t// Look up which request promise we should resolve this.\n\t\tconst requestResolver = this.requestResolvers[message.id];\n\n\t\t// If we do not have a request resolver for this response message..\n\t\tif(!requestResolver)\n\t\t{\n\t\t\t// Throw an internal error, this should not happen.\n\t\t\tthrow(new Error('Internal error: Callback for response not available.'));\n\t\t}\n\n\t\t// Remove the promise from the request list.\n\t\tdelete this.requestResolvers[message.id];\n\n\t\t// If the message contains an error..\n\t\tif(isRPCErrorResponse(message))\n\t\t{\n\t\t\t// Forward the message error to the request resolver and omit the `result` parameter.\n\t\t\trequestResolver(new Error(message.error.message));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Forward the message content to the request resolver and omit the `error` parameter\n\t\t\t// (by setting it to undefined).\n\t\t\trequestResolver(undefined, message.result);\n\t\t}\n\t}\n\n\t/**\n\t * Callback function that is called when connection to the Electrum server is lost.\n\t * Aborts all active requests with an error message indicating that connection was lost.\n\t *\n\t * @ignore\n\t */\n\tonConnectionDisconnect(): void\n\t{\n\t\t// Emit a disconnection signal to any listeners.\n\t\tthis.emit('disconnected');\n\n\t\t// Loop over active requests\n\t\tfor(const resolverId in this.requestResolvers)\n\t\t{\n\t\t\t// Extract request resolver for readability\n\t\t\tconst requestResolver = this.requestResolvers[resolverId];\n\n\t\t\t// Resolve the active request with an error indicating that the connection was lost.\n\t\t\trequestResolver(new Error('Connection lost'));\n\n\t\t\t// Remove the promise from the request list.\n\t\t\tdelete this.requestResolvers[resolverId];\n\t\t}\n\t}\n}\n\n// Export the client.\nexport default ElectrumClient;\n","import debugLogger from 'debug';\n\n// Create the debug logs.\nconst debug =\n{\n\tclient: debugLogger('electrum-cash:client '),\n\tcluster: debugLogger('electrum-cash:cluster'),\n\terrors: debugLogger('electrum-cash:error '),\n\twarning: debugLogger('electrum-cash:warning'),\n\tnetwork: debugLogger('electrum-cash:network'),\n\tping: debugLogger('electrum-cash:pulses '),\n};\n\n// Set log colors.\ndebug.client.color = '2';\ndebug.cluster.color = '3';\ndebug.errors.color = '9';\ndebug.warning.color = '13';\ndebug.network.color = '4';\ndebug.ping.color = '8';\n\n// Export the logs.\nexport default debug;\n","import debug from './util';\nimport ElectrumProtocol from './electrum-protocol';\nimport { ResolveFunction, RejectFunction, VersionRejected, VersionNegotiated, isVersionRejected, TransportScheme } from './interfaces';\nimport { DefaultParameters, ElectrumTransport } from './constants';\nimport { EventEmitter } from 'events';\nimport { ElectrumTcpSocket, ElectrumWebSocket } from './electrum-socket';\nimport { ConnectionStatus } from './enums';\nimport { parse, parseNumberAndBigInt } from 'lossless-json';\n\n/**\n * Wrapper around TLS/WSS sockets that gracefully separates a network stream into Electrum protocol messages.\n *\n * @ignore\n */\nclass ElectrumConnection extends EventEmitter\n{\n\t// Initialize the connected flag to false to indicate that there is no connection\n\tpublic status: ConnectionStatus = ConnectionStatus.DISCONNECTED;\n\n\t// Declare empty timestamps\n\tpublic lastReceivedTimestamp: number;\n\n\t// Hold the reported software string returned on protocol version negotiation.\n\tpublic software: string;\n\n\t// Declare an empty socket.\n\tprivate socket: ElectrumTcpSocket | ElectrumWebSocket;\n\n\t// Declare timers for keep-alive pings and reconnection\n\tprivate timers: {\n\t\t// eslint-disable-next-line no-undef\n\t\tkeepAlive?: number;\n\t\t// eslint-disable-next-line no-undef\n\t\treconnect?: number;\n\t} = {};\n\n\t// Initialize an empty array of connection verification timers.\n\t// eslint-disable-next-line no-undef\n\tprivate verifications: Array<number> = [];\n\n\t// Initialize messageBuffer to an empty string\n\tprivate messageBuffer = '';\n\n\t/**\n\t * Sets up network configuration for an Electrum client connection.\n\t *\n\t * @param {string} application your application name, used to identify to the electrum host.\n\t * @param {string} version protocol version to use with the host.\n\t * @param {string} host fully qualified domain name or IP number of the host.\n\t * @param {number} port the network port of the host.\n\t * @param {TransportScheme} scheme the transport scheme to use for connection\n\t * @param {number} timeout how long network delays we will wait for before taking action, in milliseconds.\n\t * @param {number} pingInterval the time between sending pings to the electrum host, in milliseconds.\n\t * @param {number} reconnectInterval the time between reconnection attempts to the electrum host, in milliseconds.\n\t * @param {boolean} useBigInt\t \t\t whether to use bigint for numbers in json response.\n\t *\n\t * @throws {Error} if `version` is not a valid version string.\n\t */\n\tconstructor(\n\t\tpublic application: string,\n\t\tpublic version: string,\n\t\tpublic host: string,\n\t\tpublic port: number = DefaultParameters.PORT,\n\t\tpublic scheme: TransportScheme = DefaultParameters.TRANSPORT_SCHEME,\n\t\tpublic timeout: number = DefaultParameters.TIMEOUT,\n\t\tpublic pingInterval: number = DefaultParameters.PING_INTERVAL,\n\t\tpublic reconnectInterval: number = DefaultParameters.RECONNECT,\n\t\tpublic useBigInt: boolean = DefaultParameters.USE_BIG_INT,\n\t)\n\t{\n\t\t// Initialize the event emitter.\n\t\tsuper();\n\n\t\t// Check if the provided version is a valid version number.\n\t\tif(!ElectrumProtocol.versionRegexp.test(version))\n\t\t{\n\t\t\t// Throw an error since the version number was not valid.\n\t\t\tthrow(new Error(`Provided version string (${version}) is not a valid protocol version number.`));\n\t\t}\n\n\t\t// Create an initial network socket.\n\t\tthis.createSocket();\n\n\t\t// Handle visibility changes when run in a browser environment.\n\t\tif(typeof document !== 'undefined')\n\t\t{\n\t\t\tdocument.addEventListener('visibilitychange', this.handleVisibilityChange.bind(this));\n\t\t}\n\t}\n\n\t/**\n\t * Returns a string for the host identifier for usage in debug messages.\n\t */\n\tget hostIdentifier(): string\n\t{\n\t\treturn `${this.host}:${this.port}`;\n\t}\n\n\t/**\n\t * Create and configures a fresh socket and attaches all relevant listeners.\n\t */\n\tcreateSocket(): void\n\t{\n\t\tif(this.scheme === ElectrumTransport.TCP.Scheme || this.scheme === ElectrumTransport.TCP_TLS.Scheme)\n\t\t{\n\t\t\t// Initialize a new ElectrumTcpSocket\n\t\t\tthis.socket = new ElectrumTcpSocket();\n\t\t}\n\t\telse if(this.scheme === ElectrumTransport.WS.Scheme || this.scheme === ElectrumTransport.WSS.Scheme)\n\t\t{\n\t\t\t// Initialize a new ElectrumWebSocket\n\t\t\tthis.socket = new ElectrumWebSocket();\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Throw an error if an incorrect transport is specified\n\t\t\tthrow(new Error(`Provided transport (${this.scheme}) is not a valid ElectrumTransport`));\n\t\t}\n\n\t\t// Set up handlers for connection and disconnection.\n\t\tthis.socket.on('connect', this.onSocketConnect.bind(this));\n\t\tthis.socket.on('disconnect', this.onSocketDisconnect.bind(this));\n\n\t\t// Set up handler for incoming data.\n\t\tthis.socket.on('data', this.parseMessageChunk.bind(this));\n\t}\n\n\t/**\n\t * Shuts down and destroys the current socket.\n\t */\n\tdestroySocket(): void\n\t{\n\t\t// Close the socket connection and destroy the socket.\n\t\tthis.socket.disconnect();\n\t}\n\n\t/**\n\t * Assembles incoming data into statements and hands them off to the message parser.\n\t *\n\t * @param {string} data data to append to the current message buffer, as a string.\n\t *\n\t * @throws {SyntaxError} if the passed statement parts are not valid JSON.\n\t */\n\tparseMessageChunk(data: string): void\n\t{\n\t\t// Update the timestamp for when we last received data.\n\t\tthis.lastReceivedTimestamp = Date.now();\n\n\t\t// Clear and remove all verification timers.\n\t\tthis.verifications.forEach((timer) => clearTimeout(timer));\n\t\tthis.verifications.length = 0;\n\n\t\t// Add the message to the current message buffer.\n\t\tthis.messageBuffer += data;\n\n\t\t// Check if the new message buffer contains the statement delimiter.\n\t\twhile(this.messageBuffer.includes(ElectrumProtocol.statementDelimiter))\n\t\t{\n\t\t\t// Split message buffer into statements.\n\t\t\tconst statementParts = this.messageBuffer.split(ElectrumProtocol.statementDelimiter);\n\n\t\t\t// For as long as we still have statements to parse..\n\t\t\twhile(statementParts.length > 1)\n\t\t\t{\n\t\t\t\t// Move the first statement to its own variable.\n\t\t\t\tconst currentStatementList = String(statementParts.shift());\n\n\t\t\t\t// Parse the statement into an object or list of objects.\n\t\t\t\tlet statementList: any = parse(currentStatementList, null, this.useBigInt ? parseNumberAndBigInt : parseFloat);\n\n\t\t\t\t// Wrap the statement in an array if it is not already a batched statement list.\n\t\t\t\tif(!Array.isArray(statementList))\n\t\t\t\t{\n\t\t\t\t\tstatementList = [ statementList ];\n\t\t\t\t}\n\n\t\t\t\t// For as long as there is statements in the result set..\n\t\t\t\twhile(statementList.length > 0)\n\t\t\t\t{\n\t\t\t\t\t// Move the first statement from the batch to its own variable.\n\t\t\t\t\tconst currentStatement = statementList.shift();\n\n\t\t\t\t\t// If the current statement is a version negotiation response..\n\t\t\t\t\tif(currentStatement.id === 'versionNegotiation')\n\t\t\t\t\t{\n\t\t\t\t\t\tif(currentStatement.error)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Then emit a failed version negotiation response signal.\n\t\t\t\t\t\t\tthis.emit('version', { error: currentStatement.error });\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Extract the software and protocol version reported.\n\t\t\t\t\t\t\tconst [ software, protocol ] = currentStatement.result;\n\n\t\t\t\t\t\t\t// Store the reported software description.\n\t\t\t\t\t\t\tthis.software = software;\n\n\t\t\t\t\t\t\t// Emit a successful version negotiation response signal.\n\t\t\t\t\t\t\tthis.emit('version', { software, protocol });\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Consider this statement handled.\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// If the current statement is a keep-alive response..\n\t\t\t\t\tif(currentStatement.id === 'keepAlive')\n\t\t\t\t\t{\n\t\t\t\t\t\t// Do nothing and consider this statement handled.\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Emit the statements for handling higher up in the stack.\n\t\t\t\t\tthis.emit('statement', currentStatement);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Store the remaining statement as the current message buffer.\n\t\t\tthis.messageBuffer = statementParts.shift() || '';\n\t\t}\n\t}\n\n\t/**\n\t * Sends a keep-alive message to the host.\n\t *\n\t * @returns true if the ping message was fully flushed to the socket, false if\n\t * part of the message is queued in the user memory\n\t */\n\tping(): boolean\n\t{\n\t\t// Write a log message.\n\t\tdebug.ping(`Sending keep-alive ping to '${this.hostIdentifier}'`);\n\n\t\t// Craft a keep-alive message.\n\t\tconst message = ElectrumProtocol.buildRequestObject('server.ping', [], 'keepAlive');\n\n\t\t// Send the keep-alive message.\n\t\tconst status = this.send(message);\n\n\t\t// Return the ping status.\n\t\treturn status;\n\t}\n\n\t/**\n\t * Initiates the network connection negotiates a protocol version. Also emits the 'connect' signal if successful.\n\t *\n\t * @throws {Error} if the socket connection fails.\n\t * @returns a promise resolving when the connection is established\n\t */\n\tasync connect(): Promise<void>\n\t{\n\t\t// If we are already connected return true.\n\t\tif(this.status === ConnectionStatus.CONNECTED)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Indicate that the connection is connecting\n\t\tthis.status = ConnectionStatus.CONNECTING;\n\n\t\t// Define a function to wrap connection as a promise.\n\t\tconst connectionResolver = (resolve: ResolveFunction<void>, reject: RejectFunction): void =>\n\t\t{\n\t\t\tconst rejector = (error: Error): void =>\n\t\t\t{\n\t\t\t\t// Set the status back to disconnected\n\t\t\t\tthis.status = ConnectionStatus.DISCONNECTED;\n\n\t\t\t\t// Reject with the error as reason\n\t\t\t\treject(error);\n\t\t\t};\n\n\t\t\t// Replace previous error handlers to reject the promise on failure.\n\t\t\tthis.socket.removeAllListeners('error');\n\t\t\tthis.socket.once('error', rejector);\n\n\t\t\t// Define a function to wrap version negotiation as a callback.\n\t\t\tconst versionNegotiator = (): void =>\n\t\t\t{\n\t\t\t\t// Write a log message to show that we have started version negotiation.\n\t\t\t\tdebug.network(`Requesting protocol version ${this.version} with '${this.hostIdentifier}'.`);\n\n\t\t\t\t// remove the one-time error handler since no error was detected.\n\t\t\t\tthis.socket.removeListener('error', rejector);\n\n\t\t\t\t// Build a version negotiation message.\n\t\t\t\tconst versionMessage = ElectrumProtocol.buildRequestObject('server.version', [ this.application, this.version ], 'versionNegotiation');\n\n\t\t\t\t// Define a function to wrap version validation as a function.\n\t\t\t\tconst versionValidator = (version: VersionRejected | VersionNegotiated): void =>\n\t\t\t\t{\n\t\t\t\t\t// Check if version negotiation failed.\n\t\t\t\t\tif(isVersionRejected(version))\n\t\t\t\t\t{\n\t\t\t\t\t\t// Disconnect from the host.\n\t\t\t\t\t\tthis.disconnect(true);\n\n\t\t\t\t\t\t// Declare an error message.\n\t\t\t\t\t\tconst errorMessage = 'unsupported protocol version.';\n\n\t\t\t\t\t\t// Log the error.\n\t\t\t\t\t\tdebug.errors(`Failed to connect with ${this.hostIdentifier} due to ${errorMessage}`);\n\n\t\t\t\t\t\t// Reject the connection with false since version negotiation failed.\n\t\t\t\t\t\treject(errorMessage);\n\t\t\t\t\t}\n\t\t\t\t\t// Check if the host supports our requested protocol version.\n\t\t\t\t\t// NOTE: the server responds with version numbers that truncate 0's, so 1.5.0 turns into 1.5.\n\t\t\t\t\telse if((version.protocol !== this.version) && (`${version.protocol}.0` !== this.version) && (`${version.protocol}.0.0` !== this.version))\n\t\t\t\t\t{\n\t\t\t\t\t\t// Disconnect from the host.\n\t\t\t\t\t\tthis.disconnect(true);\n\n\t\t\t\t\t\t// Declare an error message.\n\t\t\t\t\t\tconst errorMessage = `incompatible protocol version negotiated (${version.protocol} !== ${this.version}).`;\n\n\t\t\t\t\t\t// Log the error.\n\t\t\t\t\t\tdebug.errors(`Failed to connect with ${this.hostIdentifier} due to ${errorMessage}`);\n\n\t\t\t\t\t\t// Reject the connection with false since version negotiation failed.\n\t\t\t\t\t\treject(errorMessage);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// Write a log message.\n\t\t\t\t\t\tdebug.network(`Negotiated protocol version ${version.protocol} with '${this.hostIdentifier}', powered by ${version.software}.`);\n\n\t\t\t\t\t\t// Set connection status to connected\n\t\t\t\t\t\tthis.status = ConnectionStatus.CONNECTED;\n\n\t\t\t\t\t\t// Emit a connect event now that the connection is usable.\n\t\t\t\t\t\tthis.emit('connect');\n\n\t\t\t\t\t\t// Resolve the connection promise since we successfully connected and negotiated protocol version.\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Listen for version negotiation once.\n\t\t\t\tthis.once('version', versionValidator);\n\n\t\t\t\t// Send the version negotiation message.\n\t\t\t\tthis.send(versionMessage);\n\t\t\t};\n\n\t\t\t// Prepare the version negotiation.\n\t\t\tthis.socket.once('connect', versionNegotiator);\n\n\t\t\t// Set up handler for network errors.\n\t\t\tthis.socket.on('error', this.onSocketError.bind(this));\n\n\t\t\t// Connect to the server.\n\t\t\tthis.socket.connect(this.host, this.port, this.scheme, this.timeout);\n\t\t};\n\n\t\t// Wait until connection is established and version negotiation succeeds.\n\t\tawait new Promise<void>(connectionResolver);\n\t}\n\n\t/**\n\t * Restores the network connection.\n\t */\n\tasync reconnect(): Promise<void>\n\t{\n\t\t// If a reconnect timer is set, remove it\n\t\tawait this.clearReconnectTimer();\n\n\t\t// Write a log message.\n\t\tdebug.network(`Trying to reconnect to '${this.hostIdentifier}'..`);\n\n\t\t// Set the status to reconnecting for more accurate log messages.\n\t\tthis.status = ConnectionStatus.RECONNECTING;\n\n\t\t// Destroy and recreate the socket to get a clean slate.\n\t\tthis.destroySocket();\n\t\tthis.createSocket();\n\n\t\ttry\n\t\t{\n\t\t\t// Try to connect again.\n\t\t\tawait this.connect();\n\t\t}\n\t\tcatch(error)\n\t\t{\n\t\t\t// Do nothing as the error should be handled via the disconnect and error signals.\n\t\t}\n\t}\n\n\t/**\n\t * Removes the current reconnect timer.\n\t */\n\tclearReconnectTimer(): void\n\t{\n\t\t// If a reconnect timer is set, remove it\n\t\tif(this.timers.reconnect)\n\t\t{\n\t\t\tclearTimeout(this.timers.reconnect);\n\t\t}\n\n\t\t// Reset the timer reference.\n\t\tthis.timers.reconnect = undefined;\n\t}\n\n\t/**\n\t * Removes the current keep-alive timer.\n\t */\n\tclearKeepAliveTimer(): void\n\t{\n\t\t// If a keep-alive timer is set, remove it\n\t\tif(this.timers.keepAlive)\n\t\t{\n\t\t\tclearTimeout(this.timers.keepAlive);\n\t\t}\n\n\t\t// Reset the timer reference.\n\t\tthis.timers.keepAlive = undefined;\n\t}\n\n\t/**\n\t * Initializes the keep alive timer loop.\n\t */\n\tsetupKeepAliveTimer(): void\n\t{\n\t\t// If the keep-alive timer loop is not currently set up..\n\t\tif(!this.timers.keepAlive)\n\t\t{\n\t\t\t// Set a new keep-alive timer.\n\t\t\tthis.timers.keepAlive = setTimeout(this.ping.bind(this), this.pingInterval) as unknown as number;\n\t\t}\n\t}\n\n\t/**\n\t * Tears down the current connection and removes all event listeners on disconnect.\n\t *\n\t * @param {boolean} force disconnect even if the connection has not been fully established yet.\n\t * @param {boolean} intentional update connection state if disconnect is intentional.\n\t *\n\t * @returns true if successfully disconnected, or false if there was no connection.\n\t */\n\tasync disconnect(force: boolean = false, intentional: boolean = true): Promise<boolean>\n\t{\n\t\t// Return early when there is nothing to disconnect from\n\t\tif(this.status === ConnectionStatus.DISCONNECTED && !force)\n\t\t{\n\t\t\t// Return false to indicate that there was nothing to disconnect from.\n\t\t\treturn false;\n\t\t}\n\n\t\t// Update connection state if the disconnection is intentional.\n\t\t// NOTE: The state is meant to represent what the client is requesting, but\n\t\t// is used internally to handle visibility changes in browsers to ensure functional reconnection.\n\t\tif(intentional)\n\t\t{\n\t\t\t// Set connection status to null to indicate tear-down is currently happening.\n\t\t\tthis.status = ConnectionStatus.DISCONNECTING;\n\t\t}\n\n\t\t// If a keep-alive timer is set, remove it.\n\t\tawait this.clearKeepAliveTimer();\n\n\t\t// If a reconnect timer is set, remove it\n\t\tawait this.clearReconnectTimer();\n\n\t\tconst disconnectResolver = (resolve: ResolveFunction<boolean>): void =>\n\t\t{\n\t\t\t// Resolve to true after the connection emits a disconnect\n\t\t\tthis.once('disconnect', () => resolve(true));\n\n\t\t\t// Close the connection and destroy the socket.\n\t\t\tthis.destroySocket();\n\t\t};\n\n\t\t// Return true to indicate that we disconnected.\n\t\treturn new Promise<boolean>(disconnectResolver);\n\t}\n\n\t/**\n\t * Updates connection state based on application visibility.\n\t *\n\t * Some browsers will disconnect network connections when the browser is out of focus,\n\t * which would normally cause our reconnect-on-timeout routines to trigger, but that\n\t * results in a poor user experience since the events are not handled consistently\n\t * and sometimes it can take some time after restoring focus to the browser.\n\t *\n\t * By manually disconnecting when this happens we prevent the default reconnection routines\n\t * and make the behavior consistent across browsers.\n\t */\n\tasync handleVisibilityChange(): Promise<void>\n\t{\n\t\t// Disconnect when application is removed from focus.\n\t\tif(document.visibilityState === 'hidden')\n\t\t{\n\t\t\tconst forceDisconnect = true;\n\t\t\tconst isIntended = false;\n\n\t\t\tthis.disconnect(forceDisconnect, isIntended);\n\t\t}\n\n\t\t// Reconnect when application is returned to focus.\n\t\tif(document.visibilityState === 'visible')\n\t\t{\n\t\t\tthis.reconnect();\n\t\t}\n\t}\n\n\t/**\n\t * Sends an arbitrary message to the server.\n\t *\n\t * @param {string} message json encoded request object to send to the server, as a string.\n\t *\n\t * @returns true if the message was fully flushed to the socket, false if part of the message\n\t * is queued in the user memory\n\t */\n\tsend(message: string): boolean\n\t{\n\t\t// Remove the current keep-alive timer if it exists.\n\t\tthis.clearKeepAliveTimer();\n\n\t\t// Get the current timestamp in milliseconds.\n\t\tconst currentTime = Date.now();\n\n\t\t// Follow up and verify that the message got sent..\n\t\tconst verificationTimer = setTimeout(this.verifySend.bind(this, currentTime), this.timeout) as unknown as number;\n\n\t\t// Store the verification timer locally so that it can be cleared when data has been received.\n\t\tthis.verifications.push(verificationTimer);\n\n\t\t// Set a new keep-alive timer.\n\t\tthis.setupKeepAliveTimer();\n\n\t\t// Write the message to the network socket.\n\t\treturn this.socket.write(message + ElectrumProtocol.statementDelimiter);\n\t}\n\n\t// --- Event managers. --- //\n\n\t/**\n\t * Marks the connection as timed out and schedules reconnection if we have not\n\t * received data within the expected time frame.\n\t */\n\tverifySend(sentTimestamp: number): void\n\t{\n\t\t// If we haven't received any data since we last sent data out..\n\t\tif(Number(this.lastReceivedTimestamp) < sentTimestamp)\n\t\t{\n\t\t\t// If this connection is already disconnected, we do not change anything\n\t\t\tif((this.status === ConnectionStatus.DISCONNECTED) || (this.status === ConnectionStatus.DISCONNECTING))\n\t\t\t{\n\t\t\t\tdebug.errors(`Tried to verify already disconnected connection to '${this.hostIdentifier}'`);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Remove the current keep-alive timer if it exists.\n\t\t\tthis.clearKeepAliveTimer();\n\n\t\t\t// Write a notification to the logs.\n\t\t\tdebug.network(`Connection to '${this.hostIdentifier}' timed out.`);\n\n\t\t\t// Close the connection to avoid re-use.\n\t\t\t// NOTE: This initiates reconnection routines if the connection has not\n\t\t\t// been marked as intentionally disconnected.\n\t\t\tthis.socket.disconnect();\n\t\t}\n\t}\n\n\t/**\n\t * Updates the connection status when a connection is confirmed.\n\t */\n\tonSocketConnect(): void\n\t{\n\t\t// If a reconnect timer is set, remove it.\n\t\tthis.clearReconnectTimer();\n\n\t\t// Set up the initial timestamp for when we last received data from the server.\n\t\tthis.lastReceivedTimestamp = Date.now();\n\n\t\t// Set up the initial keep-alive timer.\n\t\tthis.setupKeepAliveTimer();\n\n\t\t// Clear all temporary error listeners.\n\t\tthis.socket.removeAllListeners('error');\n\n\t\t// Set up handler for network errors.\n\t\tthis.socket.on('error', this.onSocketError.bind(this));\n\t}\n\n\t/**\n\t * Updates the connection status when a connection is ended.\n\t */\n\tonSocketDisconnect(): void\n\t{\n\t\t// Send a disconnect signal higher up the stack.\n\t\tthis.emit('disconnect');\n\n\t\t// Remove the current keep-alive timer if it exists.\n\t\tthis.clearKeepAliveTimer();\n\n\t\t// If this is a connection we're trying to tear down..\n\t\tif(this.status === ConnectionStatus.DISCONNECTING)\n\t\t{\n\t\t\t// If a reconnect timer is set, remove it.\n\t\t\tthis.clearReconnectTimer();\n\n\t\t\t// Remove all event listeners\n\t\t\tthis.removeAllListeners();\n\n\t\t\t// Mark the connection as disconnected.\n\t\t\tthis.status = ConnectionStatus.DISCONNECTED;\n\n\t\t\t// Write a log message.\n\t\t\tdebug.network(`Disconnected from '${this.hostIdentifier}'.`);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// If this is for an established connection..\n\t\t\tif(this.status === ConnectionStatus.CONNECTED)\n\t\t\t{\n\t\t\t\t// Write a notification to the logs.\n\t\t\t\tdebug.errors(`Connection with '${this.hostIdentifier}' was closed, trying to reconnect in ${this.reconnectInterval / 1000} seconds.`);\n\t\t\t}\n\t\t\t// If this is a connection that is currently connecting, reconnecting or already disconnected..\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Do nothing\n\n\t\t\t\t// NOTE: This error message is useful during manual debugging of reconnections.\n\t\t\t\t// debug.errors(`Lost connection with reconnecting or already disconnected server '${this.hostIdentifier}'.`);\n\t\t\t}\n\n\t\t\t// Mark the connection as disconnected for now..\n\t\t\tthis.status = ConnectionStatus.DISCONNECTED;\n\n\t\t\t// If we don't have a pending reconnection timer..\n\t\t\tif(!this.timers.reconnect)\n\t\t\t{\n\t\t\t\t// Attempt to reconnect after one keep-alive duration.\n\t\t\t\tthis.timers.reconnect = setTimeout(this.reconnect.bind(this), this.reconnectInterval) as unknown as number;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Notify administrator of any unexpected errors.\n\t */\n\tonSocketError(error: any | undefined): void\n\t{\n\t\t// Report a generic error if no error information is present.\n\t\t// NOTE: When using WSS, the error event explicitly\n\t\t// only allows to send a \"simple\" event without data.\n\t\t// https://stackoverflow.com/a/18804298\n\t\tif(typeof error === 'undefined')\n\t\t{\n\t\t\t// Do nothing, and instead rely on the socket disconnect event for further information.\n\t\t\treturn;\n\t\t}\n\n\t\t// If the DNS lookup failed.\n\t\tif(error.code === 'EAI_AGAIN')\n\t\t{\n\t\t\tdebug.errors(`Failed to look up DNS records for '${this.host}'.`);\n\n\t\t\treturn;\n\t\t}\n\n\t\t// If the connection timed out..\n\t\tif(error.code === 'ETIMEDOUT')\n\t\t{\n\t\t\t// Log the provided timeout message.\n\t\t\tdebug.errors(error.message);\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Log unknown error\n\t\tdebug.errors(`Unknown network error ('${this.hostIdentifier}'): `, error);\n\t}\n}\n\n// Export the connection.\nexport default ElectrumConnection;\n","import { RPCParameter } from './rpc-interfaces';\n\n/**\n * Grouping of utilities that simplifies implementation of the Electrum protocol.\n *\n * @ignore\n */\nclass ElectrumProtocol\n{\n\t/**\n\t * Helper function that builds an Electrum request object.\n\t *\n\t * @param {string} method method to call.\n\t * @param {array} parameters method parameters for the call.\n\t * @param {string} requestId unique string or number referencing this request.\n\t *\n\t * @returns a properly formatted Electrum request string.\n\t */\n\tstatic buildRequestObject(method: string, parameters: RPCParameter[], requestId: string | number): string\n\t{\n\t\t// Return the formatted request object.\n\t\t// NOTE: Electrum either uses JsonRPC strictly or loosely.\n\t\t// If we specify protocol identifier without being 100% compliant, we risk being disconnected/blacklisted.\n\t\t// For this reason, we omit the protocol identifier to avoid issues.\n\t\treturn JSON.stringify({ method: method, params: parameters, id: requestId });\n\t}\n\n\t/**\n\t * Constant used to verify if a provided string is a valid version number.\n\t *\n\t * @returns a regular expression that matches valid version numbers.\n\t */\n\tstatic get versionRegexp(): RegExp\n\t{\n\t\treturn /^\\d+(\\.\\d+)+$/;\n\t}\n\n\t/**\n\t * Constant used to separate statements/messages in a stream of data.\n\t *\n\t * @returns the delimiter used by Electrum to separate statements.\n\t */\n\tstatic get statementDelimiter(): string\n\t{\n\t\treturn '\\n';\n\t}\n}\n\n// export the protocol.\nexport default ElectrumProtocol;\n","import type { ClientState } from './enums';\nimport type ElectrumClient from './electrum-client';\nimport type { RPCError } from './rpc-interfaces';\n\nexport interface ClientConfig\n{\n\t// Availability of the client's connection\n\tstate: ClientState;\n\n\t// The client's connection\n\tconnection: ElectrumClient;\n}\n\n/**\n * A list of possible responses to requests.\n */\nexport type RequestResponse = object | string | number | boolean | null | RequestResponse[];\n\n// Request resolvers are used to process the response of a request. This takes either\n// an error object or any stringified data, while the other parameter is omitted.\nexport type RequestResolver = (error?: Error, data?: string) => void;\n\n// Promise types\nexport type ResolveFunction<T> = (value: T | PromiseLike<T>) => void;\nexport type RejectFunction = (reason?: any) => void;\n\nexport interface VersionRejected\n{\n\terror: RPCError;\n}\n\nexport interface VersionNegotiated\n{\n\tsoftware: string;\n\tprotocol: string;\n}\n\nexport const isVersionRejected = function(object: any): object is VersionRejected\n{\n\treturn 'error' in object;\n};\n\nexport const isVersionNegotiated = function(object: any): object is VersionNegotiated\n{\n\treturn 'software' in object && 'protocol' in object;\n};\n\n/**\n * Possible Transport Schemes for communication with the Electrum server\n */\nexport type TransportScheme = 'tcp' | 'tcp_tls' | 'ws' | 'wss';\n\n// Connection options used with TLS connections.\nexport interface ConnectionOptions\n{\n\trejectUnauthorized?: boolean;\n\tserverName?: string;\n}\n","import { ClusterDistribution, ClusterOrder } from './enums';\nimport { TransportScheme } from './interfaces';\n\n/**\n * Object containing the commonly used ports and schemes for specific Transports.\n * @example const electrum = new ElectrumClient('Electrum client example', '1.4.1', 'bch.imaginary.cash', Transport.WSS.Port, Transport.WSS.Scheme);\n *\n * @property {object} TCP Port and Scheme to use unencrypted TCP sockets.\n * @property {object} TCP_TLS Port and Scheme to use TLS-encrypted TCP sockets.\n * @property {object} WS Port and Scheme to use unencrypted WebSockets.\n * @property {object} WSS Port and Scheme to use TLS-encrypted WebSockets.\n */\nexport const ElectrumTransport =\n{\n\tTCP: { Port: 50001, Scheme: 'tcp' as TransportScheme },\n\tTCP_TLS: { Port: 50002, Scheme: 'tcp_tls' as TransportScheme },\n\tWS: { Port: 50003, Scheme: 'ws' as TransportScheme },\n\tWSS: { Port: 50004, Scheme: 'wss' as TransportScheme },\n};\n\nexport const DefaultParameters =\n{\n\t// Port number for TCP TLS connections\n\tPORT: ElectrumTransport.TCP_TLS.Port,\n\n\t// Transport to connect to the Electrum server\n\tTRANSPORT_SCHEME: ElectrumTransport.TCP_TLS.Scheme,\n\n\t// How long to wait before attempting to reconnect, in milliseconds.\n\tRECONNECT: 5 * 1000,\n\n\t// How long to wait for network operations before following up, in milliseconds.\n\tTIMEOUT: 30 * 1000,\n\n\t// Time between ping messages, in milliseconds. Pinging keeps the connection alive.\n\t// The reason for pinging this frequently is to detect connection problems early.\n\tPING_INTERVAL: 1 * 1000,\n\n\t// How many servers are required before we trust information provided.\n\tCLUSTER_CONFIDENCE: 1,\n\n\t// How many servers we send requests to.\n\tCLUSTER_DISTRIBUTION: ClusterDistribution.ALL,\n\n\t// What order we select servers to send requests to.\n\tCLUSTER_ORDER: ClusterOrder.RANDOM,\n\n\t// If we use BigInt for numbers in json when parsing and returning json response from the server.\n\tUSE_BIG_INT: false,\n};\n","// Disable indent rule for this file because it is broken (https://github.com/typescript-eslint/typescript-eslint/issues/1824)\n/* eslint-disable @typescript-eslint/indent */\n\n/**\n * Enum that denotes the ordering to use in an ElectrumCluster.\n * @enum {number}\n * @property {0} RANDOM Send requests to randomly selected servers in the cluster.\n * @property {1} PRIORITY Send requests to servers in the cluster in the order they were added.\n */\nexport enum ClusterOrder\n{\n\tRANDOM = 0,\n\tPRIORITY = 1,\n}\n\n/**\n * Enum that denotes the distribution setting to use in an ElectrumCluster.\n * @enum {number}\n * @property {0} ALL Send requests to all servers in the cluster.\n */\nexport enum ClusterDistribution\n{\n\tALL = 0,\n}\n\n/**\n * Enum that denotes the ready status of an ElectrumCluster.\n * @enum {number}\n * @property {0} DISABLED The cluster is disabled and unusable.\n * @property {1} DEGRADED The cluster is degraded but still usable.\n * @property {2} READY The cluster is healthy and ready for use.\n */\nexport enum ClusterStatus\n{\n\tDISABLED = 0,\n\tDEGRADED = 1,\n\tREADY = 2,\n}\n\n/**\n * Enum that denotes the availability of an ElectrumClient.\n * @enum {number}\n * @property {0} UNAVAILABLE The client is currently not available.\n * @property {1} AVAILABLE The client is available for use.\n */\nexport enum ClientState\n{\n\tUNAVAILABLE = 0,\n\tAVAILABLE = 1,\n}\n\n/**\n * Enum that denotes the connection status of an ElectrumConnection.\n * @enum {number}\n * @property {0} DISCONNECTED The connection is disconnected.\n * @property {1} AVAILABLE The connection is connected.\n * @property {2} DISCONNECTING The connection is disconnecting.\n * @property {3} CONNECTING The connection is connecting.\n * @property {4} RECONNECTING The connection is restarting.\n */\nexport enum ConnectionStatus\n{\n\tDISCONNECTED = 0,\n\tCONNECTED = 1,\n\tDISCONNECTING = 2,\n\tCONNECTING = 3,\n\tRECONNECTING = 4,\n}\n","import * as tls from 'tls';\nimport * as net from 'net';\nimport { WebSocket } from '@monsterbitar/isomorphic-ws';\nimport type { MessageEvent, ErrorEvent } from '@monsterbitar/isomorphic-ws';\nimport { EventEmitter } from 'events';\nimport debug from './util';\nimport { ElectrumTransport } from './constants';\nimport { TransportScheme, ConnectionOptions } from './interfaces';\n\nexport class ElectrumTcpSocket extends EventEmitter\n{\n\t// Declare an empty TCP socket.\n\tprivate tcpSocket: net.Socket;\n\n\t// Declare timers for keep-alive pings and reconnection\n\tprivate timers: {\n\t\t// eslint-disable-next-line no-undef\n\t\tretryConnection?: number;\n\t\t// eslint-disable-next-line no-undef\n\t\tdisconnect?: number;\n\t} = {};\n\n\t// Initialize boolean that indicates whether the onConnect function has run (initialize to false).\n\tprivate onConnectHasRun = false;\n\n\t// Initialize event forwarding functions.\n\tprivate eventForwarders =\n\t{\n\t\tdisconnect: () => this.emit('disconnect'),\n\t\ttcpData: (data: string) => this.emit('data', data),\n\t\ttcpError: (err: Error) => this.emit('error', err),\n\t};\n\n\t/**\n\t * Connect to host:port using the specified transport\n\t *\n\t * @param {string} host Fully qualified domain name or IP address of the host\n\t * @param {number} port Network port for the host to connect to\n\t * @param {TransportScheme} scheme Transport scheme to use\n\t * @param {number} timeout If no connection is established after `timeout` ms, the connection is terminated\n\t *\n\t * @throws {Error} if an incorrect transport scheme is specified\n\t */\n\tconnect(host: string, port: number, scheme: TransportScheme, timeout: number): void\n\t{\n\t\t// Check that no existing socket exists before initiating a new connection.\n\t\tif(this.tcpSocket)\n\t\t{\n\t\t\tthrow(new Error('Cannot initiate a new socket connection when an existing connection exists'));\n\t\t}\n\n\t\t// Set a timer to force disconnect after `timeout` seconds\n\t\tthis.timers.disconnect = setTimeout(() => this.disconnectOnTimeout(host, port, timeout), timeout) as unknown as number;\n\n\t\t// Remove the timer if a connection is successfully established\n\t\tthis.once('connect', this.clearDisconnectTimerOnTimeout);\n\n\t\t// Define how to refer to the connection scheme in debug output.\n\t\tconst socketTypes =\n\t\t{\n\t\t\t[ElectrumTransport.TCP.Scheme]: 'a TCP Socket',\n\t\t\t[ElectrumTransport.TCP_TLS.Scheme]: 'an encrypted TCP socket',\n\t\t};\n\n\t\t// Log that we are trying to establish a connection.\n\t\tdebug.network(`Initiating ${socketTypes[scheme]} connection to '${host}:${port}'.`);\n\n\t\tif(scheme !== ElectrumTransport.TCP.Scheme && scheme !== ElectrumTransport.TCP_TLS.Scheme)\n\t\t{\n\t\t\t// Throw an error if an incorrect transport is specified\n\t\t\tthrow(new Error('Incorrect transport specified'));\n\t\t}\n\n\t\tif(scheme === ElectrumTransport.TCP_TLS.Scheme)\n\t\t{\n\t\t\t// Initialize connection options.\n\t\t\tconst connectionOptions: ConnectionOptions = { rejectUnauthorized: false };\n\n\t\t\t// If the hostname is not an IP address..\n\t\t\tif(!net.isIP(host))\n\t\t\t{\n\t\t\t\t// Set the servername option which enables support for SNI.\n\t\t\t\t// NOTE: SNI enables a server that hosts multiple domains to provide the appropriate TLS certificate.\n\t\t\t\tconnectionOptions.serverName = host;\n\t\t\t}\n\n\t\t\t// Initialize the socket (allowing self-signed certificates).\n\t\t\tthis.tcpSocket = tls.connect(port, host, connectionOptions);\n\n\t\t\t// Add a 'secureConnect' listener that checks the authorization status of\n\t\t\t// the socket, and logs a warning when it uses a self signed certificate.\n\t\t\tthis.tcpSocket.once('secureConnect', () =>\n\t\t\t{\n\t\t\t\t// Cannot happen, since this event callback *only* exists on TLSSocket\n\t\t\t\tif(!(this.tcpSocket instanceof tls.TLSSocket)) return;\n\n\t\t\t\t// Force cast authorizationError from Error to string (through unknown)\n\t\t\t\t// because it is incorrectly typed as an Error\n\t\t\t\tconst authorizationError = (this.tcpSocket.authorizationError as unknown) as string;\n\t\t\t\tif(authorizationError === 'DEPTH_ZERO_SELF_SIGNED_CERT')\n\t\t\t\t{\n\t\t\t\t\tdebug.warning(`Connection to ${host}:${port} uses a self-signed certificate`);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Trigger successful connection events.\n\t\t\tthis.tcpSocket.on('secureConnect', this.onConnect.bind(this, socketTypes[scheme], host, port));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Initialize the socket.\n\t\t\tthis.tcpSocket = net.connect({ host, port });\n\n\t\t\t// Trigger successful connection events.\n\t\t\tthis.tcpSocket.on('connect', this.onConnect.bind(this, socketTypes[scheme], host, port));\n\t\t}\n\n\t\t// Configure encoding.\n\t\tthis.tcpSocket.setEncoding('utf8');\n\n\t\t// Enable persistent connections with an initial delay of 0.\n\t\tthis.tcpSocket.setKeepAlive(true, 0);\n\n\t\t// Disable buffering of outgoing data.\n\t\tthis.tcpSocket.setNoDelay(true);\n\n\t\t// Forward the encountered errors.\n\t\tthis.tcpSocket.on('error', this.eventForwarders.tcpError);\n\t}\n\n\t/**\n\t * Sets up forwarding of events related to the connection.\n\t *\n\t * @param {string} connectionType Name of the connection/transport type, used for logging.\n\t * @param {string} host Fully qualified domain name or IP address of the host\n\t * @param {number} port Network port for the host to connect to\n\t */\n\tonConnect(connectionType: string, host: string, port: number): void\n\t{\n\t\t// If the onConnect function has already run, do not execute it again.\n\t\tif(this.onConnectHasRun) return;\n\n\t\t// Log that the connection has been established.\n\t\tdebug.network(`Established ${connectionType} connection with '${host}:${port}'.`);\n\n\t\t// Forward the socket events\n\t\tthis.tcpSocket.addListener('close', this.eventForwarders.disconnect);\n\t\tthis.tcpSocket.addListener('data', this.eventForwarders.tcpData);\n\n\t\t// Indicate that the onConnect function has run.\n\t\tthis.onConnectHasRun = true;\n\n\t\t// Emit the connect event.\n\t\tthis.emit('connect');\n\t}\n\n\t/**\n\t * Clears the disconnect timer if it is still active.\n\t */\n\tprivate clearDisconnectTimerOnTimeout(): void\n\t{\n\t\t// Clear the retry timer if it is still active.\n\t\tif(this.timers.disconnect)\n\t\t{\n\t\t\tclearTimeout(this.timers.disconnect);\n\t\t}\n\t}\n\n\t/**\n\t * Forcibly terminate the connection.\n\t *\n\t * @throws {Error} if no connection was found\n\t */\n\tdisconnect(): void\n\t{\n\t\t// Clear the disconnect timer so that the socket does not try to disconnect again later.\n\t\tthis.clearDisconnectTimerOnTimeout();\n\n\t\t// Remove all event forwarders.\n\t\tthis.tcpSocket.removeListener('close', this.eventForwarders.disconnect);\n\t\tthis.tcpSocket.removeListener('data', this.eventForwarders.tcpData);\n\t\tthis.tcpSocket.removeListener('error', this.eventForwarders.tcpError);\n\n\t\t// Terminate the connection.\n\t\tthis.tcpSocket.destroy();\n\n\t\t// Remove the stored socket.\n\t\tthis.tcpSocket = undefined;\n\n\t\t// Indicate that the onConnect function has not run and it has to be run again.\n\t\tthis.onConnectHasRun = false;\n\n\t\t// Emit a disconnect event\n\t\tthis.emit('disconnect');\n\t}\n\n\t/**\n\t * Write data to the socket\n\t *\n\t * @param {Uint8Array | string} data Data to be written to the socket\n\t * @param {function} callback Callback function to be called when the write has completed\n\t *\n\t * @throws {Error} if no connection was found\n\t * @returns true if the message was fully flushed to the socket, false if part of the message\n\t * is queued in the user memory\n\t */\n\twrite(data: Uint8Array | string, callback?: (err?: Error) => void): boolean\n\t{\n\t\t// Throw an error if no active connection is found\n\t\tif(!this.tcpSocket)\n\t\t{\n\t\t\tthrow(new Error('Cannot write to socket when there is no active connection'));\n\t\t}\n\n\t\t// Write data to the TLS Socket and return the status indicating\n\t\t// whether the full message was flushed to the socket\n\t\treturn this.tcpSocket.write(data, callback);\n\t}\n\n\t/**\n\t * Force a disconnection if no connection is established after `timeout` milliseconds.\n\t *\n\t * @param {string} host Host of the connection that timed out\n\t * @param {number} port Port of the connection that timed out\n\t * @param {number} timeout Elapsed milliseconds\n\t */\n\tdisconnectOnTimeout(host: string, port: number, timeout: number): void\n\t{\n\t\t// Remove the connect listener.\n\t\tthis.removeListener('connect', this.clearDisconnectTimerOnTimeout);\n\n\t\t// Create a new timeout error.\n\t\tconst timeoutError = { code: 'ETIMEDOUT', message: `Connection to '${host}:${port}' timed out after ${timeout} milliseconds` };\n\n\t\t// Emit an error event so that connect is rejected upstream.\n\t\tthis.emit('error', timeoutError);\n\n\t\t// Forcibly disconnect to clean up the connection on timeout\n\t\tthis.disconnect();\n\t}\n}\n\n/**\n * Isomorphic Socket interface supporting TCP sockets and WebSockets (Node and browser).\n * The interface is a subset of the TLSSocket interface with some slight modifications.\n * It can be expanded when more socket functionality is needed in the rest of the\n * electrum-cash code. Changes from the TLSSocket interface (besides it being a subset):\n * - Event 'close' -> 'disconnect'\n * - New function socket.disconnect()\n *\n * @ignore\n */\nexport class ElectrumWebSocket extends EventEmitter\n{\n\t// Declare an empty WebSocket.\n\tprivate webSocket: WebSocket;\n\n\t// Declare timers for keep-alive pings and reconnection\n\tprivate timers: {\n\t\t// eslint-disable-next-line no-undef\n\t\tretryConnection?: number;\n\t\t// eslint-disable-next-line no-undef\n\t\tdisconnect?: number;\n\t} = {};\n\n\t// Initialize boolean that indicates whether the onConnect function has run (initialize to false).\n\tprivate onConnectHasRun = false;\n\n\t// Initialize event forwarding functions.\n\tprivate eventForwarders =\n\t{\n\t\tdisconnect: () => this.emit('disconnect'),\n\t\twsData: (event: MessageEvent) => this.emit('data', `${event.data}\\n`),\n\t\twsError: (event: ErrorEvent) => this.emit('error', event.error),\n\t};\n\n\t/**\n\t * Connect to host:port using the specified transport\n\t *\n\t * @param {string} host Fully qualified domain name or IP address of the host\n\t * @param {number} port Network port for the host to connect to\n\t * @param {TransportScheme} scheme Transport scheme to use\n\t * @param {number} timeout If no connection is established after `timeout` ms, the connection is terminated\n\t *\n\t * @throws {Error} if an incorrect transport scheme is specified\n\t */\n\tconnect(host: string, port: number, scheme: TransportScheme, timeout: number): void\n\t{\n\t\t// Check that no existing socket exists before initiating a new connection.\n\t\tif(this.webSocket)\n\t\t{\n\t\t\tthrow(new Error('Cannot initiate a new socket connection when an existing connection exists'));\n\t\t}\n\n\t\t// Set a timer to force disconnect after `timeout` seconds\n\t\tthis.timers.disconnect = setTimeout(() => this.disconnectOnTimeout(host, port, timeout), timeout) as unknown as number;\n\n\t\t// Remove the timer if a connection is successfully established\n\t\tthis.once('connect', this.clearDisconnectTimerOnTimeout);\n\n\t\t// Define how to refer to the connection scheme in debug output.\n\t\tconst socketTypes =\n\t\t{\n\t\t\t[ElectrumTransport.WS.Scheme]: 'a WebSocket',\n\t\t\t[ElectrumTransport.WSS.Scheme]: 'an encrypted WebSocket',\n\t\t};\n\n\t\t// Log that we are trying to establish a connection.\n\t\tdebug.network(`Initiating ${socketTypes[scheme]} connection to '${host}:${port}'.`);\n\n\t\tif(scheme !== ElectrumTransport.WS.Scheme && scheme !== ElectrumTransport.WSS.Scheme)\n\t\t{\n\t\t\t// Throw an error if an incorrect transport is specified\n\t\t\tthrow(new Error('Incorrect transport specified'));\n\t\t}\n\n\t\tif(scheme === ElectrumTransport.WSS.Scheme)\n\t\t{\n\t\t\t// Initialize this.webSocket (rejecting self-signed certificates).\n\t\t\t// We reject self-signed certificates to match functionality of browsers.\n\t\t\tthis.webSocket = new WebSocket(`wss://${host}:${port}`);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Initialize this.webSocket.\n\t\t\tthis.webSocket = new WebSocket(`ws://${host}:${port}`);\n\t\t}\n\n\t\t// Trigger successful connection events.\n\t\tthis.webSocket.addEventListener('open', this.onConnect.bind(this, socketTypes[scheme], host, port));\n\n\t\t// Forward the encountered errors.\n\t\tthis.webSocket.addEventListener('error', this.eventForwarders.wsError);\n\t}\n\n\t/**\n\t * Sets up forwarding of events related to the connection.\n\t *\n\t * @param {string} connectionType Name of the connection/transport type, used for logging.\n\t * @param {string} host Fully qualified domain name or IP address of the host\n\t * @param {number} port Network port for the host to connect to\n\t */\n\tonConnect(connectionType: string, host: string, port: number): void\n\t{\n\t\t// If the onConnect function has already run, do not execute it again.\n\t\tif(this.onConnectHasRun) return;\n\n\t\t// Log that the connection has been established.\n\t\tdebug.network(`Established ${connectionType} connection with '${host}:${port}'.`);\n\n\t\t// Forward the socket events\n\t\tthis.webSocket.addEventListener('close', this.eventForwarders.disconnect);\n\t\tthis.webSocket.addEventListener('message', this.eventForwarders.wsData);\n\n\t\t// Indicate that the onConnect function has run.\n\t\tthis.onConnectHasRun = true;\n\n\t\t// Emit the connect event.\n\t\tthis.emit('connect');\n\t}\n\n\t/**\n\t * Clears the disconnect timer if it is still active.\n\t */\n\tprivate clearDisconnectTimerOnTimeout(): void\n\t{\n\t\t// Clear the retry timer if it is still active.\n\t\tif(this.timers.disconnect)\n\t\t{\n\t\t\tclearTimeout(this.timers.disconnect);\n\t\t}\n\t}\n\n\t/**\n\t * Forcibly terminate the connection.\n\t *\n\t * @throws {Error} if no connection was found\n\t */\n\tdisconnect(): void\n\t{\n\t\t// Clear the disconnect timer so that the socket does not try to disconnect again later.\n\t\tthis.clearDisconnectTimerOnTimeout();\n\n\t\ttry\n\t\t{\n\t\t\t// Remove all event forwarders.\n\t\t\tthis.webSocket.removeEventListener('close', this.eventForwarders.disconnect);\n\t\t\tthis.webSocket.removeEventListener('message', this.eventForwarders.wsData);\n\t\t\tthis.webSocket.removeEventListener('error', this.eventForwarders.wsError);\n\n\t\t\t// Gracefully terminate the connection.\n\t\t\tthis.webSocket.close();\n\t\t}\n\t\tcatch(ignored)\n\t\t{\n\t\t\t// close() will throw an error if the connection has not been established yet.\n\t\t\t// We ignore this error, since no similar error gets thrown in the TLS Socket.\n\t\t}\n\t\tfinally\n\t\t{\n\t\t\t// Remove the stored socket regardless of any thrown errors.\n\t\t\tthis.webSocket = undefined;\n\t\t}\n\n\t\t// Indicate that the onConnect function has not run and it has to be run again.\n\t\tthis.onConnectHasRun = false;\n\n\t\t// Emit a disconnect event\n\t\tthis.emit('disconnect');\n\t}\n\n\t/**\n\t * Write data to the socket\n\t *\n\t * @param {Uint8Array | string} data Data to be written to the socket\n\t * @param {function} callback Callback function to be called when the write has completed\n\t *\n\t * @throws {Error} if no connection was found\n\t * @returns true if the message was fully flushed to the socket, false if part of the message\n\t * is queued in the user memory\n\t */\n\twrite(data: Uint8Array | string, callback?: (err?: Error) => void): boolean\n\t{\n\t\t// Throw an error if no active connection is found\n\t\tif(!this.webSocket)\n\t\t{\n\t\t\tthrow(new Error('Cannot write to socket when there is no active connection'));\n\t\t}\n\n\t\t// Write data to the WebSocket\n\t\tthis.webSocket.send(data, callback);\n\n\t\t// WebSockets always fit everything in a single request, so we return true\n\t\treturn true;\n\t}\n\n\t/**\n\t * Force a disconnection if no connection is established after `timeout` milliseconds.\n\t *\n\t * @param {string} host Host of the connection that timed out\n\t * @param {number} port Port of the connection that timed out\n\t * @param {number} timeout Elapsed milliseconds\n\t */\n\tdisconnectOnTimeout(host: string, port: number, timeout: number): void\n\t{\n\t\t// Remove the connect listener.\n\t\tthis.removeListener('connect', this.clearDisconnectTimerOnTimeout);\n\n\t\t// Create a new timeout error.\n\t\tconst timeoutError = { code: 'ETIMEDOUT', message: `Connection to '${host}:${port}' timed out after ${timeout} milliseconds` };\n\n\t\t// Emit an error event so that connect is rejected upstream.\n\t\tthis.emit('error', timeoutError);\n\n\t\t// Forcibly disconnect to clean up the connection on timeout\n\t\tthis.disconnect();\n\t}\n}\n","// Acceptable parameter types for RPC messages\nexport type RPCParameter = string | number | boolean | null;\n\n// The base type for all RPC messages\nexport interface RPCBase\n{\n\tjsonrpc: string;\n}\n\n// An RPC message that sends a notification requiring no response\nexport interface RPCNotification extends RPCBase\n{\n\tmethod: string;\n\tparams?: RPCParameter[];\n}\n\n// An RPC message that sends a request requiring a response\nexport interface RPCRequest extends RPCBase\n{\n\tid: number | null;\n\tmethod: string;\n\tparams?: RPCParameter[];\n}\n\n// An RPC message that returns the response to a successful request\nexport interface RPCStatement extends RPCBase\n{\n\tid: number | null;\n\tresult: string;\n}\n\nexport interface RPCError\n{\n\tcode: number;\n\tmessage: string;\n\tdata?: any;\n}\n\n// An RPC message that returns the error to an unsuccessful request\nexport interface RPCErrorResponse extends RPCBase\n{\n\tid: number | null;\n\terror: RPCError;\n}\n\n// A response to a request is either a statement (successful) or an error (unsuccessful)\nexport type RPCResponse = RPCErrorResponse | RPCStatement;\n\n// RPC messages are notifications, requests, or responses\nexport type RPCMessage = RPCNotification | RPCRequest | RPCResponse;\n\n// Requests and responses can also be sent in batches\nexport type RPCResponseBatch = RPCResponse[];\nexport type RPCRequestBatch = RPCRequest[];\n\nexport const isRPCErrorResponse = function(message: RPCBase): message is RPCErrorResponse\n{\n\treturn 'id' in message && 'error' in message;\n};\n\nexport const isRPCStatement = function(message: RPCBase): message is RPCStatement\n{\n\treturn 'id' in message && 'result' in message;\n};\n\nexport const isRPCNotification = function(message: RPCBase): message is RPCNotification\n{\n\treturn !('id' in message) && 'method' in message;\n};\n\nexport const isRPCRequest = function(message: RPCBase): message is RPCRequest\n{\n\treturn 'id' in message && 'method' in message;\n};\n"],"names":[],"version":3,"file":"index.mjs.map"}
1
+ {"mappings":"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","sources":["lib/index.ts","lib/electrum-client.ts","lib/util.ts","lib/electrum-connection.ts","lib/electrum-protocol.ts","lib/interfaces.ts","lib/constants.ts","lib/electrum-socket.ts","lib/enums.ts","lib/rpc-interfaces.ts"],"sourcesContent":["export { default as ElectrumClient } from './electrum-client';\n\nexport * from './interfaces';\nexport * from './constants';\nexport * from './enums';\n","import debug from './util';\nimport ElectrumConnection from './electrum-connection';\nimport ElectrumProtocol from './electrum-protocol';\nimport { DefaultParameters } from './constants';\nimport { EventEmitter } from 'events';\nimport { ConnectionStatus } from './enums';\nimport { RPCParameter, isRPCNotification, isRPCErrorResponse, RPCNotification, RPCResponse } from './rpc-interfaces';\nimport type { ResolveFunction, RequestResolver, RequestResponse, TransportScheme } from './interfaces';\nimport { Mutex } from 'async-mutex';\n\n/**\n * Triggers when the underlying connection is established.\n *\n * @event ElectrumClient#connected\n */\n\n/**\n * Triggers when the underlying connection is lost.\n *\n * @event ElectrumClient#disconnected\n */\n\n/**\n * Triggers when the remote server sends data that is not a request response.\n *\n * @event ElectrumClient#notification\n */\n\n/**\n * High-level Electrum client that lets applications send requests and subscribe to notification events from a server.\n */\nclass ElectrumClient extends EventEmitter\n{\n\t// Declare instance variables\n\tpublic connection: ElectrumConnection;\n\n\t// Initialize an empty list of subscription metadata.\n\tprivate subscriptionMethods: Record<string, Set<string>> = {};\n\n\t// Start counting the request IDs from 0\n\tprivate requestId = 0;\n\n\t// Initialize an empty dictionary for keeping track of request resolvers\n\tprivate requestResolvers: { [index: number]: RequestResolver } = {};\n\n\t// Mutex lock used to prevent simultaneous connect() and disconnect() calls.\n\tprivate connectionLock = new Mutex();\n\n\t/**\n\t * Initializes an Electrum client.\n\t *\n\t * @param {string} application your application name, used to identify to the electrum host.\n\t * @param {string} version protocol version to use with the host.\n\t * @param {string} host fully qualified domain name or IP number of the host.\n\t * @param {number} port the TCP network port of the host.\n\t * @param {TransportScheme} scheme the transport scheme to use for connection\n\t * @param {number} timeout how long network delays we will wait for before taking action, in milliseconds.\n\t * @param {number} pingInterval the time between sending pings to the electrum host, in milliseconds.\n\t * @param {number} reconnectInterval the time between reconnection attempts to the electrum host, in milliseconds.\n\t * @param {boolean} useBigInt\t\t\t whether to use bigint for numbers in json response.\n\t *\n\t * @throws {Error} if `version` is not a valid version string.\n\t */\n\tconstructor(\n\t\tpublic application: string,\n\t\tpublic version: string,\n\t\tpublic host: string,\n\t\tpublic port: number = DefaultParameters.PORT,\n\t\tpublic scheme: TransportScheme = DefaultParameters.TRANSPORT_SCHEME,\n\t\tpublic timeout: number = DefaultParameters.TIMEOUT,\n\t\tpublic pingInterval: number = DefaultParameters.PING_INTERVAL,\n\t\tpublic reconnectInterval: number = DefaultParameters.RECONNECT,\n\t\tpublic useBigInt: boolean = DefaultParameters.USE_BIG_INT,\n\t)\n\t{\n\t\t// Initialize the event emitter.\n\t\tsuper();\n\n\t\t// Set up a connection to an electrum server.\n\t\tthis.connection = new ElectrumConnection(application, version, host, port, scheme, timeout, pingInterval, reconnectInterval, useBigInt);\n\t}\n\n\t/**\n\t * Connects to the remote server.\n\t *\n\t * @throws {Error} if the socket connection fails.\n\t * @returns a promise resolving when the connection is established.\n\t */\n\tasync connect(): Promise<void>\n\t{\n\t\t// Create a lock so that multiple connects/disconnects cannot race each other.\n\t\tconst unlock = await this.connectionLock.acquire();\n\n\t\ttry\n\t\t{\n\t\t\t// If we are already connected, do not attempt to connect again.\n\t\t\tif(this.connection.status === ConnectionStatus.CONNECTED)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Listen for parsed statements.\n\t\t\tthis.connection.on('statement', this.response.bind(this));\n\n\t\t\t// Hook up resubscription on connection.\n\t\t\tthis.connection.on('connect', this.resubscribeOnConnect.bind(this));\n\n\t\t\t// Relay connect and disconnect events.\n\t\t\tthis.connection.on('connect', this.emit.bind(this, 'connected'));\n\t\t\tthis.connection.on('disconnect', this.onConnectionDisconnect.bind(this));\n\n\t\t\t// Relay error events.\n\t\t\tthis.connection.on('error', this.emit.bind(this, 'error'));\n\n\t\t\t// Connect with the server.\n\t\t\tawait this.connection.connect();\n\t\t}\n\t\t// Always release our lock so that we do not end up in a stuck-state.\n\t\tfinally\n\t\t{\n\t\t\tunlock();\n\t\t}\n\t}\n\n\t/**\n\t * Disconnects from the remote server and removes all event listeners/subscriptions and open requests.\n\t *\n\t * @param {boolean} force disconnect even if the connection has not been fully established yet.\n\t * @param {boolean} retainSubscriptions retain subscription data so they will be restored on reconnection.\n\t *\n\t * @returns true if successfully disconnected, or false if there was no connection.\n\t */\n\tasync disconnect(force: boolean = false, retainSubscriptions: boolean = false): Promise<boolean>\n\t{\n\t\t// Create a lock so that multiple connects/disconnects cannot race each other.\n\t\tconst unlock = await this.connectionLock.acquire();\n\n\t\ttry\n\t\t{\n\t\t\tif(!retainSubscriptions)\n\t\t\t{\n\t\t\t\t// Cancel all event listeners.\n\t\t\t\tthis.removeAllListeners();\n\n\t\t\t\t// Remove all subscription data\n\t\t\t\tthis.subscriptionMethods = {};\n\t\t\t}\n\n\t\t\t// For each pending request..\n\t\t\tfor(const index in this.requestResolvers)\n\t\t\t{\n\t\t\t\t// Reject the request.\n\t\t\t\tconst requestResolver = this.requestResolvers[index];\n\t\t\t\trequestResolver(new Error('Manual disconnection'));\n\n\t\t\t\t// Remove the request.\n\t\t\t\tdelete this.requestResolvers[index];\n\t\t\t}\n\n\t\t\t// Disconnect from the remove server.\n\t\t\treturn await this.connection.disconnect(force);\n\t\t}\n\t\t// Always release our lock so that we do not end up in a stuck-state.\n\t\tfinally\n\t\t{\n\t\t\tunlock();\n\t\t}\n\t}\n\n\t/**\n\t * Calls a method on the remote server with the supplied parameters.\n\t *\n\t * @param {string} method name of the method to call.\n\t * @param {...string} parameters one or more parameters for the method.\n\t *\n\t * @throws {Error} if the client is disconnected.\n\t * @returns a promise that resolves with the result of the method or an Error.\n\t */\n\tasync request(method: string, ...parameters: RPCParameter[]): Promise<Error | RequestResponse>\n\t{\n\t\t// If we are not connected to a server..\n\t\tif(this.connection.status !== ConnectionStatus.CONNECTED)\n\t\t{\n\t\t\t// Reject the request with a disconnected error message.\n\t\t\tthrow(new Error(`Unable to send request to a disconnected server '${this.connection.host}'.`));\n\t\t}\n\n\t\t// Increase the request ID by one.\n\t\tthis.requestId += 1;\n\n\t\t// Store a copy of the request id.\n\t\tconst id = this.requestId;\n\n\t\t// Format the arguments as an electrum request object.\n\t\tconst message = ElectrumProtocol.buildRequestObject(method, parameters, id);\n\n\t\t// Define a function to wrap the request in a promise.\n\t\tconst requestResolver = (resolve: ResolveFunction<Error | RequestResponse>): void =>\n\t\t{\n\t\t\t// Add a request resolver for this promise to the list of requests.\n\t\t\tthis.requestResolvers[id] = (error?: Error, data?: RequestResponse) =>\n\t\t\t{\n\t\t\t\t// If the resolution failed..\n\t\t\t\tif(error)\n\t\t\t\t{\n\t\t\t\t\t// Resolve the promise with the error for the application to handle.\n\t\t\t\t\tresolve(error);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t// Resolve the promise with the request results.\n\t\t\t\t\tresolve(data as RequestResponse);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// Send the request message to the remote server.\n\t\t\tthis.connection.send(message);\n\t\t};\n\n\t\t// Write a log message.\n\t\tdebug.network(`Sending request '${method}' to '${this.connection.host}'`);\n\n\t\t// return a promise to deliver results later.\n\t\treturn new Promise<Error | RequestResponse>(requestResolver);\n\t}\n\n\t/**\n\t * Subscribes to the method and payload at the server.\n\t *\n\t * @note the response for the subscription request is issued as a notification event.\n\t *\n\t * @param {string} method one of the subscribable methods the server supports.\n\t * @param {...string} parameters one or more parameters for the method.\n\t *\n\t * @throws {Error} if the client is disconnected.\n\t * @returns a promise resolving when the subscription is established.\n\t */\n\tasync subscribe(method: string, ...parameters: RPCParameter[]): Promise<void>\n\t{\n\t\t// Initialize an empty list of subscription payloads, if needed.\n\t\tif(!this.subscriptionMethods[method])\n\t\t{\n\t\t\tthis.subscriptionMethods[method] = new Set<string>();\n\t\t}\n\n\t\t// Store the subscription parameters to track what data we have subscribed to.\n\t\tthis.subscriptionMethods[method].add(JSON.stringify(parameters));\n\n\t\t// Send initial subscription request.\n\t\tconst requestData = await this.request(method, ...parameters);\n\n\t\t// Construct a notification structure to package the initial result as a notification.\n\t\tconst notification =\n\t\t{\n\t\t\tjsonrpc: '2.0',\n\t\t\tmethod: method,\n\t\t\tparams: [ ...parameters, requestData ],\n\t\t};\n\n\t\t// Manually emit an event for the initial response.\n\t\tthis.emit('notification', notification);\n\t}\n\n\t/**\n\t * Unsubscribes to the method at the server and removes any callback functions\n\t * when there are no more subscriptions for the method.\n\t *\n\t * @param {string} method a previously subscribed to method.\n\t * @param {...string} parameters one or more parameters for the method.\n\t *\n\t * @throws {Error} if no subscriptions exist for the combination of the provided `method` and `parameters.\n\t * @throws {Error} if the client is disconnected.\n\t * @returns a promise resolving when the subscription is removed.\n\t */\n\tasync unsubscribe(method: string, ...parameters: RPCParameter[]): Promise<void>\n\t{\n\t\t// Throw an error if the client is disconnected.\n\t\tif(this.connection.status !== ConnectionStatus.CONNECTED)\n\t\t{\n\t\t\tthrow(new Error(`Unable to send unsubscribe request to a disconnected server '${this.connection.host}'.`));\n\t\t}\n\n\t\t// If this method has no subscriptions..\n\t\tif(!this.subscriptionMethods[method])\n\t\t{\n\t\t\t// Reject this promise with an explanation.\n\t\t\tthrow(new Error(`Cannot unsubscribe from '${method}' since the method has no subscriptions.`));\n\t\t}\n\n\t\t// Pack up the parameters as a long string.\n\t\tconst subscriptionParameters = JSON.stringify(parameters);\n\n\t\t// If the method payload could not be located..\n\t\tif(!this.subscriptionMethods[method].has(subscriptionParameters))\n\t\t{\n\t\t\t// Reject this promise with an explanation.\n\t\t\tthrow(new Error(`Cannot unsubscribe from '${method}' since it has no subscription with the given parameters.`));\n\t\t}\n\n\t\t// Remove this specific subscription payload from internal tracking.\n\t\tthis.subscriptionMethods[method].delete(subscriptionParameters);\n\n\t\t// Send unsubscription request to the server\n\t\t// NOTE: As a convenience we allow users to define the method as the subscribe or unsubscribe version.\n\t\tawait this.request(method.replace('.subscribe', '.unsubscribe'), ...parameters);\n\n\t\t// Write a log message.\n\t\tdebug.client(`Unsubscribed from '${String(method)}' for the '${subscriptionParameters}' parameters.`);\n\t}\n\n\t/**\n\t * Restores existing subscriptions without updating status or triggering manual callbacks.\n\t *\n\t * @throws {Error} if subscription data cannot be found for all stored event names.\n\t * @throws {Error} if the client is disconnected.\n\t * @returns a promise resolving to true when the subscriptions are restored.\n\t *\n\t * @ignore\n\t */\n\tprivate async resubscribeOnConnect(): Promise<void>\n\t{\n\t\t// Write a log message.\n\t\tdebug.client(`Connected to '${this.connection.hostIdentifier}'.`);\n\n\t\t// Initialize an empty list of resubscription promises.\n\t\tconst resubscriptionPromises = [];\n\n\t\t// For each method we have a subscription for..\n\t\tfor(const method in this.subscriptionMethods)\n\t\t{\n\t\t\t// .. and for each parameter we have previously been subscribed to..\n\t\t\tfor(const parameterJSON of this.subscriptionMethods[method].values())\n\t\t\t{\n\t\t\t\t// restore the parameters from JSON.\n\t\t\t\tconst parameters = JSON.parse(parameterJSON);\n\n\t\t\t\t// Send a subscription request.\n\t\t\t\tresubscriptionPromises.push(this.subscribe(method, ...parameters));\n\t\t\t}\n\n\t\t\t// Wait for all re-subscriptions to complete.\n\t\t\tawait Promise.all(resubscriptionPromises);\n\t\t}\n\n\t\t// Write a log message if there was any subscriptions to restore.\n\t\tif(resubscriptionPromises.length > 0)\n\t\t{\n\t\t\tdebug.client(`Restored ${resubscriptionPromises.length} previous subscriptions for '${this.connection.hostIdentifier}'`);\n\t\t}\n\t}\n\n\t/**\n\t * Parser messages from the remote server to resolve request promises and emit subscription events.\n\t *\n\t * @param {RPCNotification | RPCResponse} message the response message\n\t *\n\t * @throws {Error} if the message ID does not match an existing request.\n\t * @ignore\n\t */\n\tresponse(message: RPCNotification | RPCResponse): void\n\t{\n\t\t// If the received message is a notification, we forward it to all event listeners\n\t\tif(isRPCNotification(message))\n\t\t{\n\t\t\t// Write a log message.\n\t\t\tdebug.client(`Received notification for '${message.method}' from '${this.connection.host}'`);\n\n\t\t\t// Forward the message content to all event listeners.\n\t\t\tthis.emit('notification', message);\n\n\t\t\t// Return since it does not have an associated request resolver\n\t\t\treturn;\n\t\t}\n\n\t\t// If the response ID is null we cannot use it to index our request resolvers\n\t\tif(message.id === null)\n\t\t{\n\t\t\t// Throw an internal error, this should not happen.\n\t\t\tthrow(new Error('Internal error: Received an RPC response with ID null.'));\n\t\t}\n\n\t\t// Look up which request promise we should resolve this.\n\t\tconst requestResolver = this.requestResolvers[message.id];\n\n\t\t// If we do not have a request resolver for this response message..\n\t\tif(!requestResolver)\n\t\t{\n\t\t\t// Throw an internal error, this should not happen.\n\t\t\tthrow(new Error('Internal error: Callback for response not available.'));\n\t\t}\n\n\t\t// Remove the promise from the request list.\n\t\tdelete this.requestResolvers[message.id];\n\n\t\t// If the message contains an error..\n\t\tif(isRPCErrorResponse(message))\n\t\t{\n\t\t\t// Forward the message error to the request resolver and omit the `result` parameter.\n\t\t\trequestResolver(new Error(message.error.message));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Forward the message content to the request resolver and omit the `error` parameter\n\t\t\t// (by setting it to undefined).\n\t\t\trequestResolver(undefined, message.result);\n\t\t}\n\t}\n\n\t/**\n\t * Callback function that is called when connection to the Electrum server is lost.\n\t * Aborts all active requests with an error message indicating that connection was lost.\n\t *\n\t * @ignore\n\t */\n\tonConnectionDisconnect(): void\n\t{\n\t\t// Emit a disconnection signal to any listeners.\n\t\tthis.emit('disconnected');\n\n\t\t// Loop over active requests\n\t\tfor(const resolverId in this.requestResolvers)\n\t\t{\n\t\t\t// Extract request resolver for readability\n\t\t\tconst requestResolver = this.requestResolvers[resolverId];\n\n\t\t\t// Resolve the active request with an error indicating that the connection was lost.\n\t\t\trequestResolver(new Error('Connection lost'));\n\n\t\t\t// Remove the promise from the request list.\n\t\t\tdelete this.requestResolvers[resolverId];\n\t\t}\n\t}\n}\n\n// Export the client.\nexport default ElectrumClient;\n","import debugLogger from 'debug';\n\n// Create the debug logs.\nconst debug =\n{\n\tclient: debugLogger('electrum-cash:client '),\n\terrors: debugLogger('electrum-cash:error '),\n\twarning: debugLogger('electrum-cash:warning'),\n\tnetwork: debugLogger('electrum-cash:network'),\n\tping: debugLogger('electrum-cash:pulses '),\n};\n\n// Set log colors.\ndebug.client.color = '2';\ndebug.errors.color = '9';\ndebug.warning.color = '13';\ndebug.network.color = '4';\ndebug.ping.color = '8';\n\n// Export the logs.\nexport default debug;\n","import debug from './util';\nimport ElectrumProtocol from './electrum-protocol';\nimport { ResolveFunction, RejectFunction, VersionRejected, VersionNegotiated, isVersionRejected, TransportScheme } from './interfaces';\nimport { DefaultParameters, ElectrumTransport } from './constants';\nimport { EventEmitter } from 'events';\nimport { ElectrumTcpSocket, ElectrumWebSocket } from './electrum-socket';\nimport { ConnectionStatus } from './enums';\nimport { parse, parseNumberAndBigInt } from 'lossless-json';\n\n/**\n * Wrapper around TLS/WSS sockets that gracefully separates a network stream into Electrum protocol messages.\n *\n * @ignore\n */\nclass ElectrumConnection extends EventEmitter\n{\n\t// Initialize the connected flag to false to indicate that there is no connection\n\tpublic status: ConnectionStatus = ConnectionStatus.DISCONNECTED;\n\n\t// Declare empty timestamps\n\tpublic lastReceivedTimestamp: number;\n\n\t// Hold the reported software string returned on protocol version negotiation.\n\tpublic software: string;\n\n\t// Declare an empty socket.\n\tprivate socket: ElectrumTcpSocket | ElectrumWebSocket;\n\n\t// Declare timers for keep-alive pings and reconnection\n\tprivate timers: {\n\t\t// eslint-disable-next-line no-undef\n\t\tkeepAlive?: number;\n\t\t// eslint-disable-next-line no-undef\n\t\treconnect?: number;\n\t} = {};\n\n\t// Initialize an empty array of connection verification timers.\n\t// eslint-disable-next-line no-undef\n\tprivate verifications: Array<number> = [];\n\n\t// Initialize messageBuffer to an empty string\n\tprivate messageBuffer = '';\n\n\t/**\n\t * Sets up network configuration for an Electrum client connection.\n\t *\n\t * @param {string} application your application name, used to identify to the electrum host.\n\t * @param {string} version protocol version to use with the host.\n\t * @param {string} host fully qualified domain name or IP number of the host.\n\t * @param {number} port the network port of the host.\n\t * @param {TransportScheme} scheme the transport scheme to use for connection\n\t * @param {number} timeout how long network delays we will wait for before taking action, in milliseconds.\n\t * @param {number} pingInterval the time between sending pings to the electrum host, in milliseconds.\n\t * @param {number} reconnectInterval the time between reconnection attempts to the electrum host, in milliseconds.\n\t * @param {boolean} useBigInt\t \t\t whether to use bigint for numbers in json response.\n\t *\n\t * @throws {Error} if `version` is not a valid version string.\n\t */\n\tconstructor(\n\t\tpublic application: string,\n\t\tpublic version: string,\n\t\tpublic host: string,\n\t\tpublic port: number = DefaultParameters.PORT,\n\t\tpublic scheme: TransportScheme = DefaultParameters.TRANSPORT_SCHEME,\n\t\tpublic timeout: number = DefaultParameters.TIMEOUT,\n\t\tpublic pingInterval: number = DefaultParameters.PING_INTERVAL,\n\t\tpublic reconnectInterval: number = DefaultParameters.RECONNECT,\n\t\tpublic useBigInt: boolean = DefaultParameters.USE_BIG_INT,\n\t)\n\t{\n\t\t// Initialize the event emitter.\n\t\tsuper();\n\n\t\t// Check if the provided version is a valid version number.\n\t\tif(!ElectrumProtocol.versionRegexp.test(version))\n\t\t{\n\t\t\t// Throw an error since the version number was not valid.\n\t\t\tthrow(new Error(`Provided version string (${version}) is not a valid protocol version number.`));\n\t\t}\n\n\t\t// Create an initial network socket.\n\t\tthis.createSocket();\n\n\t\t// Handle visibility changes when run in a browser environment.\n\t\tif(typeof document !== 'undefined')\n\t\t{\n\t\t\tdocument.addEventListener('visibilitychange', this.handleVisibilityChange.bind(this));\n\t\t}\n\t}\n\n\t/**\n\t * Returns a string for the host identifier for usage in debug messages.\n\t */\n\tget hostIdentifier(): string\n\t{\n\t\treturn `${this.host}:${this.port}`;\n\t}\n\n\t/**\n\t * Create and configures a fresh socket and attaches all relevant listeners.\n\t */\n\tcreateSocket(): void\n\t{\n\t\tif(this.scheme === ElectrumTransport.TCP.Scheme || this.scheme === ElectrumTransport.TCP_TLS.Scheme)\n\t\t{\n\t\t\t// Initialize a new ElectrumTcpSocket\n\t\t\tthis.socket = new ElectrumTcpSocket();\n\t\t}\n\t\telse if(this.scheme === ElectrumTransport.WS.Scheme || this.scheme === ElectrumTransport.WSS.Scheme)\n\t\t{\n\t\t\t// Initialize a new ElectrumWebSocket\n\t\t\tthis.socket = new ElectrumWebSocket();\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Throw an error if an incorrect transport is specified\n\t\t\tthrow(new Error(`Provided transport (${this.scheme}) is not a valid ElectrumTransport`));\n\t\t}\n\n\t\t// Set up handlers for connection and disconnection.\n\t\tthis.socket.on('connect', this.onSocketConnect.bind(this));\n\t\tthis.socket.on('disconnect', this.onSocketDisconnect.bind(this));\n\n\t\t// Set up handler for incoming data.\n\t\tthis.socket.on('data', this.parseMessageChunk.bind(this));\n\t}\n\n\t/**\n\t * Shuts down and destroys the current socket.\n\t */\n\tdestroySocket(): void\n\t{\n\t\t// Close the socket connection and destroy the socket.\n\t\tthis.socket.disconnect();\n\t}\n\n\t/**\n\t * Assembles incoming data into statements and hands them off to the message parser.\n\t *\n\t * @param {string} data data to append to the current message buffer, as a string.\n\t *\n\t * @throws {SyntaxError} if the passed statement parts are not valid JSON.\n\t */\n\tparseMessageChunk(data: string): void\n\t{\n\t\t// Update the timestamp for when we last received data.\n\t\tthis.lastReceivedTimestamp = Date.now();\n\n\t\t// Clear and remove all verification timers.\n\t\tthis.verifications.forEach((timer) => clearTimeout(timer));\n\t\tthis.verifications.length = 0;\n\n\t\t// Add the message to the current message buffer.\n\t\tthis.messageBuffer += data;\n\n\t\t// Check if the new message buffer contains the statement delimiter.\n\t\twhile(this.messageBuffer.includes(ElectrumProtocol.statementDelimiter))\n\t\t{\n\t\t\t// Split message buffer into statements.\n\t\t\tconst statementParts = this.messageBuffer.split(ElectrumProtocol.statementDelimiter);\n\n\t\t\t// For as long as we still have statements to parse..\n\t\t\twhile(statementParts.length > 1)\n\t\t\t{\n\t\t\t\t// Move the first statement to its own variable.\n\t\t\t\tconst currentStatementList = String(statementParts.shift());\n\n\t\t\t\t// Parse the statement into an object or list of objects.\n\t\t\t\tlet statementList: any = parse(currentStatementList, null, this.useBigInt ? parseNumberAndBigInt : parseFloat);\n\n\t\t\t\t// Wrap the statement in an array if it is not already a batched statement list.\n\t\t\t\tif(!Array.isArray(statementList))\n\t\t\t\t{\n\t\t\t\t\tstatementList = [ statementList ];\n\t\t\t\t}\n\n\t\t\t\t// For as long as there is statements in the result set..\n\t\t\t\twhile(statementList.length > 0)\n\t\t\t\t{\n\t\t\t\t\t// Move the first statement from the batch to its own variable.\n\t\t\t\t\tconst currentStatement = statementList.shift();\n\n\t\t\t\t\t// If the current statement is a version negotiation response..\n\t\t\t\t\tif(currentStatement.id === 'versionNegotiation')\n\t\t\t\t\t{\n\t\t\t\t\t\tif(currentStatement.error)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Then emit a failed version negotiation response signal.\n\t\t\t\t\t\t\tthis.emit('version', { error: currentStatement.error });\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Extract the software and protocol version reported.\n\t\t\t\t\t\t\tconst [ software, protocol ] = currentStatement.result;\n\n\t\t\t\t\t\t\t// Store the reported software description.\n\t\t\t\t\t\t\tthis.software = software;\n\n\t\t\t\t\t\t\t// Emit a successful version negotiation response signal.\n\t\t\t\t\t\t\tthis.emit('version', { software, protocol });\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Consider this statement handled.\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// If the current statement is a keep-alive response..\n\t\t\t\t\tif(currentStatement.id === 'keepAlive')\n\t\t\t\t\t{\n\t\t\t\t\t\t// Do nothing and consider this statement handled.\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Emit the statements for handling higher up in the stack.\n\t\t\t\t\tthis.emit('statement', currentStatement);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Store the remaining statement as the current message buffer.\n\t\t\tthis.messageBuffer = statementParts.shift() || '';\n\t\t}\n\t}\n\n\t/**\n\t * Sends a keep-alive message to the host.\n\t *\n\t * @returns true if the ping message was fully flushed to the socket, false if\n\t * part of the message is queued in the user memory\n\t */\n\tping(): boolean\n\t{\n\t\t// Write a log message.\n\t\tdebug.ping(`Sending keep-alive ping to '${this.hostIdentifier}'`);\n\n\t\t// Craft a keep-alive message.\n\t\tconst message = ElectrumProtocol.buildRequestObject('server.ping', [], 'keepAlive');\n\n\t\t// Send the keep-alive message.\n\t\tconst status = this.send(message);\n\n\t\t// Return the ping status.\n\t\treturn status;\n\t}\n\n\t/**\n\t * Initiates the network connection negotiates a protocol version. Also emits the 'connect' signal if successful.\n\t *\n\t * @throws {Error} if the socket connection fails.\n\t * @returns a promise resolving when the connection is established\n\t */\n\tasync connect(): Promise<void>\n\t{\n\t\t// If we are already connected return true.\n\t\tif(this.status === ConnectionStatus.CONNECTED)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t// Indicate that the connection is connecting\n\t\tthis.status = ConnectionStatus.CONNECTING;\n\n\t\t// Define a function to wrap connection as a promise.\n\t\tconst connectionResolver = (resolve: ResolveFunction<void>, reject: RejectFunction): void =>\n\t\t{\n\t\t\tconst rejector = (error: Error): void =>\n\t\t\t{\n\t\t\t\t// Set the status back to disconnected\n\t\t\t\tthis.status = ConnectionStatus.DISCONNECTED;\n\n\t\t\t\t// Reject with the error as reason\n\t\t\t\treject(error);\n\t\t\t};\n\n\t\t\t// Replace previous error handlers to reject the promise on failure.\n\t\t\tthis.socket.removeAllListeners('error');\n\t\t\tthis.socket.once('error', rejector);\n\n\t\t\t// Define a function to wrap version negotiation as a callback.\n\t\t\tconst versionNegotiator = (): void =>\n\t\t\t{\n\t\t\t\t// Write a log message to show that we have started version negotiation.\n\t\t\t\tdebug.network(`Requesting protocol version ${this.version} with '${this.hostIdentifier}'.`);\n\n\t\t\t\t// remove the one-time error handler since no error was detected.\n\t\t\t\tthis.socket.removeListener('error', rejector);\n\n\t\t\t\t// Build a version negotiation message.\n\t\t\t\tconst versionMessage = ElectrumProtocol.buildRequestObject('server.version', [ this.application, this.version ], 'versionNegotiation');\n\n\t\t\t\t// Define a function to wrap version validation as a function.\n\t\t\t\tconst versionValidator = (version: VersionRejected | VersionNegotiated): void =>\n\t\t\t\t{\n\t\t\t\t\t// Check if version negotiation failed.\n\t\t\t\t\tif(isVersionRejected(version))\n\t\t\t\t\t{\n\t\t\t\t\t\t// Disconnect from the host.\n\t\t\t\t\t\tthis.disconnect(true);\n\n\t\t\t\t\t\t// Declare an error message.\n\t\t\t\t\t\tconst errorMessage = 'unsupported protocol version.';\n\n\t\t\t\t\t\t// Log the error.\n\t\t\t\t\t\tdebug.errors(`Failed to connect with ${this.hostIdentifier} due to ${errorMessage}`);\n\n\t\t\t\t\t\t// Reject the connection with false since version negotiation failed.\n\t\t\t\t\t\treject(errorMessage);\n\t\t\t\t\t}\n\t\t\t\t\t// Check if the host supports our requested protocol version.\n\t\t\t\t\t// NOTE: the server responds with version numbers that truncate 0's, so 1.5.0 turns into 1.5.\n\t\t\t\t\telse if((version.protocol !== this.version) && (`${version.protocol}.0` !== this.version) && (`${version.protocol}.0.0` !== this.version))\n\t\t\t\t\t{\n\t\t\t\t\t\t// Disconnect from the host.\n\t\t\t\t\t\tthis.disconnect(true);\n\n\t\t\t\t\t\t// Declare an error message.\n\t\t\t\t\t\tconst errorMessage = `incompatible protocol version negotiated (${version.protocol} !== ${this.version}).`;\n\n\t\t\t\t\t\t// Log the error.\n\t\t\t\t\t\tdebug.errors(`Failed to connect with ${this.hostIdentifier} due to ${errorMessage}`);\n\n\t\t\t\t\t\t// Reject the connection with false since version negotiation failed.\n\t\t\t\t\t\treject(errorMessage);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// Write a log message.\n\t\t\t\t\t\tdebug.network(`Negotiated protocol version ${version.protocol} with '${this.hostIdentifier}', powered by ${version.software}.`);\n\n\t\t\t\t\t\t// Set connection status to connected\n\t\t\t\t\t\tthis.status = ConnectionStatus.CONNECTED;\n\n\t\t\t\t\t\t// Emit a connect event now that the connection is usable.\n\t\t\t\t\t\tthis.emit('connect');\n\n\t\t\t\t\t\t// Resolve the connection promise since we successfully connected and negotiated protocol version.\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Listen for version negotiation once.\n\t\t\t\tthis.once('version', versionValidator);\n\n\t\t\t\t// Send the version negotiation message.\n\t\t\t\tthis.send(versionMessage);\n\t\t\t};\n\n\t\t\t// Prepare the version negotiation.\n\t\t\tthis.socket.once('connect', versionNegotiator);\n\n\t\t\t// Set up handler for network errors.\n\t\t\tthis.socket.on('error', this.onSocketError.bind(this));\n\n\t\t\t// Connect to the server.\n\t\t\tthis.socket.connect(this.host, this.port, this.scheme, this.timeout);\n\t\t};\n\n\t\t// Wait until connection is established and version negotiation succeeds.\n\t\tawait new Promise<void>(connectionResolver);\n\t}\n\n\t/**\n\t * Restores the network connection.\n\t */\n\tasync reconnect(): Promise<void>\n\t{\n\t\t// If a reconnect timer is set, remove it\n\t\tawait this.clearReconnectTimer();\n\n\t\t// Write a log message.\n\t\tdebug.network(`Trying to reconnect to '${this.hostIdentifier}'..`);\n\n\t\t// Set the status to reconnecting for more accurate log messages.\n\t\tthis.status = ConnectionStatus.RECONNECTING;\n\n\t\t// Destroy and recreate the socket to get a clean slate.\n\t\tthis.destroySocket();\n\t\tthis.createSocket();\n\n\t\ttry\n\t\t{\n\t\t\t// Try to connect again.\n\t\t\tawait this.connect();\n\t\t}\n\t\tcatch(error)\n\t\t{\n\t\t\t// Do nothing as the error should be handled via the disconnect and error signals.\n\t\t}\n\t}\n\n\t/**\n\t * Removes the current reconnect timer.\n\t */\n\tclearReconnectTimer(): void\n\t{\n\t\t// If a reconnect timer is set, remove it\n\t\tif(this.timers.reconnect)\n\t\t{\n\t\t\tclearTimeout(this.timers.reconnect);\n\t\t}\n\n\t\t// Reset the timer reference.\n\t\tthis.timers.reconnect = undefined;\n\t}\n\n\t/**\n\t * Removes the current keep-alive timer.\n\t */\n\tclearKeepAliveTimer(): void\n\t{\n\t\t// If a keep-alive timer is set, remove it\n\t\tif(this.timers.keepAlive)\n\t\t{\n\t\t\tclearTimeout(this.timers.keepAlive);\n\t\t}\n\n\t\t// Reset the timer reference.\n\t\tthis.timers.keepAlive = undefined;\n\t}\n\n\t/**\n\t * Initializes the keep alive timer loop.\n\t */\n\tsetupKeepAliveTimer(): void\n\t{\n\t\t// If the keep-alive timer loop is not currently set up..\n\t\tif(!this.timers.keepAlive)\n\t\t{\n\t\t\t// Set a new keep-alive timer.\n\t\t\tthis.timers.keepAlive = setTimeout(this.ping.bind(this), this.pingInterval) as unknown as number;\n\t\t}\n\t}\n\n\t/**\n\t * Tears down the current connection and removes all event listeners on disconnect.\n\t *\n\t * @param {boolean} force disconnect even if the connection has not been fully established yet.\n\t * @param {boolean} intentional update connection state if disconnect is intentional.\n\t *\n\t * @returns true if successfully disconnected, or false if there was no connection.\n\t */\n\tasync disconnect(force: boolean = false, intentional: boolean = true): Promise<boolean>\n\t{\n\t\t// Return early when there is nothing to disconnect from\n\t\tif(this.status === ConnectionStatus.DISCONNECTED && !force)\n\t\t{\n\t\t\t// Return false to indicate that there was nothing to disconnect from.\n\t\t\treturn false;\n\t\t}\n\n\t\t// Update connection state if the disconnection is intentional.\n\t\t// NOTE: The state is meant to represent what the client is requesting, but\n\t\t// is used internally to handle visibility changes in browsers to ensure functional reconnection.\n\t\tif(intentional)\n\t\t{\n\t\t\t// Set connection status to null to indicate tear-down is currently happening.\n\t\t\tthis.status = ConnectionStatus.DISCONNECTING;\n\t\t}\n\n\t\t// If a keep-alive timer is set, remove it.\n\t\tawait this.clearKeepAliveTimer();\n\n\t\t// If a reconnect timer is set, remove it\n\t\tawait this.clearReconnectTimer();\n\n\t\tconst disconnectResolver = (resolve: ResolveFunction<boolean>): void =>\n\t\t{\n\t\t\t// Resolve to true after the connection emits a disconnect\n\t\t\tthis.once('disconnect', () => resolve(true));\n\n\t\t\t// Close the connection and destroy the socket.\n\t\t\tthis.destroySocket();\n\t\t};\n\n\t\t// Return true to indicate that we disconnected.\n\t\treturn new Promise<boolean>(disconnectResolver);\n\t}\n\n\t/**\n\t * Updates connection state based on application visibility.\n\t *\n\t * Some browsers will disconnect network connections when the browser is out of focus,\n\t * which would normally cause our reconnect-on-timeout routines to trigger, but that\n\t * results in a poor user experience since the events are not handled consistently\n\t * and sometimes it can take some time after restoring focus to the browser.\n\t *\n\t * By manually disconnecting when this happens we prevent the default reconnection routines\n\t * and make the behavior consistent across browsers.\n\t */\n\tasync handleVisibilityChange(): Promise<void>\n\t{\n\t\t// Disconnect when application is removed from focus.\n\t\tif(document.visibilityState === 'hidden')\n\t\t{\n\t\t\tconst forceDisconnect = true;\n\t\t\tconst isIntended = false;\n\n\t\t\tthis.disconnect(forceDisconnect, isIntended);\n\t\t}\n\n\t\t// Reconnect when application is returned to focus.\n\t\tif(document.visibilityState === 'visible')\n\t\t{\n\t\t\tthis.reconnect();\n\t\t}\n\t}\n\n\t/**\n\t * Sends an arbitrary message to the server.\n\t *\n\t * @param {string} message json encoded request object to send to the server, as a string.\n\t *\n\t * @returns true if the message was fully flushed to the socket, false if part of the message\n\t * is queued in the user memory\n\t */\n\tsend(message: string): boolean\n\t{\n\t\t// Remove the current keep-alive timer if it exists.\n\t\tthis.clearKeepAliveTimer();\n\n\t\t// Get the current timestamp in milliseconds.\n\t\tconst currentTime = Date.now();\n\n\t\t// Follow up and verify that the message got sent..\n\t\tconst verificationTimer = setTimeout(this.verifySend.bind(this, currentTime), this.timeout) as unknown as number;\n\n\t\t// Store the verification timer locally so that it can be cleared when data has been received.\n\t\tthis.verifications.push(verificationTimer);\n\n\t\t// Set a new keep-alive timer.\n\t\tthis.setupKeepAliveTimer();\n\n\t\t// Write the message to the network socket.\n\t\treturn this.socket.write(message + ElectrumProtocol.statementDelimiter);\n\t}\n\n\t// --- Event managers. --- //\n\n\t/**\n\t * Marks the connection as timed out and schedules reconnection if we have not\n\t * received data within the expected time frame.\n\t */\n\tverifySend(sentTimestamp: number): void\n\t{\n\t\t// If we haven't received any data since we last sent data out..\n\t\tif(Number(this.lastReceivedTimestamp) < sentTimestamp)\n\t\t{\n\t\t\t// If this connection is already disconnected, we do not change anything\n\t\t\tif((this.status === ConnectionStatus.DISCONNECTED) || (this.status === ConnectionStatus.DISCONNECTING))\n\t\t\t{\n\t\t\t\tdebug.errors(`Tried to verify already disconnected connection to '${this.hostIdentifier}'`);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Remove the current keep-alive timer if it exists.\n\t\t\tthis.clearKeepAliveTimer();\n\n\t\t\t// Write a notification to the logs.\n\t\t\tdebug.network(`Connection to '${this.hostIdentifier}' timed out.`);\n\n\t\t\t// Close the connection to avoid re-use.\n\t\t\t// NOTE: This initiates reconnection routines if the connection has not\n\t\t\t// been marked as intentionally disconnected.\n\t\t\tthis.socket.disconnect();\n\t\t}\n\t}\n\n\t/**\n\t * Updates the connection status when a connection is confirmed.\n\t */\n\tonSocketConnect(): void\n\t{\n\t\t// If a reconnect timer is set, remove it.\n\t\tthis.clearReconnectTimer();\n\n\t\t// Set up the initial timestamp for when we last received data from the server.\n\t\tthis.lastReceivedTimestamp = Date.now();\n\n\t\t// Set up the initial keep-alive timer.\n\t\tthis.setupKeepAliveTimer();\n\n\t\t// Clear all temporary error listeners.\n\t\tthis.socket.removeAllListeners('error');\n\n\t\t// Set up handler for network errors.\n\t\tthis.socket.on('error', this.onSocketError.bind(this));\n\t}\n\n\t/**\n\t * Updates the connection status when a connection is ended.\n\t */\n\tonSocketDisconnect(): void\n\t{\n\t\t// Send a disconnect signal higher up the stack.\n\t\tthis.emit('disconnect');\n\n\t\t// Remove the current keep-alive timer if it exists.\n\t\tthis.clearKeepAliveTimer();\n\n\t\t// If this is a connection we're trying to tear down..\n\t\tif(this.status === ConnectionStatus.DISCONNECTING)\n\t\t{\n\t\t\t// If a reconnect timer is set, remove it.\n\t\t\tthis.clearReconnectTimer();\n\n\t\t\t// Remove all event listeners\n\t\t\tthis.removeAllListeners();\n\n\t\t\t// Mark the connection as disconnected.\n\t\t\tthis.status = ConnectionStatus.DISCONNECTED;\n\n\t\t\t// Write a log message.\n\t\t\tdebug.network(`Disconnected from '${this.hostIdentifier}'.`);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// If this is for an established connection..\n\t\t\tif(this.status === ConnectionStatus.CONNECTED)\n\t\t\t{\n\t\t\t\t// Write a notification to the logs.\n\t\t\t\tdebug.errors(`Connection with '${this.hostIdentifier}' was closed, trying to reconnect in ${this.reconnectInterval / 1000} seconds.`);\n\t\t\t}\n\t\t\t// If this is a connection that is currently connecting, reconnecting or already disconnected..\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Do nothing\n\n\t\t\t\t// NOTE: This error message is useful during manual debugging of reconnections.\n\t\t\t\t// debug.errors(`Lost connection with reconnecting or already disconnected server '${this.hostIdentifier}'.`);\n\t\t\t}\n\n\t\t\t// Mark the connection as disconnected for now..\n\t\t\tthis.status = ConnectionStatus.DISCONNECTED;\n\n\t\t\t// If we don't have a pending reconnection timer..\n\t\t\tif(!this.timers.reconnect)\n\t\t\t{\n\t\t\t\t// Attempt to reconnect after one keep-alive duration.\n\t\t\t\tthis.timers.reconnect = setTimeout(this.reconnect.bind(this), this.reconnectInterval) as unknown as number;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Notify administrator of any unexpected errors.\n\t */\n\tonSocketError(error: any | undefined): void\n\t{\n\t\t// Report a generic error if no error information is present.\n\t\t// NOTE: When using WSS, the error event explicitly\n\t\t// only allows to send a \"simple\" event without data.\n\t\t// https://stackoverflow.com/a/18804298\n\t\tif(typeof error === 'undefined')\n\t\t{\n\t\t\t// Do nothing, and instead rely on the socket disconnect event for further information.\n\t\t\treturn;\n\t\t}\n\n\t\t// If the DNS lookup failed.\n\t\tif(error.code === 'EAI_AGAIN')\n\t\t{\n\t\t\tdebug.errors(`Failed to look up DNS records for '${this.host}'.`);\n\n\t\t\treturn;\n\t\t}\n\n\t\t// If the connection timed out..\n\t\tif(error.code === 'ETIMEDOUT')\n\t\t{\n\t\t\t// Log the provided timeout message.\n\t\t\tdebug.errors(error.message);\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Log unknown error\n\t\tdebug.errors(`Unknown network error ('${this.hostIdentifier}'): `, error);\n\t}\n}\n\n// Export the connection.\nexport default ElectrumConnection;\n","import { RPCParameter } from './rpc-interfaces';\n\n/**\n * Grouping of utilities that simplifies implementation of the Electrum protocol.\n *\n * @ignore\n */\nclass ElectrumProtocol\n{\n\t/**\n\t * Helper function that builds an Electrum request object.\n\t *\n\t * @param {string} method method to call.\n\t * @param {array} parameters method parameters for the call.\n\t * @param {string} requestId unique string or number referencing this request.\n\t *\n\t * @returns a properly formatted Electrum request string.\n\t */\n\tstatic buildRequestObject(method: string, parameters: RPCParameter[], requestId: string | number): string\n\t{\n\t\t// Return the formatted request object.\n\t\t// NOTE: Electrum either uses JsonRPC strictly or loosely.\n\t\t// If we specify protocol identifier without being 100% compliant, we risk being disconnected/blacklisted.\n\t\t// For this reason, we omit the protocol identifier to avoid issues.\n\t\treturn JSON.stringify({ method: method, params: parameters, id: requestId });\n\t}\n\n\t/**\n\t * Constant used to verify if a provided string is a valid version number.\n\t *\n\t * @returns a regular expression that matches valid version numbers.\n\t */\n\tstatic get versionRegexp(): RegExp\n\t{\n\t\treturn /^\\d+(\\.\\d+)+$/;\n\t}\n\n\t/**\n\t * Constant used to separate statements/messages in a stream of data.\n\t *\n\t * @returns the delimiter used by Electrum to separate statements.\n\t */\n\tstatic get statementDelimiter(): string\n\t{\n\t\treturn '\\n';\n\t}\n}\n\n// export the protocol.\nexport default ElectrumProtocol;\n","import type { ClientState } from './enums';\nimport type ElectrumClient from './electrum-client';\nimport type { RPCError } from './rpc-interfaces';\n\nexport interface ClientConfig\n{\n\t// Availability of the client's connection\n\tstate: ClientState;\n\n\t// The client's connection\n\tconnection: ElectrumClient;\n}\n\n/**\n * A list of possible responses to requests.\n */\nexport type RequestResponse = object | string | number | boolean | null | RequestResponse[];\n\n// Request resolvers are used to process the response of a request. This takes either\n// an error object or any stringified data, while the other parameter is omitted.\nexport type RequestResolver = (error?: Error, data?: string) => void;\n\n// Promise types\nexport type ResolveFunction<T> = (value: T | PromiseLike<T>) => void;\nexport type RejectFunction = (reason?: any) => void;\n\nexport interface VersionRejected\n{\n\terror: RPCError;\n}\n\nexport interface VersionNegotiated\n{\n\tsoftware: string;\n\tprotocol: string;\n}\n\nexport const isVersionRejected = function(object: any): object is VersionRejected\n{\n\treturn 'error' in object;\n};\n\nexport const isVersionNegotiated = function(object: any): object is VersionNegotiated\n{\n\treturn 'software' in object && 'protocol' in object;\n};\n\n/**\n * Possible Transport Schemes for communication with the Electrum server\n */\nexport type TransportScheme = 'tcp' | 'tcp_tls' | 'ws' | 'wss';\n\n// Connection options used with TLS connections.\nexport interface ConnectionOptions\n{\n\trejectUnauthorized?: boolean;\n\tserverName?: string;\n}\n","import { TransportScheme } from './interfaces';\n\n/**\n * Object containing the commonly used ports and schemes for specific Transports.\n * @example const electrum = new ElectrumClient('Electrum client example', '1.4.1', 'bch.imaginary.cash', Transport.WSS.Port, Transport.WSS.Scheme);\n *\n * @property {object} TCP Port and Scheme to use unencrypted TCP sockets.\n * @property {object} TCP_TLS Port and Scheme to use TLS-encrypted TCP sockets.\n * @property {object} WS Port and Scheme to use unencrypted WebSockets.\n * @property {object} WSS Port and Scheme to use TLS-encrypted WebSockets.\n */\nexport const ElectrumTransport =\n{\n\tTCP: { Port: 50001, Scheme: 'tcp' as TransportScheme },\n\tTCP_TLS: { Port: 50002, Scheme: 'tcp_tls' as TransportScheme },\n\tWS: { Port: 50003, Scheme: 'ws' as TransportScheme },\n\tWSS: { Port: 50004, Scheme: 'wss' as TransportScheme },\n};\n\nexport const DefaultParameters =\n{\n\t// Port number for TCP TLS connections\n\tPORT: ElectrumTransport.TCP_TLS.Port,\n\n\t// Transport to connect to the Electrum server\n\tTRANSPORT_SCHEME: ElectrumTransport.TCP_TLS.Scheme,\n\n\t// How long to wait before attempting to reconnect, in milliseconds.\n\tRECONNECT: 5 * 1000,\n\n\t// How long to wait for network operations before following up, in milliseconds.\n\tTIMEOUT: 30 * 1000,\n\n\t// Time between ping messages, in milliseconds. Pinging keeps the connection alive.\n\t// The reason for pinging this frequently is to detect connection problems early.\n\tPING_INTERVAL: 1 * 1000,\n\n\t// If we use BigInt for numbers in json when parsing and returning json response from the server.\n\tUSE_BIG_INT: false,\n};\n","import * as tls from 'tls';\nimport * as net from 'net';\nimport { WebSocket } from '@monsterbitar/isomorphic-ws';\nimport type { MessageEvent, ErrorEvent } from '@monsterbitar/isomorphic-ws';\nimport { EventEmitter } from 'events';\nimport debug from './util';\nimport { ElectrumTransport } from './constants';\nimport { TransportScheme, ConnectionOptions } from './interfaces';\n\nexport class ElectrumTcpSocket extends EventEmitter\n{\n\t// Declare an empty TCP socket.\n\tprivate tcpSocket: net.Socket;\n\n\t// Declare timers for keep-alive pings and reconnection\n\tprivate timers: {\n\t\t// eslint-disable-next-line no-undef\n\t\tretryConnection?: number;\n\t\t// eslint-disable-next-line no-undef\n\t\tdisconnect?: number;\n\t} = {};\n\n\t// Initialize boolean that indicates whether the onConnect function has run (initialize to false).\n\tprivate onConnectHasRun = false;\n\n\t// Initialize event forwarding functions.\n\tprivate eventForwarders =\n\t{\n\t\tdisconnect: () => this.emit('disconnect'),\n\t\ttcpData: (data: string) => this.emit('data', data),\n\t\ttcpError: (err: Error) => this.emit('error', err),\n\t};\n\n\t/**\n\t * Connect to host:port using the specified transport\n\t *\n\t * @param {string} host Fully qualified domain name or IP address of the host\n\t * @param {number} port Network port for the host to connect to\n\t * @param {TransportScheme} scheme Transport scheme to use\n\t * @param {number} timeout If no connection is established after `timeout` ms, the connection is terminated\n\t *\n\t * @throws {Error} if an incorrect transport scheme is specified\n\t */\n\tconnect(host: string, port: number, scheme: TransportScheme, timeout: number): void\n\t{\n\t\t// Check that no existing socket exists before initiating a new connection.\n\t\tif(this.tcpSocket)\n\t\t{\n\t\t\tthrow(new Error('Cannot initiate a new socket connection when an existing connection exists'));\n\t\t}\n\n\t\t// Set a timer to force disconnect after `timeout` seconds\n\t\tthis.timers.disconnect = setTimeout(() => this.disconnectOnTimeout(host, port, timeout), timeout) as unknown as number;\n\n\t\t// Remove the timer if a connection is successfully established\n\t\tthis.once('connect', this.clearDisconnectTimerOnTimeout);\n\n\t\t// Define how to refer to the connection scheme in debug output.\n\t\tconst socketTypes =\n\t\t{\n\t\t\t[ElectrumTransport.TCP.Scheme]: 'a TCP Socket',\n\t\t\t[ElectrumTransport.TCP_TLS.Scheme]: 'an encrypted TCP socket',\n\t\t};\n\n\t\t// Log that we are trying to establish a connection.\n\t\tdebug.network(`Initiating ${socketTypes[scheme]} connection to '${host}:${port}'.`);\n\n\t\tif(scheme !== ElectrumTransport.TCP.Scheme && scheme !== ElectrumTransport.TCP_TLS.Scheme)\n\t\t{\n\t\t\t// Throw an error if an incorrect transport is specified\n\t\t\tthrow(new Error('Incorrect transport specified'));\n\t\t}\n\n\t\tif(scheme === ElectrumTransport.TCP_TLS.Scheme)\n\t\t{\n\t\t\t// Initialize connection options.\n\t\t\tconst connectionOptions: ConnectionOptions = { rejectUnauthorized: false };\n\n\t\t\t// If the hostname is not an IP address..\n\t\t\tif(!net.isIP(host))\n\t\t\t{\n\t\t\t\t// Set the servername option which enables support for SNI.\n\t\t\t\t// NOTE: SNI enables a server that hosts multiple domains to provide the appropriate TLS certificate.\n\t\t\t\tconnectionOptions.serverName = host;\n\t\t\t}\n\n\t\t\t// Initialize the socket (allowing self-signed certificates).\n\t\t\tthis.tcpSocket = tls.connect(port, host, connectionOptions);\n\n\t\t\t// Add a 'secureConnect' listener that checks the authorization status of\n\t\t\t// the socket, and logs a warning when it uses a self signed certificate.\n\t\t\tthis.tcpSocket.once('secureConnect', () =>\n\t\t\t{\n\t\t\t\t// Cannot happen, since this event callback *only* exists on TLSSocket\n\t\t\t\tif(!(this.tcpSocket instanceof tls.TLSSocket)) return;\n\n\t\t\t\t// Force cast authorizationError from Error to string (through unknown)\n\t\t\t\t// because it is incorrectly typed as an Error\n\t\t\t\tconst authorizationError = (this.tcpSocket.authorizationError as unknown) as string;\n\t\t\t\tif(authorizationError === 'DEPTH_ZERO_SELF_SIGNED_CERT')\n\t\t\t\t{\n\t\t\t\t\tdebug.warning(`Connection to ${host}:${port} uses a self-signed certificate`);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Trigger successful connection events.\n\t\t\tthis.tcpSocket.on('secureConnect', this.onConnect.bind(this, socketTypes[scheme], host, port));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Initialize the socket.\n\t\t\tthis.tcpSocket = net.connect({ host, port });\n\n\t\t\t// Trigger successful connection events.\n\t\t\tthis.tcpSocket.on('connect', this.onConnect.bind(this, socketTypes[scheme], host, port));\n\t\t}\n\n\t\t// Configure encoding.\n\t\tthis.tcpSocket.setEncoding('utf8');\n\n\t\t// Enable persistent connections with an initial delay of 0.\n\t\tthis.tcpSocket.setKeepAlive(true, 0);\n\n\t\t// Disable buffering of outgoing data.\n\t\tthis.tcpSocket.setNoDelay(true);\n\n\t\t// Forward the encountered errors.\n\t\tthis.tcpSocket.on('error', this.eventForwarders.tcpError);\n\t}\n\n\t/**\n\t * Sets up forwarding of events related to the connection.\n\t *\n\t * @param {string} connectionType Name of the connection/transport type, used for logging.\n\t * @param {string} host Fully qualified domain name or IP address of the host\n\t * @param {number} port Network port for the host to connect to\n\t */\n\tonConnect(connectionType: string, host: string, port: number): void\n\t{\n\t\t// If the onConnect function has already run, do not execute it again.\n\t\tif(this.onConnectHasRun) return;\n\n\t\t// Log that the connection has been established.\n\t\tdebug.network(`Established ${connectionType} connection with '${host}:${port}'.`);\n\n\t\t// Forward the socket events\n\t\tthis.tcpSocket.addListener('close', this.eventForwarders.disconnect);\n\t\tthis.tcpSocket.addListener('data', this.eventForwarders.tcpData);\n\n\t\t// Indicate that the onConnect function has run.\n\t\tthis.onConnectHasRun = true;\n\n\t\t// Emit the connect event.\n\t\tthis.emit('connect');\n\t}\n\n\t/**\n\t * Clears the disconnect timer if it is still active.\n\t */\n\tprivate clearDisconnectTimerOnTimeout(): void\n\t{\n\t\t// Clear the retry timer if it is still active.\n\t\tif(this.timers.disconnect)\n\t\t{\n\t\t\tclearTimeout(this.timers.disconnect);\n\t\t}\n\t}\n\n\t/**\n\t * Forcibly terminate the connection.\n\t *\n\t * @throws {Error} if no connection was found\n\t */\n\tdisconnect(): void\n\t{\n\t\t// Clear the disconnect timer so that the socket does not try to disconnect again later.\n\t\tthis.clearDisconnectTimerOnTimeout();\n\n\t\t// Remove all event forwarders.\n\t\tthis.tcpSocket.removeListener('close', this.eventForwarders.disconnect);\n\t\tthis.tcpSocket.removeListener('data', this.eventForwarders.tcpData);\n\t\tthis.tcpSocket.removeListener('error', this.eventForwarders.tcpError);\n\n\t\t// Terminate the connection.\n\t\tthis.tcpSocket.destroy();\n\n\t\t// Remove the stored socket.\n\t\tthis.tcpSocket = undefined;\n\n\t\t// Indicate that the onConnect function has not run and it has to be run again.\n\t\tthis.onConnectHasRun = false;\n\n\t\t// Emit a disconnect event\n\t\tthis.emit('disconnect');\n\t}\n\n\t/**\n\t * Write data to the socket\n\t *\n\t * @param {Uint8Array | string} data Data to be written to the socket\n\t * @param {function} callback Callback function to be called when the write has completed\n\t *\n\t * @throws {Error} if no connection was found\n\t * @returns true if the message was fully flushed to the socket, false if part of the message\n\t * is queued in the user memory\n\t */\n\twrite(data: Uint8Array | string, callback?: (err?: Error) => void): boolean\n\t{\n\t\t// Throw an error if no active connection is found\n\t\tif(!this.tcpSocket)\n\t\t{\n\t\t\tthrow(new Error('Cannot write to socket when there is no active connection'));\n\t\t}\n\n\t\t// Write data to the TLS Socket and return the status indicating\n\t\t// whether the full message was flushed to the socket\n\t\treturn this.tcpSocket.write(data, callback);\n\t}\n\n\t/**\n\t * Force a disconnection if no connection is established after `timeout` milliseconds.\n\t *\n\t * @param {string} host Host of the connection that timed out\n\t * @param {number} port Port of the connection that timed out\n\t * @param {number} timeout Elapsed milliseconds\n\t */\n\tdisconnectOnTimeout(host: string, port: number, timeout: number): void\n\t{\n\t\t// Remove the connect listener.\n\t\tthis.removeListener('connect', this.clearDisconnectTimerOnTimeout);\n\n\t\t// Create a new timeout error.\n\t\tconst timeoutError = { code: 'ETIMEDOUT', message: `Connection to '${host}:${port}' timed out after ${timeout} milliseconds` };\n\n\t\t// Emit an error event so that connect is rejected upstream.\n\t\tthis.emit('error', timeoutError);\n\n\t\t// Forcibly disconnect to clean up the connection on timeout\n\t\tthis.disconnect();\n\t}\n}\n\n/**\n * Isomorphic Socket interface supporting TCP sockets and WebSockets (Node and browser).\n * The interface is a subset of the TLSSocket interface with some slight modifications.\n * It can be expanded when more socket functionality is needed in the rest of the\n * electrum-cash code. Changes from the TLSSocket interface (besides it being a subset):\n * - Event 'close' -> 'disconnect'\n * - New function socket.disconnect()\n *\n * @ignore\n */\nexport class ElectrumWebSocket extends EventEmitter\n{\n\t// Declare an empty WebSocket.\n\tprivate webSocket: WebSocket;\n\n\t// Declare timers for keep-alive pings and reconnection\n\tprivate timers: {\n\t\t// eslint-disable-next-line no-undef\n\t\tretryConnection?: number;\n\t\t// eslint-disable-next-line no-undef\n\t\tdisconnect?: number;\n\t} = {};\n\n\t// Initialize boolean that indicates whether the onConnect function has run (initialize to false).\n\tprivate onConnectHasRun = false;\n\n\t// Initialize event forwarding functions.\n\tprivate eventForwarders =\n\t{\n\t\tdisconnect: () => this.emit('disconnect'),\n\t\twsData: (event: MessageEvent) => this.emit('data', `${event.data}\\n`),\n\t\twsError: (event: ErrorEvent) => this.emit('error', event.error),\n\t};\n\n\t/**\n\t * Connect to host:port using the specified transport\n\t *\n\t * @param {string} host Fully qualified domain name or IP address of the host\n\t * @param {number} port Network port for the host to connect to\n\t * @param {TransportScheme} scheme Transport scheme to use\n\t * @param {number} timeout If no connection is established after `timeout` ms, the connection is terminated\n\t *\n\t * @throws {Error} if an incorrect transport scheme is specified\n\t */\n\tconnect(host: string, port: number, scheme: TransportScheme, timeout: number): void\n\t{\n\t\t// Check that no existing socket exists before initiating a new connection.\n\t\tif(this.webSocket)\n\t\t{\n\t\t\tthrow(new Error('Cannot initiate a new socket connection when an existing connection exists'));\n\t\t}\n\n\t\t// Set a timer to force disconnect after `timeout` seconds\n\t\tthis.timers.disconnect = setTimeout(() => this.disconnectOnTimeout(host, port, timeout), timeout) as unknown as number;\n\n\t\t// Remove the timer if a connection is successfully established\n\t\tthis.once('connect', this.clearDisconnectTimerOnTimeout);\n\n\t\t// Define how to refer to the connection scheme in debug output.\n\t\tconst socketTypes =\n\t\t{\n\t\t\t[ElectrumTransport.WS.Scheme]: 'a WebSocket',\n\t\t\t[ElectrumTransport.WSS.Scheme]: 'an encrypted WebSocket',\n\t\t};\n\n\t\t// Log that we are trying to establish a connection.\n\t\tdebug.network(`Initiating ${socketTypes[scheme]} connection to '${host}:${port}'.`);\n\n\t\tif(scheme !== ElectrumTransport.WS.Scheme && scheme !== ElectrumTransport.WSS.Scheme)\n\t\t{\n\t\t\t// Throw an error if an incorrect transport is specified\n\t\t\tthrow(new Error('Incorrect transport specified'));\n\t\t}\n\n\t\tif(scheme === ElectrumTransport.WSS.Scheme)\n\t\t{\n\t\t\t// Initialize this.webSocket (rejecting self-signed certificates).\n\t\t\t// We reject self-signed certificates to match functionality of browsers.\n\t\t\tthis.webSocket = new WebSocket(`wss://${host}:${port}`);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Initialize this.webSocket.\n\t\t\tthis.webSocket = new WebSocket(`ws://${host}:${port}`);\n\t\t}\n\n\t\t// Trigger successful connection events.\n\t\tthis.webSocket.addEventListener('open', this.onConnect.bind(this, socketTypes[scheme], host, port));\n\n\t\t// Forward the encountered errors.\n\t\tthis.webSocket.addEventListener('error', this.eventForwarders.wsError);\n\t}\n\n\t/**\n\t * Sets up forwarding of events related to the connection.\n\t *\n\t * @param {string} connectionType Name of the connection/transport type, used for logging.\n\t * @param {string} host Fully qualified domain name or IP address of the host\n\t * @param {number} port Network port for the host to connect to\n\t */\n\tonConnect(connectionType: string, host: string, port: number): void\n\t{\n\t\t// If the onConnect function has already run, do not execute it again.\n\t\tif(this.onConnectHasRun) return;\n\n\t\t// Log that the connection has been established.\n\t\tdebug.network(`Established ${connectionType} connection with '${host}:${port}'.`);\n\n\t\t// Forward the socket events\n\t\tthis.webSocket.addEventListener('close', this.eventForwarders.disconnect);\n\t\tthis.webSocket.addEventListener('message', this.eventForwarders.wsData);\n\n\t\t// Indicate that the onConnect function has run.\n\t\tthis.onConnectHasRun = true;\n\n\t\t// Emit the connect event.\n\t\tthis.emit('connect');\n\t}\n\n\t/**\n\t * Clears the disconnect timer if it is still active.\n\t */\n\tprivate clearDisconnectTimerOnTimeout(): void\n\t{\n\t\t// Clear the retry timer if it is still active.\n\t\tif(this.timers.disconnect)\n\t\t{\n\t\t\tclearTimeout(this.timers.disconnect);\n\t\t}\n\t}\n\n\t/**\n\t * Forcibly terminate the connection.\n\t *\n\t * @throws {Error} if no connection was found\n\t */\n\tdisconnect(): void\n\t{\n\t\t// Clear the disconnect timer so that the socket does not try to disconnect again later.\n\t\tthis.clearDisconnectTimerOnTimeout();\n\n\t\ttry\n\t\t{\n\t\t\t// Remove all event forwarders.\n\t\t\tthis.webSocket.removeEventListener('close', this.eventForwarders.disconnect);\n\t\t\tthis.webSocket.removeEventListener('message', this.eventForwarders.wsData);\n\t\t\tthis.webSocket.removeEventListener('error', this.eventForwarders.wsError);\n\n\t\t\t// Gracefully terminate the connection.\n\t\t\tthis.webSocket.close();\n\t\t}\n\t\tcatch(ignored)\n\t\t{\n\t\t\t// close() will throw an error if the connection has not been established yet.\n\t\t\t// We ignore this error, since no similar error gets thrown in the TLS Socket.\n\t\t}\n\t\tfinally\n\t\t{\n\t\t\t// Remove the stored socket regardless of any thrown errors.\n\t\t\tthis.webSocket = undefined;\n\t\t}\n\n\t\t// Indicate that the onConnect function has not run and it has to be run again.\n\t\tthis.onConnectHasRun = false;\n\n\t\t// Emit a disconnect event\n\t\tthis.emit('disconnect');\n\t}\n\n\t/**\n\t * Write data to the socket\n\t *\n\t * @param {Uint8Array | string} data Data to be written to the socket\n\t * @param {function} callback Callback function to be called when the write has completed\n\t *\n\t * @throws {Error} if no connection was found\n\t * @returns true if the message was fully flushed to the socket, false if part of the message\n\t * is queued in the user memory\n\t */\n\twrite(data: Uint8Array | string, callback?: (err?: Error) => void): boolean\n\t{\n\t\t// Throw an error if no active connection is found\n\t\tif(!this.webSocket)\n\t\t{\n\t\t\tthrow(new Error('Cannot write to socket when there is no active connection'));\n\t\t}\n\n\t\t// Write data to the WebSocket\n\t\tthis.webSocket.send(data, callback);\n\n\t\t// WebSockets always fit everything in a single request, so we return true\n\t\treturn true;\n\t}\n\n\t/**\n\t * Force a disconnection if no connection is established after `timeout` milliseconds.\n\t *\n\t * @param {string} host Host of the connection that timed out\n\t * @param {number} port Port of the connection that timed out\n\t * @param {number} timeout Elapsed milliseconds\n\t */\n\tdisconnectOnTimeout(host: string, port: number, timeout: number): void\n\t{\n\t\t// Remove the connect listener.\n\t\tthis.removeListener('connect', this.clearDisconnectTimerOnTimeout);\n\n\t\t// Create a new timeout error.\n\t\tconst timeoutError = { code: 'ETIMEDOUT', message: `Connection to '${host}:${port}' timed out after ${timeout} milliseconds` };\n\n\t\t// Emit an error event so that connect is rejected upstream.\n\t\tthis.emit('error', timeoutError);\n\n\t\t// Forcibly disconnect to clean up the connection on timeout\n\t\tthis.disconnect();\n\t}\n}\n","// Disable indent rule for this file because it is broken (https://github.com/typescript-eslint/typescript-eslint/issues/1824)\n/* eslint-disable @typescript-eslint/indent */\n\n/**\n * Enum that denotes the availability of an ElectrumClient.\n * @enum {number}\n * @property {0} UNAVAILABLE The client is currently not available.\n * @property {1} AVAILABLE The client is available for use.\n */\nexport enum ClientState\n{\n\tUNAVAILABLE = 0,\n\tAVAILABLE = 1,\n}\n\n/**\n * Enum that denotes the connection status of an ElectrumConnection.\n * @enum {number}\n * @property {0} DISCONNECTED The connection is disconnected.\n * @property {1} AVAILABLE The connection is connected.\n * @property {2} DISCONNECTING The connection is disconnecting.\n * @property {3} CONNECTING The connection is connecting.\n * @property {4} RECONNECTING The connection is restarting.\n */\nexport enum ConnectionStatus\n{\n\tDISCONNECTED = 0,\n\tCONNECTED = 1,\n\tDISCONNECTING = 2,\n\tCONNECTING = 3,\n\tRECONNECTING = 4,\n}\n","// Acceptable parameter types for RPC messages\nexport type RPCParameter = string | number | boolean | null;\n\n// The base type for all RPC messages\nexport interface RPCBase\n{\n\tjsonrpc: string;\n}\n\n// An RPC message that sends a notification requiring no response\nexport interface RPCNotification extends RPCBase\n{\n\tmethod: string;\n\tparams?: RPCParameter[];\n}\n\n// An RPC message that sends a request requiring a response\nexport interface RPCRequest extends RPCBase\n{\n\tid: number | null;\n\tmethod: string;\n\tparams?: RPCParameter[];\n}\n\n// An RPC message that returns the response to a successful request\nexport interface RPCStatement extends RPCBase\n{\n\tid: number | null;\n\tresult: string;\n}\n\nexport interface RPCError\n{\n\tcode: number;\n\tmessage: string;\n\tdata?: any;\n}\n\n// An RPC message that returns the error to an unsuccessful request\nexport interface RPCErrorResponse extends RPCBase\n{\n\tid: number | null;\n\terror: RPCError;\n}\n\n// A response to a request is either a statement (successful) or an error (unsuccessful)\nexport type RPCResponse = RPCErrorResponse | RPCStatement;\n\n// RPC messages are notifications, requests, or responses\nexport type RPCMessage = RPCNotification | RPCRequest | RPCResponse;\n\n// Requests and responses can also be sent in batches\nexport type RPCResponseBatch = RPCResponse[];\nexport type RPCRequestBatch = RPCRequest[];\n\nexport const isRPCErrorResponse = function(message: RPCBase): message is RPCErrorResponse\n{\n\treturn 'id' in message && 'error' in message;\n};\n\nexport const isRPCStatement = function(message: RPCBase): message is RPCStatement\n{\n\treturn 'id' in message && 'result' in message;\n};\n\nexport const isRPCNotification = function(message: RPCBase): message is RPCNotification\n{\n\treturn !('id' in message) && 'method' in message;\n};\n\nexport const isRPCRequest = function(message: RPCBase): message is RPCRequest\n{\n\treturn 'id' in message && 'method' in message;\n};\n"],"names":[],"version":3,"file":"index.mjs.map"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@electrum-cash/network",
3
- "version": "4.0.0-development.6391574314",
3
+ "version": "4.0.0-development.6392223875",
4
4
  "description": "@electrum-cash/network is a lightweight JavaScript library that lets you connect with one or more Electrum servers.",
5
5
  "homepage": "https://gitlab.com/electrum-cash/network#readme",
6
6
  "bugs": {