@xelis/sdk 0.7.0 → 0.8.1

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.
Files changed (58) hide show
  1. package/create_esm_pkg.js +13 -0
  2. package/dist/cjs/config.js +38 -0
  3. package/dist/cjs/daemon/rpc.js +143 -0
  4. package/dist/cjs/daemon/types.js +74 -0
  5. package/dist/cjs/daemon/websocket.js +236 -0
  6. package/dist/cjs/lib/rpc.js +89 -0
  7. package/dist/cjs/lib/types.js +2 -0
  8. package/dist/cjs/lib/websocket.js +283 -0
  9. package/dist/cjs/react/daemon.js +176 -0
  10. package/dist/cjs/wallet/rpc.js +131 -0
  11. package/dist/cjs/wallet/types.js +29 -0
  12. package/dist/cjs/wallet/websocket.js +92 -0
  13. package/dist/cjs/xswd/types.js +9 -0
  14. package/dist/cjs/xswd/websocket.js +38 -0
  15. package/dist/esm/config.js +35 -0
  16. package/dist/esm/daemon/rpc.js +140 -0
  17. package/dist/esm/daemon/websocket.js +233 -0
  18. package/dist/esm/lib/rpc.js +86 -0
  19. package/dist/esm/lib/websocket.js +277 -0
  20. package/dist/esm/package.json +1 -0
  21. package/dist/esm/react/daemon.js +144 -0
  22. package/dist/esm/wallet/rpc.js +128 -0
  23. package/dist/esm/wallet/websocket.js +89 -0
  24. package/dist/esm/xswd/websocket.js +35 -0
  25. package/dist/types/daemon/rpc.d.ts +43 -0
  26. package/{daemon → dist/types/daemon}/websocket.d.ts +2 -2
  27. package/{lib → dist/types/lib}/rpc.d.ts +1 -1
  28. package/{lib → dist/types/lib}/websocket.d.ts +1 -1
  29. package/{react → dist/types/react}/daemon.d.ts +2 -2
  30. package/{wallet → dist/types/wallet}/rpc.d.ts +4 -4
  31. package/{wallet → dist/types/wallet}/types.d.ts +1 -1
  32. package/{wallet → dist/types/wallet}/websocket.d.ts +3 -3
  33. package/dist/types/xswd/websocket.d.ts +11 -0
  34. package/jest.config.js +6 -0
  35. package/package.json +12 -3
  36. package/tsconfig.cjs.json +7 -0
  37. package/tsconfig.esm.json +7 -0
  38. package/tsconfig.json +17 -0
  39. package/tsconfig.types.json +8 -0
  40. package/config.js +0 -25
  41. package/daemon/rpc.d.ts +0 -43
  42. package/daemon/rpc.js +0 -119
  43. package/daemon/websocket.js +0 -171
  44. package/lib/rpc.js +0 -38
  45. package/lib/websocket.js +0 -202
  46. package/react/daemon.js +0 -82
  47. package/wallet/rpc.js +0 -67
  48. package/wallet/websocket.js +0 -66
  49. package/xswd/websocket.d.ts +0 -11
  50. package/xswd/websocket.js +0 -16
  51. /package/{daemon → dist/esm/daemon}/types.js +0 -0
  52. /package/{lib → dist/esm/lib}/types.js +0 -0
  53. /package/{wallet → dist/esm/wallet}/types.js +0 -0
  54. /package/{xswd → dist/esm/xswd}/types.js +0 -0
  55. /package/{config.d.ts → dist/types/config.d.ts} +0 -0
  56. /package/{daemon → dist/types/daemon}/types.d.ts +0 -0
  57. /package/{lib → dist/types/lib}/types.d.ts +0 -0
  58. /package/{xswd → dist/types/xswd}/types.d.ts +0 -0
package/lib/websocket.js DELETED
@@ -1,202 +0,0 @@
1
- import WebSocket from 'isomorphic-ws';
2
- import to from 'await-to-js';
3
- export class WS {
4
- constructor(options) {
5
- this.connectionTries = 0;
6
- this.methodIdIncrement = 0;
7
- this.endpoint = "";
8
- this.timeout = 15000; // default to 15s
9
- this.events = {};
10
- this.unsubscribeSuspense = 1000;
11
- this.maxConnectionTries = 3;
12
- this.reconnectOnConnectionLoss = true;
13
- this.options = options;
14
- }
15
- connect(endpoint) {
16
- // force disconnect if already connected
17
- if (this.socket && this.socket.readyState === WebSocket.OPEN) {
18
- this.socket.close();
19
- }
20
- this.events = {};
21
- this.connectionTries = 0;
22
- return new Promise((resolve, reject) => {
23
- this.socket = new WebSocket(endpoint, this.options);
24
- this.endpoint = endpoint;
25
- this.socket.addEventListener(`open`, (event) => {
26
- resolve(event);
27
- });
28
- this.socket.addEventListener(`close`, (event) => {
29
- if (this.reconnectOnConnectionLoss && !event.wasClean) {
30
- this.tryReconnect();
31
- reject(new Error(`Unhandled close. Reconnecting...`));
32
- }
33
- else {
34
- reject(event);
35
- }
36
- });
37
- this.socket.addEventListener(`error`, (err) => {
38
- reject(err);
39
- });
40
- });
41
- }
42
- tryReconnect() {
43
- this.connectionTries++;
44
- if (this.connectionTries > this.maxConnectionTries) {
45
- return;
46
- }
47
- this.socket = new WebSocket(this.endpoint, this.options);
48
- this.socket.addEventListener(`open`, () => {
49
- this.connectionTries = 0;
50
- });
51
- this.socket.addEventListener(`close`, (event) => {
52
- this.tryReconnect();
53
- });
54
- }
55
- close() {
56
- if (!this.socket)
57
- return;
58
- this.socket.close();
59
- }
60
- clearEvent(event) {
61
- this.events[event].listeners.forEach(listener => {
62
- this.socket && this.socket.removeEventListener(`message`, listener);
63
- });
64
- Reflect.deleteProperty(this.events, event);
65
- }
66
- async closeAllListens(event) {
67
- if (this.events[event]) {
68
- const [err, _] = await to(this.call(`unsubscribe`, { notify: event }));
69
- if (err)
70
- return Promise.reject(err);
71
- this.clearEvent(event);
72
- }
73
- return Promise.resolve();
74
- }
75
- async listenEvent(event, onData) {
76
- const onMessage = (msgEvent) => {
77
- if (this.events[event]) {
78
- const { id } = this.events[event];
79
- if (typeof msgEvent.data === `string`) {
80
- try {
81
- const data = JSON.parse(msgEvent.data);
82
- if (data.id === id) {
83
- if (data.error) {
84
- onData(msgEvent, undefined, new Error(data.error.message));
85
- }
86
- else {
87
- onData(msgEvent, data.result, undefined);
88
- }
89
- }
90
- }
91
- catch (_a) {
92
- // can't parse json -- do nothing
93
- }
94
- }
95
- }
96
- };
97
- if (this.events[event]) {
98
- const { unsubscribeTimeoutId } = this.events[event];
99
- if (unsubscribeTimeoutId) {
100
- // clear timeout to unsubscribe
101
- // because we got a new registered event and want to cancel the pending unsubscribe grace period
102
- clearTimeout(unsubscribeTimeoutId);
103
- }
104
- this.events[event].listeners.push(onMessage);
105
- }
106
- else {
107
- // important if multiple listenEvent are called without await at least we store listener before getting id
108
- this.events[event] = { listeners: [onMessage] };
109
- const [err, res] = await to(this.call(`subscribe`, { notify: event }));
110
- if (err) {
111
- this.clearEvent(event);
112
- return Promise.reject(err);
113
- }
114
- this.events[event].id = res.id;
115
- }
116
- this.socket && this.socket.addEventListener(`message`, onMessage);
117
- const closeListen = () => {
118
- const eventData = this.events[event];
119
- if (eventData) {
120
- const listeners = eventData.listeners;
121
- for (let i = 0; i < listeners.length; i++) {
122
- if (listeners[i] === onMessage) {
123
- listeners.splice(i, 1);
124
- break;
125
- }
126
- }
127
- // no more listener so we unsubscribe from daemon websocket if socket still open
128
- if (listeners.length === 0) {
129
- if (this.socket && this.socket.readyState === WebSocket.OPEN) {
130
- // we use a grace period to unsubscribe (mostly because of react useEffect and avoid unecessary subscribe)
131
- this.events[event].unsubscribeTimeoutId = setTimeout(async () => {
132
- this.call(`unsubscribe`, { notify: event });
133
- Reflect.deleteProperty(this.events, event);
134
- }, this.unsubscribeSuspense);
135
- }
136
- else {
137
- // socket is closed so we don't send unsubscribe and no grace period delete right away
138
- Reflect.deleteProperty(this.events, event);
139
- }
140
- }
141
- }
142
- this.socket && this.socket.removeEventListener(`message`, onMessage);
143
- return Promise.resolve();
144
- };
145
- return Promise.resolve(closeListen);
146
- }
147
- call(method, params, overwriteData) {
148
- return new Promise((resolve, reject) => {
149
- if (!this.socket)
150
- return reject(new Error(`Socket is not initialized.`));
151
- if (this.socket.readyState !== WebSocket.OPEN)
152
- return reject(new Error(`Can't send msg. Socket is not opened.`));
153
- let requestMethod = this.createRequestMethod(method, params);
154
- // for XSWD we want to send the application data without request method wrapping
155
- if (overwriteData) {
156
- requestMethod.id = null;
157
- requestMethod.data = overwriteData;
158
- }
159
- let timeoutId = null;
160
- const onMessage = (msgEvent) => {
161
- if (typeof msgEvent.data === `string`) {
162
- const data = JSON.parse(msgEvent.data);
163
- if (data.id === requestMethod.id) {
164
- clearTimeout(timeoutId);
165
- this.socket && this.socket.removeEventListener(`message`, onMessage);
166
- if (data.error)
167
- return reject(new Error(data.error.message));
168
- else
169
- resolve(data);
170
- }
171
- }
172
- };
173
- // make sure you listen before sending data
174
- this.socket && this.socket.addEventListener(`message`, onMessage); // we don't use { once: true } option because of timeout feature
175
- if (this.timeout > 0) {
176
- timeoutId = setTimeout(() => {
177
- this.socket && this.socket.removeEventListener(`message`, onMessage);
178
- reject(new Error(`timeout`));
179
- }, this.timeout);
180
- }
181
- if (this.socket && this.socket.readyState === WebSocket.OPEN) {
182
- this.socket.send(requestMethod.data);
183
- }
184
- });
185
- }
186
- dataCall(method, params) {
187
- return new Promise(async (resolve, reject) => {
188
- const [err, res] = await to(this.call(method, params));
189
- if (err)
190
- return reject(err);
191
- return resolve(res.result);
192
- });
193
- }
194
- createRequestMethod(method, params) {
195
- const id = this.methodIdIncrement++;
196
- const request = { id: id, jsonrpc: `2.0`, method };
197
- if (params)
198
- request.params = params;
199
- const data = JSON.stringify(request);
200
- return { data, id };
201
- }
202
- }
package/react/daemon.js DELETED
@@ -1,82 +0,0 @@
1
- import React, { createContext, useContext, useEffect, useState } from 'react';
2
- import to from 'await-to-js';
3
- import DaemonWS from '../daemon/websocket';
4
- export const INITIATING = -1;
5
- const daemon = new DaemonWS();
6
- const Context = createContext({
7
- err: undefined,
8
- daemon,
9
- readyState: INITIATING
10
- });
11
- export const NodeSocketProvider = (props) => {
12
- const { children, endpoint, timeout } = props;
13
- const [readyState, setReadyState] = useState(INITIATING);
14
- const [err, setErr] = useState();
15
- useEffect(() => {
16
- const connect = async () => {
17
- setErr(undefined);
18
- const [err, _] = await to(daemon.connect(endpoint));
19
- if (err)
20
- setErr(err);
21
- };
22
- connect();
23
- }, [endpoint]);
24
- useEffect(() => {
25
- if (!timeout)
26
- return;
27
- daemon.timeout = timeout;
28
- }, [timeout]);
29
- useEffect(() => {
30
- if (!daemon.socket)
31
- return;
32
- setReadyState(daemon.socket.readyState);
33
- const onOpen = () => {
34
- if (!daemon.socket)
35
- return;
36
- setReadyState(daemon.socket.readyState);
37
- setErr(undefined);
38
- };
39
- const onClose = (event) => {
40
- if (!daemon.socket)
41
- return;
42
- setReadyState(daemon.socket.readyState);
43
- setErr(new Error(event.reason));
44
- };
45
- const onError = (err) => {
46
- if (!daemon.socket)
47
- return;
48
- setReadyState(daemon.socket.readyState);
49
- setErr(new Error(err.message));
50
- };
51
- daemon.socket.addEventListener(`open`, onOpen);
52
- daemon.socket.addEventListener(`close`, onClose);
53
- daemon.socket.addEventListener(`error`, onError);
54
- return () => {
55
- if (!daemon.socket)
56
- return;
57
- daemon.socket.removeEventListener(`open`, onOpen);
58
- daemon.socket.removeEventListener(`close`, onClose);
59
- daemon.socket.removeEventListener(`error`, onError);
60
- };
61
- }, [daemon.socket]);
62
- return React.createElement(Context.Provider, { value: { daemon, err, readyState } }, children);
63
- };
64
- export const useNodeSocketSubscribe = ({ event, onLoad, onData }, dependencies) => {
65
- const nodeSocket = useNodeSocket();
66
- useEffect(() => {
67
- if (nodeSocket.readyState !== WebSocket.OPEN)
68
- return;
69
- if (typeof onLoad === `function`)
70
- onLoad();
71
- let closeEvent;
72
- const listen = async () => {
73
- closeEvent = await nodeSocket.daemon.listenEvent(event, onData);
74
- };
75
- listen();
76
- return () => {
77
- closeEvent && closeEvent();
78
- };
79
- }, [nodeSocket, ...dependencies]);
80
- };
81
- export const useNodeSocket = () => useContext(Context);
82
- export default useNodeSocket;
package/wallet/rpc.js DELETED
@@ -1,67 +0,0 @@
1
- import { Base64 } from 'js-base64';
2
- import { RPCMethod } from './types';
3
- import { RPC as BaseRPC } from '../lib/rpc';
4
- export class RPC extends BaseRPC {
5
- constructor(endpoint, username, password) {
6
- super(endpoint);
7
- const authValue = Base64.encode(`${username}:${password}`);
8
- this.auth = `Basic ${authValue}`;
9
- }
10
- async post(method, params) {
11
- const headers = new Headers();
12
- headers.set(`Authorization`, this.auth);
13
- return super.post(method, params, headers);
14
- }
15
- getVersion() {
16
- return this.post(RPCMethod.GetVersion);
17
- }
18
- getNetwork() {
19
- return this.post(RPCMethod.GetNetwork);
20
- }
21
- getNonce() {
22
- return this.post(RPCMethod.GetNonce);
23
- }
24
- getTopoheight() {
25
- return this.post(RPCMethod.GetTopoheight);
26
- }
27
- getAddress(params = {}) {
28
- return this.post(RPCMethod.GetAddress, params);
29
- }
30
- splitAddress(params) {
31
- return this.post(RPCMethod.SplitAddress, params);
32
- }
33
- rescan() {
34
- return this.post(RPCMethod.Rescan);
35
- }
36
- getBalance(asset) {
37
- return this.post(RPCMethod.GetBalance, { asset });
38
- }
39
- hasBalance(asset) {
40
- return this.post(RPCMethod.HasBalance, { asset });
41
- }
42
- getTrackedAssets() {
43
- return this.post(RPCMethod.GetTrackedAssets);
44
- }
45
- getAssetPrecision(params) {
46
- return this.post(RPCMethod.GetAssetPrecision, params);
47
- }
48
- getTransaction(hash) {
49
- return this.post(RPCMethod.GetTransaction, { hash });
50
- }
51
- buildTransaction(params) {
52
- return this.post(RPCMethod.BuildTransaction, params);
53
- }
54
- listTransactions(params) {
55
- return this.post(RPCMethod.ListTransactions, params);
56
- }
57
- isOnline() {
58
- return this.post(RPCMethod.IsOnline);
59
- }
60
- signData(data) {
61
- return this.post(RPCMethod.SignData, data);
62
- }
63
- estimateFees(txData) {
64
- return this.post(RPCMethod.EstimateFees, { tx_type: txData });
65
- }
66
- }
67
- export default RPC;
@@ -1,66 +0,0 @@
1
- import { WS as BaseWS } from '../lib/websocket';
2
- import { RPCMethod } from './types';
3
- export class WalletMethods {
4
- constructor(ws, prefix = "") {
5
- this.ws = ws;
6
- this.prefix = prefix;
7
- }
8
- dataCall(method, params) {
9
- return this.ws.dataCall(this.prefix + method, params);
10
- }
11
- getVersion() {
12
- return this.dataCall(RPCMethod.GetVersion);
13
- }
14
- getNetwork() {
15
- return this.dataCall(RPCMethod.GetNetwork);
16
- }
17
- getNonce() {
18
- return this.dataCall(RPCMethod.GetNonce);
19
- }
20
- getTopoheight() {
21
- return this.dataCall(RPCMethod.GetTopoheight);
22
- }
23
- getAddress(params = {}) {
24
- return this.dataCall(RPCMethod.GetAddress, params);
25
- }
26
- splitAddress(params) {
27
- return this.dataCall(RPCMethod.SplitAddress, params);
28
- }
29
- rescan() {
30
- return this.dataCall(RPCMethod.Rescan);
31
- }
32
- getBalance(asset) {
33
- return this.dataCall(RPCMethod.GetBalance, { asset });
34
- }
35
- getTrackedAssets() {
36
- return this.dataCall(RPCMethod.GetTrackedAssets);
37
- }
38
- getAssetPrecision(params) {
39
- return this.dataCall(RPCMethod.GetAssetPrecision, params);
40
- }
41
- getTransaction(hash) {
42
- return this.dataCall(RPCMethod.GetTransaction, { hash });
43
- }
44
- buildTransaction(params) {
45
- return this.dataCall(RPCMethod.BuildTransaction, params);
46
- }
47
- listTransactions(params) {
48
- return this.dataCall(RPCMethod.GetTransaction, params);
49
- }
50
- isOnline() {
51
- return this.dataCall(RPCMethod.IsOnline);
52
- }
53
- signData(data) {
54
- return this.dataCall(RPCMethod.SignData, data);
55
- }
56
- estimateFees(txData) {
57
- return this.dataCall(RPCMethod.EstimateFees, { tx_type: txData });
58
- }
59
- }
60
- export class WS extends BaseWS {
61
- constructor(username, password) {
62
- super({ auth: `${username}:${password}` });
63
- this.methods = new WalletMethods(this);
64
- }
65
- }
66
- export default WS;
@@ -1,11 +0,0 @@
1
- import { WS as BaseWS } from '../lib/websocket';
2
- import { ApplicationData } from '../wallet/types';
3
- import { DaemonMethods } from '../daemon/websocket';
4
- import { WalletMethods } from '../wallet/websocket';
5
- export declare class WS extends BaseWS {
6
- daemon: DaemonMethods;
7
- wallet: WalletMethods;
8
- constructor();
9
- authorize(app: ApplicationData): Promise<import("../lib/types").RPCResponse<unknown>>;
10
- }
11
- export default WS;
package/xswd/websocket.js DELETED
@@ -1,16 +0,0 @@
1
- import { WS as BaseWS } from '../lib/websocket';
2
- import { DaemonMethods } from '../daemon/websocket';
3
- import { WalletMethods } from '../wallet/websocket';
4
- export class WS extends BaseWS {
5
- constructor() {
6
- super();
7
- this.timeout = 0;
8
- this.daemon = new DaemonMethods(this, "node.");
9
- this.wallet = new WalletMethods(this, "wallet.");
10
- }
11
- authorize(app) {
12
- const data = JSON.stringify(app);
13
- return this.call("", {}, data);
14
- }
15
- }
16
- export default WS;
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes