@xian-tech/client 0.1.0
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 +16 -0
- package/dist/client.d.ts +75 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +580 -0
- package/dist/client.js.map +1 -0
- package/dist/ed25519.d.ts +17 -0
- package/dist/ed25519.d.ts.map +1 -0
- package/dist/ed25519.js +73 -0
- package/dist/ed25519.js.map +1 -0
- package/dist/encoding.d.ts +11 -0
- package/dist/encoding.d.ts.map +1 -0
- package/dist/encoding.js +130 -0
- package/dist/encoding.js.map +1 -0
- package/dist/errors.d.ts +30 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +34 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +146 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/watch.d.ts +16 -0
- package/dist/watch.d.ts.map +1 -0
- package/dist/watch.js +137 -0
- package/dist/watch.js.map +1 -0
- package/package.json +29 -0
package/dist/watch.js
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { TransportError } from "./errors";
|
|
2
|
+
function ensureWebSocketFactory(factory) {
|
|
3
|
+
if (factory) {
|
|
4
|
+
return factory;
|
|
5
|
+
}
|
|
6
|
+
if (typeof WebSocket === "function") {
|
|
7
|
+
return (url) => new WebSocket(url);
|
|
8
|
+
}
|
|
9
|
+
throw new TransportError("global WebSocket is not available");
|
|
10
|
+
}
|
|
11
|
+
async function coerceSocketMessage(data) {
|
|
12
|
+
if (typeof data === "string") {
|
|
13
|
+
return data;
|
|
14
|
+
}
|
|
15
|
+
if (data instanceof ArrayBuffer) {
|
|
16
|
+
return new TextDecoder().decode(new Uint8Array(data));
|
|
17
|
+
}
|
|
18
|
+
if (data instanceof Uint8Array) {
|
|
19
|
+
return new TextDecoder().decode(data);
|
|
20
|
+
}
|
|
21
|
+
if (typeof Blob !== "undefined" && data instanceof Blob) {
|
|
22
|
+
return await data.text();
|
|
23
|
+
}
|
|
24
|
+
throw new TransportError("unsupported websocket message payload");
|
|
25
|
+
}
|
|
26
|
+
class ManagedSubscription {
|
|
27
|
+
options;
|
|
28
|
+
socket = null;
|
|
29
|
+
closed = false;
|
|
30
|
+
reconnectTimer = null;
|
|
31
|
+
constructor(options) {
|
|
32
|
+
this.options = options;
|
|
33
|
+
this.connect();
|
|
34
|
+
}
|
|
35
|
+
connect() {
|
|
36
|
+
if (this.closed) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
this.socket = this.options.webSocketFactory(this.options.url);
|
|
40
|
+
this.socket.onopen = () => {
|
|
41
|
+
if (this.options.subscribeMessage) {
|
|
42
|
+
this.socket?.send(JSON.stringify(this.options.subscribeMessage));
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
this.socket.onerror = () => { };
|
|
46
|
+
this.socket.onclose = () => {
|
|
47
|
+
if (this.closed) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
this.reconnectTimer = setTimeout(() => this.connect(), 500);
|
|
51
|
+
};
|
|
52
|
+
this.socket.onmessage = (event) => {
|
|
53
|
+
void this.handleMessage(event.data);
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
async handleMessage(rawData) {
|
|
57
|
+
const text = await coerceSocketMessage(rawData);
|
|
58
|
+
const parsed = JSON.parse(text);
|
|
59
|
+
if (this.options.shouldHandle(parsed)) {
|
|
60
|
+
this.options.onMessage(parsed);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async unsubscribe() {
|
|
64
|
+
this.closed = true;
|
|
65
|
+
if (this.reconnectTimer) {
|
|
66
|
+
clearTimeout(this.reconnectTimer);
|
|
67
|
+
this.reconnectTimer = null;
|
|
68
|
+
}
|
|
69
|
+
this.socket?.close(1000, "unsubscribed");
|
|
70
|
+
this.socket = null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function isRecord(value) {
|
|
74
|
+
return typeof value === "object" && value !== null;
|
|
75
|
+
}
|
|
76
|
+
function isBlockMessage(value) {
|
|
77
|
+
return isRecord(value) && value.type === "new_block";
|
|
78
|
+
}
|
|
79
|
+
function isStateChangeMessage(value) {
|
|
80
|
+
return isRecord(value) && value.type === "state_change" && typeof value.key === "string";
|
|
81
|
+
}
|
|
82
|
+
function isContractEventMessage(value) {
|
|
83
|
+
return (isRecord(value) &&
|
|
84
|
+
value.type === "contract_event" &&
|
|
85
|
+
typeof value.contract === "string" &&
|
|
86
|
+
typeof value.event === "string");
|
|
87
|
+
}
|
|
88
|
+
export class WatchApi {
|
|
89
|
+
options;
|
|
90
|
+
webSocketFactory;
|
|
91
|
+
constructor(options) {
|
|
92
|
+
this.options = options;
|
|
93
|
+
this.webSocketFactory = ensureWebSocketFactory(options.webSocketFactory);
|
|
94
|
+
}
|
|
95
|
+
socketUrl() {
|
|
96
|
+
if (!this.options.dashboardUrl) {
|
|
97
|
+
throw new TransportError("dashboardUrl is required for websocket subscriptions");
|
|
98
|
+
}
|
|
99
|
+
return `${this.options.dashboardUrl.replace(/\/+$/, "")}/ws`;
|
|
100
|
+
}
|
|
101
|
+
blocks(listener) {
|
|
102
|
+
return new ManagedSubscription({
|
|
103
|
+
url: this.socketUrl(),
|
|
104
|
+
webSocketFactory: this.webSocketFactory,
|
|
105
|
+
shouldHandle: isBlockMessage,
|
|
106
|
+
onMessage: listener
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
state(key, listener) {
|
|
110
|
+
return new ManagedSubscription({
|
|
111
|
+
url: this.socketUrl(),
|
|
112
|
+
webSocketFactory: this.webSocketFactory,
|
|
113
|
+
subscribeMessage: {
|
|
114
|
+
action: "subscribe",
|
|
115
|
+
type: "state",
|
|
116
|
+
key
|
|
117
|
+
},
|
|
118
|
+
shouldHandle: isStateChangeMessage,
|
|
119
|
+
onMessage: listener
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
events(filter, listener) {
|
|
123
|
+
return new ManagedSubscription({
|
|
124
|
+
url: this.socketUrl(),
|
|
125
|
+
webSocketFactory: this.webSocketFactory,
|
|
126
|
+
subscribeMessage: {
|
|
127
|
+
action: "subscribe",
|
|
128
|
+
type: "event",
|
|
129
|
+
contract: filter.contract,
|
|
130
|
+
...(filter.event ? { event: filter.event } : {})
|
|
131
|
+
},
|
|
132
|
+
shouldHandle: isContractEventMessage,
|
|
133
|
+
onMessage: listener
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@xian-tech/client",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Typed Xian client, tx helpers, and Ed25519 signer",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/xian-technology/xian-js.git",
|
|
8
|
+
"directory": "packages/client"
|
|
9
|
+
},
|
|
10
|
+
"type": "module",
|
|
11
|
+
"sideEffects": false,
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"import": "./dist/index.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"files": ["dist"],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc -p tsconfig.json",
|
|
24
|
+
"typecheck": "tsc --noEmit -p tsconfig.json"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"tweetnacl": "^1.0.3"
|
|
28
|
+
}
|
|
29
|
+
}
|