@xelis/sdk 0.10.0 → 0.10.2

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.
@@ -17,7 +17,7 @@ var __extends = (this && this.__extends) || (function () {
17
17
  exports.__esModule = true;
18
18
  exports.RPC = void 0;
19
19
  var types_1 = require("./types");
20
- var rpc_1 = require("../lib/rpc");
20
+ var http_1 = require("../rpc/http");
21
21
  var RPC = /** @class */ (function (_super) {
22
22
  __extends(RPC, _super);
23
23
  function RPC() {
@@ -219,6 +219,6 @@ var RPC = /** @class */ (function (_super) {
219
219
  return this.request(types_1.RPCMethod.SubmitBlock, params);
220
220
  };
221
221
  return RPC;
222
- }(rpc_1.RPC));
222
+ }(http_1.HttpRPC));
223
223
  exports.RPC = RPC;
224
224
  exports["default"] = RPC;
@@ -17,7 +17,7 @@ var __extends = (this && this.__extends) || (function () {
17
17
  exports.__esModule = true;
18
18
  exports.WS = exports.DaemonMethods = void 0;
19
19
  var types_1 = require("./types");
20
- var websocket_1 = require("../lib/websocket");
20
+ var websocket_1 = require("../rpc/websocket");
21
21
  var DaemonMethods = /** @class */ (function () {
22
22
  function DaemonMethods(ws, prefix) {
23
23
  if (prefix === void 0) { prefix = ""; }
@@ -285,6 +285,6 @@ var WS = /** @class */ (function (_super) {
285
285
  return _this;
286
286
  }
287
287
  return WS;
288
- }(websocket_1.WS));
288
+ }(websocket_1.WSRPC));
289
289
  exports.WS = WS;
290
290
  exports["default"] = WS;
@@ -36,24 +36,29 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
36
36
  }
37
37
  };
38
38
  exports.__esModule = true;
39
- exports.RPC = void 0;
39
+ exports.HttpRPC = void 0;
40
40
  var parse_json_1 = require("./parse_json/parse_json");
41
- var RPC = /** @class */ (function () {
42
- function RPC(endpoint) {
41
+ var HttpRPC = /** @class */ (function () {
42
+ function HttpRPC(endpoint) {
43
43
  this.endpoint = endpoint;
44
44
  this.timeout = 3000;
45
45
  this.headers = new Headers();
46
46
  this.headers.set("Content-Type", "application/json");
47
47
  }
48
- RPC.prototype.request = function (method, params) {
48
+ HttpRPC.prototype.batchRequest = function (requests) {
49
49
  return __awaiter(this, void 0, void 0, function () {
50
- var controller_1, body, timeoutId, res, jsonString, data, err_1;
50
+ var controller_1, id_1, body, timeoutId, res, jsonString, items_1, data, err_1;
51
51
  return __generator(this, function (_a) {
52
52
  switch (_a.label) {
53
53
  case 0:
54
54
  _a.trys.push([0, 5, , 6]);
55
55
  controller_1 = new AbortController();
56
- body = JSON.stringify({ id: 1, jsonrpc: '2.0', method: method, params: params });
56
+ id_1 = 0;
57
+ requests.forEach(function (request) {
58
+ request.id = ++id_1;
59
+ request.jsonrpc = "2.0";
60
+ });
61
+ body = JSON.stringify(requests);
57
62
  timeoutId = setTimeout(function () {
58
63
  controller_1.abort();
59
64
  }, this.timeout);
@@ -68,6 +73,52 @@ var RPC = /** @class */ (function () {
68
73
  clearTimeout(timeoutId);
69
74
  if (!res.ok) return [3 /*break*/, 3];
70
75
  return [4 /*yield*/, res.text()];
76
+ case 2:
77
+ jsonString = _a.sent();
78
+ items_1 = [];
79
+ data = (0, parse_json_1.parseJSON)(jsonString);
80
+ data.forEach(function (item) {
81
+ if (item.error) {
82
+ items_1.push(new Error(item.error.message));
83
+ }
84
+ else {
85
+ items_1.push(item.result);
86
+ }
87
+ });
88
+ return [2 /*return*/, Promise.resolve(items_1)];
89
+ case 3: return [2 /*return*/, Promise.reject(new Error("".concat(res.status, " - ").concat(res.statusText)))];
90
+ case 4: return [3 /*break*/, 6];
91
+ case 5:
92
+ err_1 = _a.sent();
93
+ return [2 /*return*/, Promise.reject(err_1)];
94
+ case 6: return [2 /*return*/];
95
+ }
96
+ });
97
+ });
98
+ };
99
+ HttpRPC.prototype.request = function (method, params) {
100
+ return __awaiter(this, void 0, void 0, function () {
101
+ var controller_2, body, timeoutId, res, jsonString, data, err_2;
102
+ return __generator(this, function (_a) {
103
+ switch (_a.label) {
104
+ case 0:
105
+ _a.trys.push([0, 5, , 6]);
106
+ controller_2 = new AbortController();
107
+ body = JSON.stringify({ id: 1, jsonrpc: '2.0', method: method, params: params });
108
+ timeoutId = setTimeout(function () {
109
+ controller_2.abort();
110
+ }, this.timeout);
111
+ return [4 /*yield*/, fetch(this.endpoint, {
112
+ headers: this.headers,
113
+ method: "POST",
114
+ body: body,
115
+ signal: controller_2.signal
116
+ })];
117
+ case 1:
118
+ res = _a.sent();
119
+ clearTimeout(timeoutId);
120
+ if (!res.ok) return [3 /*break*/, 3];
121
+ return [4 /*yield*/, res.text()];
71
122
  case 2:
72
123
  jsonString = _a.sent();
73
124
  data = (0, parse_json_1.parseJSON)(jsonString);
@@ -78,13 +129,13 @@ var RPC = /** @class */ (function () {
78
129
  case 3: return [2 /*return*/, Promise.reject(new Error("".concat(res.status, " - ").concat(res.statusText)))];
79
130
  case 4: return [3 /*break*/, 6];
80
131
  case 5:
81
- err_1 = _a.sent();
82
- return [2 /*return*/, Promise.reject(err_1)];
132
+ err_2 = _a.sent();
133
+ return [2 /*return*/, Promise.reject(err_2)];
83
134
  case 6: return [2 /*return*/];
84
135
  }
85
136
  });
86
137
  });
87
138
  };
88
- return RPC;
139
+ return HttpRPC;
89
140
  }());
90
- exports.RPC = RPC;
141
+ exports.HttpRPC = HttpRPC;
@@ -39,12 +39,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
39
39
  return (mod && mod.__esModule) ? mod : { "default": mod };
40
40
  };
41
41
  exports.__esModule = true;
42
- exports.WS = void 0;
42
+ exports.WSRPC = void 0;
43
43
  var isomorphic_ws_1 = __importDefault(require("isomorphic-ws"));
44
44
  var await_to_js_1 = require("await-to-js");
45
45
  var parse_json_1 = require("./parse_json/parse_json");
46
- var WS = /** @class */ (function () {
47
- function WS(options) {
46
+ var WSRPC = /** @class */ (function () {
47
+ function WSRPC(options) {
48
48
  this.connectionTries = 0;
49
49
  this.methodIdIncrement = 0;
50
50
  this.endpoint = "";
@@ -55,7 +55,7 @@ var WS = /** @class */ (function () {
55
55
  this.reconnectOnConnectionLoss = true;
56
56
  this.options = options;
57
57
  }
58
- WS.prototype.connect = function (endpoint) {
58
+ WSRPC.prototype.connect = function (endpoint) {
59
59
  var _this = this;
60
60
  // force disconnect if already connected
61
61
  if (this.socket && this.socket.readyState === isomorphic_ws_1["default"].OPEN) {
@@ -83,7 +83,7 @@ var WS = /** @class */ (function () {
83
83
  });
84
84
  });
85
85
  };
86
- WS.prototype.tryReconnect = function () {
86
+ WSRPC.prototype.tryReconnect = function () {
87
87
  var _this = this;
88
88
  this.connectionTries++;
89
89
  if (this.connectionTries > this.maxConnectionTries) {
@@ -97,12 +97,12 @@ var WS = /** @class */ (function () {
97
97
  _this.tryReconnect();
98
98
  });
99
99
  };
100
- WS.prototype.close = function () {
100
+ WSRPC.prototype.close = function () {
101
101
  if (!this.socket)
102
102
  return;
103
103
  this.socket.close();
104
104
  };
105
- WS.prototype.clearEvent = function (event) {
105
+ WSRPC.prototype.clearEvent = function (event) {
106
106
  var _this = this;
107
107
  var eventData = this.events.get(event);
108
108
  if (eventData) {
@@ -112,14 +112,14 @@ var WS = /** @class */ (function () {
112
112
  this.events["delete"](event);
113
113
  }
114
114
  };
115
- WS.prototype.closeAllListens = function (event) {
115
+ WSRPC.prototype.closeAllListens = function (event) {
116
116
  return __awaiter(this, void 0, void 0, function () {
117
117
  var _a, err, _;
118
118
  return __generator(this, function (_b) {
119
119
  switch (_b.label) {
120
120
  case 0:
121
121
  if (!this.events.has(event)) return [3 /*break*/, 2];
122
- return [4 /*yield*/, (0, await_to_js_1.to)(this.call("unsubscribe", { notify: event }))];
122
+ return [4 /*yield*/, (0, await_to_js_1.to)(this.dataCall("unsubscribe", { notify: event }))];
123
123
  case 1:
124
124
  _a = _b.sent(), err = _a[0], _ = _a[1];
125
125
  if (err)
@@ -131,31 +131,29 @@ var WS = /** @class */ (function () {
131
131
  });
132
132
  });
133
133
  };
134
- WS.prototype.listenEvent = function (event, onData) {
134
+ WSRPC.prototype.listenEvent = function (event, onData) {
135
135
  return __awaiter(this, void 0, void 0, function () {
136
- var onMessage, eventData, _a, err, res, closeListen;
136
+ var onMessage, eventData, idRefObject, _a, err, _, closeListen;
137
137
  var _this = this;
138
138
  return __generator(this, function (_b) {
139
139
  switch (_b.label) {
140
140
  case 0:
141
141
  onMessage = function (msgEvent) {
142
142
  var eventData = _this.events.get(event);
143
- if (eventData) {
144
- if (typeof msgEvent.data === "string") {
145
- try {
146
- var data = (0, parse_json_1.parseJSON)(msgEvent.data);
147
- if (data.id === eventData.id) {
148
- if (data.error) {
149
- onData(msgEvent, undefined, new Error(data.error.message));
150
- }
151
- else {
152
- onData(msgEvent, data.result, undefined);
153
- }
143
+ if (eventData && typeof msgEvent.data === "string") {
144
+ try {
145
+ var data = (0, parse_json_1.parseJSON)(msgEvent.data);
146
+ if (data.id === eventData.id) {
147
+ if (data.error) {
148
+ onData(msgEvent, undefined, new Error(data.error.message));
149
+ }
150
+ else {
151
+ onData(msgEvent, data.result, undefined);
154
152
  }
155
153
  }
156
- catch (_a) {
157
- // can't parse json -- do nothing
158
- }
154
+ }
155
+ catch (_a) {
156
+ // can't parse json -- do nothing
159
157
  }
160
158
  }
161
159
  };
@@ -168,14 +166,16 @@ var WS = /** @class */ (function () {
168
166
  }
169
167
  eventData.listeners.push(onMessage);
170
168
  return [3 /*break*/, 3];
171
- case 1: return [4 /*yield*/, (0, await_to_js_1.to)(this.call("subscribe", { notify: event }))];
169
+ case 1:
170
+ idRefObject = {};
171
+ return [4 /*yield*/, (0, await_to_js_1.to)(this.dataCall("subscribe", { notify: event }, idRefObject))];
172
172
  case 2:
173
- _a = _b.sent(), err = _a[0], res = _a[1];
173
+ _a = _b.sent(), err = _a[0], _ = _a[1];
174
174
  if (err) {
175
175
  this.clearEvent(event);
176
176
  return [2 /*return*/, Promise.reject(err)];
177
177
  }
178
- this.events.set(event, { listeners: [onMessage], id: res.id });
178
+ this.events.set(event, { listeners: [onMessage], id: idRefObject.id });
179
179
  _b.label = 3;
180
180
  case 3:
181
181
  this.socket && this.socket.addEventListener("message", onMessage);
@@ -195,7 +195,7 @@ var WS = /** @class */ (function () {
195
195
  // we use a grace period to unsubscribe (mostly because of react useEffect and avoid unecessary subscribe)
196
196
  eventData.unsubscribeTimeoutId = setTimeout(function () { return __awaiter(_this, void 0, void 0, function () {
197
197
  return __generator(this, function (_a) {
198
- this.call("unsubscribe", { notify: event });
198
+ this.dataCall("unsubscribe", { notify: event });
199
199
  this.events["delete"](event);
200
200
  return [2 /*return*/];
201
201
  });
@@ -215,70 +215,109 @@ var WS = /** @class */ (function () {
215
215
  });
216
216
  });
217
217
  };
218
- WS.prototype.call = function (method, params, overwriteData) {
218
+ WSRPC.prototype.batchCall = function (requests) {
219
+ var _this = this;
220
+ return new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
221
+ var id, data, _a, err, res, items;
222
+ return __generator(this, function (_b) {
223
+ switch (_b.label) {
224
+ case 0:
225
+ id = this.methodIdIncrement++;
226
+ requests.forEach(function (request) {
227
+ request.id = id;
228
+ request.jsonrpc = "2.0";
229
+ });
230
+ data = JSON.stringify(requests);
231
+ return [4 /*yield*/, (0, await_to_js_1.to)(this.rawCall(id, data))];
232
+ case 1:
233
+ _a = _b.sent(), err = _a[0], res = _a[1];
234
+ if (err)
235
+ return [2 /*return*/, reject(err)];
236
+ items = [];
237
+ res.forEach(function (v) {
238
+ if (v.error) {
239
+ items.push(new Error(v.error.message));
240
+ }
241
+ else {
242
+ items.push(v.result);
243
+ }
244
+ });
245
+ return [2 /*return*/, resolve(items)];
246
+ }
247
+ });
248
+ }); });
249
+ };
250
+ WSRPC.prototype.rawCall = function (id, body) {
219
251
  var _this = this;
220
252
  return new Promise(function (resolve, reject) {
221
253
  if (!_this.socket)
222
254
  return reject(new Error("Socket is not initialized."));
223
255
  if (_this.socket.readyState !== isomorphic_ws_1["default"].OPEN)
224
256
  return reject(new Error("Can't send msg. Socket is not opened."));
225
- var requestMethod = _this.createRequestMethod(method, params);
226
- // for XSWD we want to send the application data without request method wrapping
227
- if (overwriteData) {
228
- requestMethod.id = null;
229
- requestMethod.data = overwriteData;
230
- }
231
257
  var timeoutId = null;
232
258
  var onMessage = function (msgEvent) {
233
259
  if (typeof msgEvent.data === "string") {
234
260
  var data = (0, parse_json_1.parseJSON)(msgEvent.data);
235
- if (data.id === requestMethod.id) {
261
+ var valid = false;
262
+ if (Array.isArray(data) && data.length > 0 && data[0].id === id) {
263
+ //@ts-ignore
264
+ resolve(data);
265
+ valid = true;
266
+ }
267
+ else if (data.id === id) {
268
+ resolve(data);
269
+ valid = true;
270
+ }
271
+ else if (data.id === null && id === 0) {
272
+ // special case with xswd sending first call will return null id
273
+ resolve(data);
274
+ valid = true;
275
+ }
276
+ if (valid) {
236
277
  clearTimeout(timeoutId);
237
278
  _this.socket && _this.socket.removeEventListener("message", onMessage);
238
- if (data.error)
239
- return reject(new Error(data.error.message));
240
- else
241
- resolve(data);
242
279
  }
243
280
  }
244
281
  };
245
- // make sure you listen before sending data
246
- _this.socket && _this.socket.addEventListener("message", onMessage); // we don't use { once: true } option because of timeout feature
282
+ _this.socket.addEventListener("message", onMessage);
247
283
  if (_this.timeout > 0) {
248
284
  timeoutId = setTimeout(function () {
249
285
  _this.socket && _this.socket.removeEventListener("message", onMessage);
250
286
  reject(new Error("timeout"));
251
287
  }, _this.timeout);
252
288
  }
253
- if (_this.socket && _this.socket.readyState === isomorphic_ws_1["default"].OPEN) {
254
- _this.socket.send(requestMethod.data);
289
+ if (_this.socket.readyState === isomorphic_ws_1["default"].OPEN) {
290
+ _this.socket.send(body);
255
291
  }
256
292
  });
257
293
  };
258
- WS.prototype.dataCall = function (method, params) {
294
+ WSRPC.prototype.dataCall = function (method, params, idRefObj) {
259
295
  var _this = this;
260
296
  return new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
261
- var _a, err, res;
297
+ var id, request, data, _a, err, res;
262
298
  return __generator(this, function (_b) {
263
299
  switch (_b.label) {
264
- case 0: return [4 /*yield*/, (0, await_to_js_1.to)(this.call(method, params))];
300
+ case 0:
301
+ id = this.methodIdIncrement++;
302
+ if (idRefObj)
303
+ idRefObj.id = id;
304
+ request = { id: id, jsonrpc: "2.0", method: method };
305
+ if (params)
306
+ request.params = params;
307
+ data = JSON.stringify(request);
308
+ return [4 /*yield*/, (0, await_to_js_1.to)(this.rawCall(id, data))];
265
309
  case 1:
266
310
  _a = _b.sent(), err = _a[0], res = _a[1];
267
311
  if (err)
268
312
  return [2 /*return*/, reject(err)];
313
+ if (res.error) {
314
+ return [2 /*return*/, reject(res.error.message)];
315
+ }
269
316
  return [2 /*return*/, resolve(res.result)];
270
317
  }
271
318
  });
272
319
  }); });
273
320
  };
274
- WS.prototype.createRequestMethod = function (method, params) {
275
- var id = this.methodIdIncrement++;
276
- var request = { id: id, jsonrpc: "2.0", method: method };
277
- if (params)
278
- request.params = params;
279
- var data = JSON.stringify(request);
280
- return { data: data, id: id };
281
- };
282
- return WS;
321
+ return WSRPC;
283
322
  }());
284
- exports.WS = WS;
323
+ exports.WSRPC = WSRPC;
@@ -18,7 +18,7 @@ exports.__esModule = true;
18
18
  exports.RPC = void 0;
19
19
  var js_base64_1 = require("js-base64");
20
20
  var types_1 = require("./types");
21
- var rpc_1 = require("../lib/rpc");
21
+ var http_1 = require("../rpc/http");
22
22
  var RPC = /** @class */ (function (_super) {
23
23
  __extends(RPC, _super);
24
24
  function RPC(endpoint, username, password) {
@@ -143,6 +143,6 @@ var RPC = /** @class */ (function (_super) {
143
143
  return this.request(types_1.RPCMethod.QueryDB, params);
144
144
  };
145
145
  return RPC;
146
- }(rpc_1.RPC));
146
+ }(http_1.HttpRPC));
147
147
  exports.RPC = RPC;
148
148
  exports["default"] = RPC;
@@ -16,7 +16,7 @@ var __extends = (this && this.__extends) || (function () {
16
16
  })();
17
17
  exports.__esModule = true;
18
18
  exports.WS = exports.WalletMethods = void 0;
19
- var websocket_1 = require("../lib/websocket");
19
+ var websocket_1 = require("../rpc/websocket");
20
20
  var types_1 = require("./types");
21
21
  var WalletMethods = /** @class */ (function () {
22
22
  function WalletMethods(ws, prefix) {
@@ -177,6 +177,6 @@ var WS = /** @class */ (function (_super) {
177
177
  return _this;
178
178
  }
179
179
  return WS;
180
- }(websocket_1.WS));
180
+ }(websocket_1.WSRPC));
181
181
  exports.WS = WS;
182
182
  exports["default"] = WS;
@@ -16,7 +16,7 @@ var __extends = (this && this.__extends) || (function () {
16
16
  })();
17
17
  exports.__esModule = true;
18
18
  exports.WS = void 0;
19
- var websocket_1 = require("../lib/websocket");
19
+ var websocket_1 = require("../rpc/websocket");
20
20
  var websocket_2 = require("../daemon/websocket");
21
21
  var websocket_3 = require("../wallet/websocket");
22
22
  var WS = /** @class */ (function (_super) {
@@ -30,9 +30,9 @@ var WS = /** @class */ (function (_super) {
30
30
  }
31
31
  WS.prototype.authorize = function (app) {
32
32
  var data = JSON.stringify(app);
33
- return this.call("", {}, data);
33
+ return this.rawCall(0, data);
34
34
  };
35
35
  return WS;
36
- }(websocket_1.WS));
36
+ }(websocket_1.WSRPC));
37
37
  exports.WS = WS;
38
38
  exports["default"] = WS;
@@ -14,7 +14,7 @@ var __extends = (this && this.__extends) || (function () {
14
14
  };
15
15
  })();
16
16
  import { RPCMethod } from './types.js';
17
- import { RPC as BaseRPC } from '../lib/rpc.js';
17
+ import { HttpRPC } from '../rpc/http.js';
18
18
  var RPC = /** @class */ (function (_super) {
19
19
  __extends(RPC, _super);
20
20
  function RPC() {
@@ -216,6 +216,6 @@ var RPC = /** @class */ (function (_super) {
216
216
  return this.request(RPCMethod.SubmitBlock, params);
217
217
  };
218
218
  return RPC;
219
- }(BaseRPC));
219
+ }(HttpRPC));
220
220
  export { RPC };
221
221
  export default RPC;
@@ -14,7 +14,7 @@ var __extends = (this && this.__extends) || (function () {
14
14
  };
15
15
  })();
16
16
  import { RPCMethod, RPCEvent } from './types.js';
17
- import { WS as BaseWS } from '../lib/websocket.js';
17
+ import { WSRPC } from '../rpc/websocket.js';
18
18
  var DaemonMethods = /** @class */ (function () {
19
19
  function DaemonMethods(ws, prefix) {
20
20
  if (prefix === void 0) { prefix = ""; }
@@ -282,6 +282,6 @@ var WS = /** @class */ (function (_super) {
282
282
  return _this;
283
283
  }
284
284
  return WS;
285
- }(BaseWS));
285
+ }(WSRPC));
286
286
  export { WS };
287
287
  export default WS;
@@ -35,22 +35,27 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
35
35
  }
36
36
  };
37
37
  import { parseJSON } from './parse_json/parse_json.js';
38
- var RPC = /** @class */ (function () {
39
- function RPC(endpoint) {
38
+ var HttpRPC = /** @class */ (function () {
39
+ function HttpRPC(endpoint) {
40
40
  this.endpoint = endpoint;
41
41
  this.timeout = 3000;
42
42
  this.headers = new Headers();
43
43
  this.headers.set("Content-Type", "application/json");
44
44
  }
45
- RPC.prototype.request = function (method, params) {
45
+ HttpRPC.prototype.batchRequest = function (requests) {
46
46
  return __awaiter(this, void 0, void 0, function () {
47
- var controller_1, body, timeoutId, res, jsonString, data, err_1;
47
+ var controller_1, id_1, body, timeoutId, res, jsonString, items_1, data, err_1;
48
48
  return __generator(this, function (_a) {
49
49
  switch (_a.label) {
50
50
  case 0:
51
51
  _a.trys.push([0, 5, , 6]);
52
52
  controller_1 = new AbortController();
53
- body = JSON.stringify({ id: 1, jsonrpc: '2.0', method: method, params: params });
53
+ id_1 = 0;
54
+ requests.forEach(function (request) {
55
+ request.id = ++id_1;
56
+ request.jsonrpc = "2.0";
57
+ });
58
+ body = JSON.stringify(requests);
54
59
  timeoutId = setTimeout(function () {
55
60
  controller_1.abort();
56
61
  }, this.timeout);
@@ -65,6 +70,52 @@ var RPC = /** @class */ (function () {
65
70
  clearTimeout(timeoutId);
66
71
  if (!res.ok) return [3 /*break*/, 3];
67
72
  return [4 /*yield*/, res.text()];
73
+ case 2:
74
+ jsonString = _a.sent();
75
+ items_1 = [];
76
+ data = parseJSON(jsonString);
77
+ data.forEach(function (item) {
78
+ if (item.error) {
79
+ items_1.push(new Error(item.error.message));
80
+ }
81
+ else {
82
+ items_1.push(item.result);
83
+ }
84
+ });
85
+ return [2 /*return*/, Promise.resolve(items_1)];
86
+ case 3: return [2 /*return*/, Promise.reject(new Error("".concat(res.status, " - ").concat(res.statusText)))];
87
+ case 4: return [3 /*break*/, 6];
88
+ case 5:
89
+ err_1 = _a.sent();
90
+ return [2 /*return*/, Promise.reject(err_1)];
91
+ case 6: return [2 /*return*/];
92
+ }
93
+ });
94
+ });
95
+ };
96
+ HttpRPC.prototype.request = function (method, params) {
97
+ return __awaiter(this, void 0, void 0, function () {
98
+ var controller_2, body, timeoutId, res, jsonString, data, err_2;
99
+ return __generator(this, function (_a) {
100
+ switch (_a.label) {
101
+ case 0:
102
+ _a.trys.push([0, 5, , 6]);
103
+ controller_2 = new AbortController();
104
+ body = JSON.stringify({ id: 1, jsonrpc: '2.0', method: method, params: params });
105
+ timeoutId = setTimeout(function () {
106
+ controller_2.abort();
107
+ }, this.timeout);
108
+ return [4 /*yield*/, fetch(this.endpoint, {
109
+ headers: this.headers,
110
+ method: "POST",
111
+ body: body,
112
+ signal: controller_2.signal
113
+ })];
114
+ case 1:
115
+ res = _a.sent();
116
+ clearTimeout(timeoutId);
117
+ if (!res.ok) return [3 /*break*/, 3];
118
+ return [4 /*yield*/, res.text()];
68
119
  case 2:
69
120
  jsonString = _a.sent();
70
121
  data = parseJSON(jsonString);
@@ -75,13 +126,13 @@ var RPC = /** @class */ (function () {
75
126
  case 3: return [2 /*return*/, Promise.reject(new Error("".concat(res.status, " - ").concat(res.statusText)))];
76
127
  case 4: return [3 /*break*/, 6];
77
128
  case 5:
78
- err_1 = _a.sent();
79
- return [2 /*return*/, Promise.reject(err_1)];
129
+ err_2 = _a.sent();
130
+ return [2 /*return*/, Promise.reject(err_2)];
80
131
  case 6: return [2 /*return*/];
81
132
  }
82
133
  });
83
134
  });
84
135
  };
85
- return RPC;
136
+ return HttpRPC;
86
137
  }());
87
- export { RPC };
138
+ export { HttpRPC };
@@ -37,8 +37,8 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
37
37
  import WebSocket from 'isomorphic-ws';
38
38
  import { to } from 'await-to-js';
39
39
  import { parseJSON } from './parse_json/parse_json.js';
40
- var WS = /** @class */ (function () {
41
- function WS(options) {
40
+ var WSRPC = /** @class */ (function () {
41
+ function WSRPC(options) {
42
42
  this.connectionTries = 0;
43
43
  this.methodIdIncrement = 0;
44
44
  this.endpoint = "";
@@ -49,7 +49,7 @@ var WS = /** @class */ (function () {
49
49
  this.reconnectOnConnectionLoss = true;
50
50
  this.options = options;
51
51
  }
52
- WS.prototype.connect = function (endpoint) {
52
+ WSRPC.prototype.connect = function (endpoint) {
53
53
  var _this = this;
54
54
  // force disconnect if already connected
55
55
  if (this.socket && this.socket.readyState === WebSocket.OPEN) {
@@ -77,7 +77,7 @@ var WS = /** @class */ (function () {
77
77
  });
78
78
  });
79
79
  };
80
- WS.prototype.tryReconnect = function () {
80
+ WSRPC.prototype.tryReconnect = function () {
81
81
  var _this = this;
82
82
  this.connectionTries++;
83
83
  if (this.connectionTries > this.maxConnectionTries) {
@@ -91,12 +91,12 @@ var WS = /** @class */ (function () {
91
91
  _this.tryReconnect();
92
92
  });
93
93
  };
94
- WS.prototype.close = function () {
94
+ WSRPC.prototype.close = function () {
95
95
  if (!this.socket)
96
96
  return;
97
97
  this.socket.close();
98
98
  };
99
- WS.prototype.clearEvent = function (event) {
99
+ WSRPC.prototype.clearEvent = function (event) {
100
100
  var _this = this;
101
101
  var eventData = this.events.get(event);
102
102
  if (eventData) {
@@ -106,14 +106,14 @@ var WS = /** @class */ (function () {
106
106
  this.events["delete"](event);
107
107
  }
108
108
  };
109
- WS.prototype.closeAllListens = function (event) {
109
+ WSRPC.prototype.closeAllListens = function (event) {
110
110
  return __awaiter(this, void 0, void 0, function () {
111
111
  var _a, err, _;
112
112
  return __generator(this, function (_b) {
113
113
  switch (_b.label) {
114
114
  case 0:
115
115
  if (!this.events.has(event)) return [3 /*break*/, 2];
116
- return [4 /*yield*/, to(this.call("unsubscribe", { notify: event }))];
116
+ return [4 /*yield*/, to(this.dataCall("unsubscribe", { notify: event }))];
117
117
  case 1:
118
118
  _a = _b.sent(), err = _a[0], _ = _a[1];
119
119
  if (err)
@@ -125,31 +125,29 @@ var WS = /** @class */ (function () {
125
125
  });
126
126
  });
127
127
  };
128
- WS.prototype.listenEvent = function (event, onData) {
128
+ WSRPC.prototype.listenEvent = function (event, onData) {
129
129
  return __awaiter(this, void 0, void 0, function () {
130
- var onMessage, eventData, _a, err, res, closeListen;
130
+ var onMessage, eventData, idRefObject, _a, err, _, closeListen;
131
131
  var _this = this;
132
132
  return __generator(this, function (_b) {
133
133
  switch (_b.label) {
134
134
  case 0:
135
135
  onMessage = function (msgEvent) {
136
136
  var eventData = _this.events.get(event);
137
- if (eventData) {
138
- if (typeof msgEvent.data === "string") {
139
- try {
140
- var data = parseJSON(msgEvent.data);
141
- if (data.id === eventData.id) {
142
- if (data.error) {
143
- onData(msgEvent, undefined, new Error(data.error.message));
144
- }
145
- else {
146
- onData(msgEvent, data.result, undefined);
147
- }
137
+ if (eventData && typeof msgEvent.data === "string") {
138
+ try {
139
+ var data = parseJSON(msgEvent.data);
140
+ if (data.id === eventData.id) {
141
+ if (data.error) {
142
+ onData(msgEvent, undefined, new Error(data.error.message));
143
+ }
144
+ else {
145
+ onData(msgEvent, data.result, undefined);
148
146
  }
149
147
  }
150
- catch (_a) {
151
- // can't parse json -- do nothing
152
- }
148
+ }
149
+ catch (_a) {
150
+ // can't parse json -- do nothing
153
151
  }
154
152
  }
155
153
  };
@@ -162,14 +160,16 @@ var WS = /** @class */ (function () {
162
160
  }
163
161
  eventData.listeners.push(onMessage);
164
162
  return [3 /*break*/, 3];
165
- case 1: return [4 /*yield*/, to(this.call("subscribe", { notify: event }))];
163
+ case 1:
164
+ idRefObject = {};
165
+ return [4 /*yield*/, to(this.dataCall("subscribe", { notify: event }, idRefObject))];
166
166
  case 2:
167
- _a = _b.sent(), err = _a[0], res = _a[1];
167
+ _a = _b.sent(), err = _a[0], _ = _a[1];
168
168
  if (err) {
169
169
  this.clearEvent(event);
170
170
  return [2 /*return*/, Promise.reject(err)];
171
171
  }
172
- this.events.set(event, { listeners: [onMessage], id: res.id });
172
+ this.events.set(event, { listeners: [onMessage], id: idRefObject.id });
173
173
  _b.label = 3;
174
174
  case 3:
175
175
  this.socket && this.socket.addEventListener("message", onMessage);
@@ -189,7 +189,7 @@ var WS = /** @class */ (function () {
189
189
  // we use a grace period to unsubscribe (mostly because of react useEffect and avoid unecessary subscribe)
190
190
  eventData.unsubscribeTimeoutId = setTimeout(function () { return __awaiter(_this, void 0, void 0, function () {
191
191
  return __generator(this, function (_a) {
192
- this.call("unsubscribe", { notify: event });
192
+ this.dataCall("unsubscribe", { notify: event });
193
193
  this.events["delete"](event);
194
194
  return [2 /*return*/];
195
195
  });
@@ -209,70 +209,109 @@ var WS = /** @class */ (function () {
209
209
  });
210
210
  });
211
211
  };
212
- WS.prototype.call = function (method, params, overwriteData) {
212
+ WSRPC.prototype.batchCall = function (requests) {
213
+ var _this = this;
214
+ return new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
215
+ var id, data, _a, err, res, items;
216
+ return __generator(this, function (_b) {
217
+ switch (_b.label) {
218
+ case 0:
219
+ id = this.methodIdIncrement++;
220
+ requests.forEach(function (request) {
221
+ request.id = id;
222
+ request.jsonrpc = "2.0";
223
+ });
224
+ data = JSON.stringify(requests);
225
+ return [4 /*yield*/, to(this.rawCall(id, data))];
226
+ case 1:
227
+ _a = _b.sent(), err = _a[0], res = _a[1];
228
+ if (err)
229
+ return [2 /*return*/, reject(err)];
230
+ items = [];
231
+ res.forEach(function (v) {
232
+ if (v.error) {
233
+ items.push(new Error(v.error.message));
234
+ }
235
+ else {
236
+ items.push(v.result);
237
+ }
238
+ });
239
+ return [2 /*return*/, resolve(items)];
240
+ }
241
+ });
242
+ }); });
243
+ };
244
+ WSRPC.prototype.rawCall = function (id, body) {
213
245
  var _this = this;
214
246
  return new Promise(function (resolve, reject) {
215
247
  if (!_this.socket)
216
248
  return reject(new Error("Socket is not initialized."));
217
249
  if (_this.socket.readyState !== WebSocket.OPEN)
218
250
  return reject(new Error("Can't send msg. Socket is not opened."));
219
- var requestMethod = _this.createRequestMethod(method, params);
220
- // for XSWD we want to send the application data without request method wrapping
221
- if (overwriteData) {
222
- requestMethod.id = null;
223
- requestMethod.data = overwriteData;
224
- }
225
251
  var timeoutId = null;
226
252
  var onMessage = function (msgEvent) {
227
253
  if (typeof msgEvent.data === "string") {
228
254
  var data = parseJSON(msgEvent.data);
229
- if (data.id === requestMethod.id) {
255
+ var valid = false;
256
+ if (Array.isArray(data) && data.length > 0 && data[0].id === id) {
257
+ //@ts-ignore
258
+ resolve(data);
259
+ valid = true;
260
+ }
261
+ else if (data.id === id) {
262
+ resolve(data);
263
+ valid = true;
264
+ }
265
+ else if (data.id === null && id === 0) {
266
+ // special case with xswd sending first call will return null id
267
+ resolve(data);
268
+ valid = true;
269
+ }
270
+ if (valid) {
230
271
  clearTimeout(timeoutId);
231
272
  _this.socket && _this.socket.removeEventListener("message", onMessage);
232
- if (data.error)
233
- return reject(new Error(data.error.message));
234
- else
235
- resolve(data);
236
273
  }
237
274
  }
238
275
  };
239
- // make sure you listen before sending data
240
- _this.socket && _this.socket.addEventListener("message", onMessage); // we don't use { once: true } option because of timeout feature
276
+ _this.socket.addEventListener("message", onMessage);
241
277
  if (_this.timeout > 0) {
242
278
  timeoutId = setTimeout(function () {
243
279
  _this.socket && _this.socket.removeEventListener("message", onMessage);
244
280
  reject(new Error("timeout"));
245
281
  }, _this.timeout);
246
282
  }
247
- if (_this.socket && _this.socket.readyState === WebSocket.OPEN) {
248
- _this.socket.send(requestMethod.data);
283
+ if (_this.socket.readyState === WebSocket.OPEN) {
284
+ _this.socket.send(body);
249
285
  }
250
286
  });
251
287
  };
252
- WS.prototype.dataCall = function (method, params) {
288
+ WSRPC.prototype.dataCall = function (method, params, idRefObj) {
253
289
  var _this = this;
254
290
  return new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
255
- var _a, err, res;
291
+ var id, request, data, _a, err, res;
256
292
  return __generator(this, function (_b) {
257
293
  switch (_b.label) {
258
- case 0: return [4 /*yield*/, to(this.call(method, params))];
294
+ case 0:
295
+ id = this.methodIdIncrement++;
296
+ if (idRefObj)
297
+ idRefObj.id = id;
298
+ request = { id: id, jsonrpc: "2.0", method: method };
299
+ if (params)
300
+ request.params = params;
301
+ data = JSON.stringify(request);
302
+ return [4 /*yield*/, to(this.rawCall(id, data))];
259
303
  case 1:
260
304
  _a = _b.sent(), err = _a[0], res = _a[1];
261
305
  if (err)
262
306
  return [2 /*return*/, reject(err)];
307
+ if (res.error) {
308
+ return [2 /*return*/, reject(res.error.message)];
309
+ }
263
310
  return [2 /*return*/, resolve(res.result)];
264
311
  }
265
312
  });
266
313
  }); });
267
314
  };
268
- WS.prototype.createRequestMethod = function (method, params) {
269
- var id = this.methodIdIncrement++;
270
- var request = { id: id, jsonrpc: "2.0", method: method };
271
- if (params)
272
- request.params = params;
273
- var data = JSON.stringify(request);
274
- return { data: data, id: id };
275
- };
276
- return WS;
315
+ return WSRPC;
277
316
  }());
278
- export { WS };
317
+ export { WSRPC };
@@ -15,7 +15,7 @@ var __extends = (this && this.__extends) || (function () {
15
15
  })();
16
16
  import { Base64 } from 'js-base64';
17
17
  import { RPCMethod } from './types.js';
18
- import { RPC as BaseRPC } from '../lib/rpc.js';
18
+ import { HttpRPC } from '../rpc/http.js';
19
19
  var RPC = /** @class */ (function (_super) {
20
20
  __extends(RPC, _super);
21
21
  function RPC(endpoint, username, password) {
@@ -140,6 +140,6 @@ var RPC = /** @class */ (function (_super) {
140
140
  return this.request(RPCMethod.QueryDB, params);
141
141
  };
142
142
  return RPC;
143
- }(BaseRPC));
143
+ }(HttpRPC));
144
144
  export { RPC };
145
145
  export default RPC;
@@ -13,7 +13,7 @@ var __extends = (this && this.__extends) || (function () {
13
13
  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
14
14
  };
15
15
  })();
16
- import { WS as BaseWS } from '../lib/websocket.js';
16
+ import { WSRPC } from '../rpc/websocket.js';
17
17
  import { RPCMethod, RPCEvent } from './types.js';
18
18
  var WalletMethods = /** @class */ (function () {
19
19
  function WalletMethods(ws, prefix) {
@@ -174,6 +174,6 @@ var WS = /** @class */ (function (_super) {
174
174
  return _this;
175
175
  }
176
176
  return WS;
177
- }(BaseWS));
177
+ }(WSRPC));
178
178
  export { WS };
179
179
  export default WS;
@@ -13,7 +13,7 @@ var __extends = (this && this.__extends) || (function () {
13
13
  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
14
14
  };
15
15
  })();
16
- import { WS as BaseWS } from '../lib/websocket.js';
16
+ import { WSRPC } from '../rpc/websocket.js';
17
17
  import { DaemonMethods } from '../daemon/websocket.js';
18
18
  import { WalletMethods } from '../wallet/websocket.js';
19
19
  var WS = /** @class */ (function (_super) {
@@ -27,9 +27,9 @@ var WS = /** @class */ (function (_super) {
27
27
  }
28
28
  WS.prototype.authorize = function (app) {
29
29
  var data = JSON.stringify(app);
30
- return this.call("", {}, data);
30
+ return this.rawCall(0, data);
31
31
  };
32
32
  return WS;
33
- }(BaseWS));
33
+ }(WSRPC));
34
34
  export { WS };
35
35
  export default WS;
@@ -1,6 +1,6 @@
1
1
  import * as types from './types';
2
- import { RPC as BaseRPC } from '../lib/rpc';
3
- export declare class RPC extends BaseRPC {
2
+ import { HttpRPC } from '../rpc/http';
3
+ export declare class RPC extends HttpRPC {
4
4
  getVersion(): Promise<string>;
5
5
  getHeight(): Promise<number>;
6
6
  getTopoheight(): Promise<number>;
@@ -1,10 +1,10 @@
1
1
  import { MessageEvent } from 'ws';
2
2
  import * as types from './types';
3
- import { WS as BaseWS } from '../lib/websocket';
3
+ import { WSRPC } from '../rpc/websocket';
4
4
  export declare class DaemonMethods {
5
- ws: BaseWS;
5
+ ws: WSRPC;
6
6
  prefix: string;
7
- constructor(ws: BaseWS, prefix?: string);
7
+ constructor(ws: WSRPC, prefix?: string);
8
8
  dataCall<T>(method: string, params?: any): Promise<T>;
9
9
  onNewBlock(onData: (msgEvent: MessageEvent, data?: types.Block & types.RPCEventResult, err?: Error) => void): Promise<() => Promise<void>>;
10
10
  onBlockOrdered(onData: (msgEvent: MessageEvent, data?: types.BlockOrdered & types.RPCEventResult, err?: Error) => void): Promise<() => Promise<void>>;
@@ -89,7 +89,7 @@ export declare class DaemonMethods {
89
89
  getMinerWork(params: types.GetMinerWorkParams): Promise<types.GetMinerWorkResult>;
90
90
  submitBlock(params: types.SubmitBlockParams): Promise<boolean>;
91
91
  }
92
- export declare class WS extends BaseWS {
92
+ export declare class WS extends WSRPC {
93
93
  methods: DaemonMethods;
94
94
  constructor();
95
95
  }
@@ -1,7 +1,9 @@
1
- export declare class RPC {
1
+ import { RPCRequest } from './types';
2
+ export declare class HttpRPC {
2
3
  endpoint: string;
3
4
  timeout: number;
4
5
  headers: Headers;
5
6
  constructor(endpoint: string);
7
+ batchRequest(requests: RPCRequest[]): Promise<any | Error[]>;
6
8
  request<T>(method: string, params?: any): Promise<T>;
7
9
  }
@@ -2,12 +2,15 @@
2
2
  import { ClientOptions, MessageEvent } from 'ws';
3
3
  import WebSocket from 'isomorphic-ws';
4
4
  import { ClientRequestArgs } from 'http';
5
- import { RPCResponse } from './types';
5
+ import { RPCRequest } from './types';
6
6
  export type EventWithParams = {
7
7
  [event: string]: {};
8
8
  };
9
9
  export type EventKey = string | EventWithParams;
10
- export declare class WS {
10
+ export type IdRefObj = {
11
+ id?: number;
12
+ };
13
+ export declare class WSRPC {
11
14
  endpoint: string;
12
15
  socket?: WebSocket;
13
16
  timeout: number;
@@ -25,10 +28,7 @@ export declare class WS {
25
28
  private clearEvent;
26
29
  closeAllListens(event: EventKey): Promise<void>;
27
30
  listenEvent<T>(event: EventKey, onData: (msgEvent: MessageEvent, data?: T, err?: Error) => void): Promise<() => Promise<void>>;
28
- call<T>(method: string, params?: any, overwriteData?: string): Promise<RPCResponse<T>>;
29
- dataCall<T>(method: string, params?: any): Promise<T>;
30
- createRequestMethod(method: string, params?: any): {
31
- data: string;
32
- id: number | null;
33
- };
31
+ batchCall(requests: RPCRequest[]): Promise<any[]>;
32
+ rawCall<T>(id: number, body: string): Promise<T>;
33
+ dataCall<T>(method: string, params?: any, idRefObj?: IdRefObj): Promise<T>;
34
34
  }
@@ -1,8 +1,8 @@
1
1
  import * as daemonTypes from '../daemon/types';
2
2
  import * as types from './types';
3
- import { RPC as BaseRPC } from '../lib/rpc';
3
+ import { HttpRPC } from '../rpc/http';
4
4
  import { Element } from '../data/element';
5
- export declare class RPC extends BaseRPC {
5
+ export declare class RPC extends HttpRPC {
6
6
  constructor(endpoint: string, username: string, password: string);
7
7
  getVersion(): Promise<string>;
8
8
  getNetwork(): Promise<string>;
@@ -1,13 +1,13 @@
1
- import { WS as BaseWS } from '../lib/websocket';
1
+ import { WSRPC } from '../rpc/websocket';
2
2
  import { MessageEvent } from 'ws';
3
3
  import { RPCEventResult } from '../daemon/types';
4
4
  import * as daemonTypes from '../daemon/types';
5
5
  import * as types from './types';
6
6
  import { Element } from '../data/element';
7
7
  export declare class WalletMethods {
8
- ws: BaseWS;
8
+ ws: WSRPC;
9
9
  prefix: string;
10
- constructor(ws: BaseWS, prefix?: string);
10
+ constructor(ws: WSRPC, prefix?: string);
11
11
  dataCall<T>(method: string, params?: any): Promise<T>;
12
12
  onNewTopoheight(onData: (msgEvent: MessageEvent, data?: types.NewTopoheightResult & RPCEventResult, err?: Error) => void): Promise<() => Promise<void>>;
13
13
  onNewAsset(onData: (msgEvent: MessageEvent, data?: daemonTypes.AssetWithData & RPCEventResult, err?: Error) => void): Promise<() => Promise<void>>;
@@ -58,7 +58,7 @@ export declare class WalletMethods {
58
58
  hasKey(params: types.HasKeyParams): Promise<boolean>;
59
59
  queryDB(params: types.QueryDBParams): Promise<types.QueryResult>;
60
60
  }
61
- export declare class WS extends BaseWS {
61
+ export declare class WS extends WSRPC {
62
62
  methods: WalletMethods;
63
63
  constructor(username: string, password: string);
64
64
  }
@@ -1,11 +1,11 @@
1
- import { WS as BaseWS } from '../lib/websocket';
1
+ import { WSRPC } from '../rpc/websocket';
2
2
  import { ApplicationData } from '../wallet/types';
3
3
  import { DaemonMethods } from '../daemon/websocket';
4
4
  import { WalletMethods } from '../wallet/websocket';
5
- export declare class WS extends BaseWS {
5
+ export declare class WS extends WSRPC {
6
6
  daemon: DaemonMethods;
7
7
  wallet: WalletMethods;
8
8
  constructor();
9
- authorize(app: ApplicationData): Promise<import("../lib/types").RPCResponse<unknown>>;
9
+ authorize(app: ApplicationData): Promise<unknown>;
10
10
  }
11
11
  export default WS;
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.10.0",
2
+ "version": "0.10.2",
3
3
  "name": "@xelis/sdk",
4
4
  "description": "Xelis software development kit for JS",
5
5
  "exports": {
File without changes
File without changes
File without changes
File without changes
File without changes