@tthr/client 0.0.1 → 0.0.3
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/dist/index.d.ts +22 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +92 -69
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -4,10 +4,12 @@
|
|
|
4
4
|
* Framework-agnostic client for connecting to Tether servers.
|
|
5
5
|
*/
|
|
6
6
|
export interface TetherClientOptions {
|
|
7
|
-
/**
|
|
7
|
+
/** API URL (e.g., https://api.tether.strands.gg or http://localhost:3001) */
|
|
8
8
|
url: string;
|
|
9
|
+
/** Project ID */
|
|
10
|
+
projectId: string;
|
|
9
11
|
/** Function to get auth token */
|
|
10
|
-
authToken?: () => string | Promise<string
|
|
12
|
+
authToken?: string | (() => string | Promise<string>);
|
|
11
13
|
}
|
|
12
14
|
type SubscriptionCallback<T = unknown> = (data: T) => void;
|
|
13
15
|
/**
|
|
@@ -17,29 +19,42 @@ export declare class TetherClient {
|
|
|
17
19
|
private options;
|
|
18
20
|
private ws;
|
|
19
21
|
private subscriptions;
|
|
20
|
-
private pendingRequests;
|
|
21
22
|
private connectionId;
|
|
22
23
|
private reconnectAttempts;
|
|
23
24
|
private maxReconnectAttempts;
|
|
24
25
|
private reconnectDelay;
|
|
26
|
+
private isConnecting;
|
|
27
|
+
private connectPromise;
|
|
25
28
|
constructor(options: TetherClientOptions);
|
|
26
29
|
/**
|
|
27
|
-
*
|
|
30
|
+
* Get the auth token
|
|
31
|
+
*/
|
|
32
|
+
private getAuthToken;
|
|
33
|
+
/**
|
|
34
|
+
* Get the HTTP API base URL
|
|
35
|
+
*/
|
|
36
|
+
private getHttpUrl;
|
|
37
|
+
/**
|
|
38
|
+
* Get the WebSocket URL
|
|
39
|
+
*/
|
|
40
|
+
private getWsUrl;
|
|
41
|
+
/**
|
|
42
|
+
* Connect to the Tether server via WebSocket (for subscriptions)
|
|
28
43
|
*/
|
|
29
44
|
connect(): Promise<void>;
|
|
30
45
|
private createWebSocket;
|
|
31
46
|
private handleMessage;
|
|
32
47
|
private handleReconnect;
|
|
33
48
|
/**
|
|
34
|
-
* Execute a query
|
|
49
|
+
* Execute a query via HTTP
|
|
35
50
|
*/
|
|
36
51
|
query<T = unknown>(name: string, args?: unknown): Promise<T>;
|
|
37
52
|
/**
|
|
38
|
-
* Execute a mutation
|
|
53
|
+
* Execute a mutation via HTTP
|
|
39
54
|
*/
|
|
40
55
|
mutation<T = unknown>(name: string, args?: unknown): Promise<T>;
|
|
41
56
|
/**
|
|
42
|
-
* Subscribe to a query
|
|
57
|
+
* Subscribe to a query for realtime updates
|
|
43
58
|
*/
|
|
44
59
|
subscribe<T = unknown>(query: string, args: unknown, callback: SubscriptionCallback<T>): () => void;
|
|
45
60
|
private sendSubscribe;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,mBAAmB;IAClC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,mBAAmB;IAClC,6EAA6E;IAC7E,GAAG,EAAE,MAAM,CAAC;IACZ,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;CACvD;AAED,KAAK,oBAAoB,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;AAoB3D;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,cAAc,CAA8B;gBAExC,OAAO,EAAE,mBAAmB;IAIxC;;OAEG;YACW,YAAY;IAU1B;;OAEG;IACH,OAAO,CAAC,UAAU;IAKlB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAQhB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC9B,OAAO,CAAC,eAAe;IAuCvB,OAAO,CAAC,aAAa;IA+BrB,OAAO,CAAC,eAAe;IAsBvB;;OAEG;IACG,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IA2BlE;;OAEG;IACG,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IA2BrE;;OAEG;IACH,SAAS,CAAC,CAAC,GAAG,OAAO,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAChC,MAAM,IAAI;IAyBb,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,UAAU,IAAI,IAAI;CAQnB"}
|
package/dist/index.js
CHANGED
|
@@ -10,39 +10,71 @@ export class TetherClient {
|
|
|
10
10
|
options;
|
|
11
11
|
ws = null;
|
|
12
12
|
subscriptions = new Map();
|
|
13
|
-
pendingRequests = new Map();
|
|
14
13
|
connectionId = null;
|
|
15
14
|
reconnectAttempts = 0;
|
|
16
15
|
maxReconnectAttempts = 5;
|
|
17
16
|
reconnectDelay = 1000;
|
|
17
|
+
isConnecting = false;
|
|
18
|
+
connectPromise = null;
|
|
18
19
|
constructor(options) {
|
|
19
20
|
this.options = options;
|
|
20
21
|
}
|
|
21
22
|
/**
|
|
22
|
-
*
|
|
23
|
+
* Get the auth token
|
|
24
|
+
*/
|
|
25
|
+
async getAuthToken() {
|
|
26
|
+
if (!this.options.authToken)
|
|
27
|
+
return undefined;
|
|
28
|
+
if (typeof this.options.authToken === 'string') {
|
|
29
|
+
return this.options.authToken;
|
|
30
|
+
}
|
|
31
|
+
return this.options.authToken();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get the HTTP API base URL
|
|
35
|
+
*/
|
|
36
|
+
getHttpUrl() {
|
|
37
|
+
const base = this.options.url.replace(/\/$/, '');
|
|
38
|
+
return `${base}/api/v1/${this.options.projectId}`;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get the WebSocket URL
|
|
42
|
+
*/
|
|
43
|
+
getWsUrl() {
|
|
44
|
+
const base = this.options.url
|
|
45
|
+
.replace('https://', 'wss://')
|
|
46
|
+
.replace('http://', 'ws://')
|
|
47
|
+
.replace(/\/$/, '');
|
|
48
|
+
return `${base}/ws/${this.options.projectId}`;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Connect to the Tether server via WebSocket (for subscriptions)
|
|
23
52
|
*/
|
|
24
53
|
async connect() {
|
|
25
54
|
if (this.ws?.readyState === WebSocket.OPEN) {
|
|
26
55
|
return;
|
|
27
56
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}
|
|
40
|
-
return;
|
|
57
|
+
// If already connecting, wait for that promise
|
|
58
|
+
if (this.isConnecting && this.connectPromise) {
|
|
59
|
+
return this.connectPromise;
|
|
60
|
+
}
|
|
61
|
+
this.isConnecting = true;
|
|
62
|
+
this.connectPromise = new Promise(async (resolve, reject) => {
|
|
63
|
+
try {
|
|
64
|
+
let url = this.getWsUrl();
|
|
65
|
+
// Add auth token if available
|
|
66
|
+
const token = await this.getAuthToken();
|
|
67
|
+
if (token) {
|
|
68
|
+
url = `${url}?token=${token}`;
|
|
41
69
|
}
|
|
42
|
-
url
|
|
70
|
+
this.createWebSocket(url, resolve, reject);
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
this.isConnecting = false;
|
|
74
|
+
reject(error);
|
|
43
75
|
}
|
|
44
|
-
this.createWebSocket(url, resolve, reject);
|
|
45
76
|
});
|
|
77
|
+
return this.connectPromise;
|
|
46
78
|
}
|
|
47
79
|
createWebSocket(url, resolve, reject) {
|
|
48
80
|
this.ws = new WebSocket(url);
|
|
@@ -57,16 +89,19 @@ export class TetherClient {
|
|
|
57
89
|
const msg = JSON.parse(event.data);
|
|
58
90
|
if (msg.type === 'connected') {
|
|
59
91
|
this.connectionId = msg.connection_id ?? null;
|
|
92
|
+
this.isConnecting = false;
|
|
60
93
|
resolve();
|
|
61
94
|
}
|
|
62
95
|
}
|
|
63
96
|
};
|
|
64
97
|
this.ws.onerror = (error) => {
|
|
65
98
|
console.error('Tether WebSocket error:', error);
|
|
99
|
+
this.isConnecting = false;
|
|
66
100
|
reject(new Error('WebSocket connection failed'));
|
|
67
101
|
};
|
|
68
102
|
this.ws.onclose = () => {
|
|
69
103
|
this.connectionId = null;
|
|
104
|
+
this.isConnecting = false;
|
|
70
105
|
this.handleReconnect();
|
|
71
106
|
};
|
|
72
107
|
}
|
|
@@ -85,24 +120,8 @@ export class TetherClient {
|
|
|
85
120
|
}
|
|
86
121
|
}
|
|
87
122
|
break;
|
|
88
|
-
case 'mutation_result':
|
|
89
|
-
case 'action_result':
|
|
90
|
-
if (message.id) {
|
|
91
|
-
const pending = this.pendingRequests.get(message.id);
|
|
92
|
-
if (pending) {
|
|
93
|
-
pending.resolve(message.data);
|
|
94
|
-
this.pendingRequests.delete(message.id);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
break;
|
|
98
123
|
case 'error':
|
|
99
|
-
|
|
100
|
-
const pending = this.pendingRequests.get(message.id);
|
|
101
|
-
if (pending) {
|
|
102
|
-
pending.reject(new Error(message.error?.message ?? 'Unknown error'));
|
|
103
|
-
this.pendingRequests.delete(message.id);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
124
|
+
console.error('Tether error:', message.error);
|
|
106
125
|
break;
|
|
107
126
|
case 'pong':
|
|
108
127
|
// Heartbeat acknowledged
|
|
@@ -133,52 +152,55 @@ export class TetherClient {
|
|
|
133
152
|
}, delay);
|
|
134
153
|
}
|
|
135
154
|
/**
|
|
136
|
-
* Execute a query
|
|
155
|
+
* Execute a query via HTTP
|
|
137
156
|
*/
|
|
138
157
|
async query(name, args) {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
158
|
+
const url = `${this.getHttpUrl()}/query`;
|
|
159
|
+
const token = await this.getAuthToken();
|
|
160
|
+
const headers = {
|
|
161
|
+
'Content-Type': 'application/json',
|
|
162
|
+
};
|
|
163
|
+
if (token) {
|
|
164
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
165
|
+
}
|
|
166
|
+
const response = await fetch(url, {
|
|
144
167
|
method: 'POST',
|
|
145
|
-
headers
|
|
146
|
-
'Content-Type': 'application/json',
|
|
147
|
-
// TODO: Add auth header
|
|
148
|
-
},
|
|
168
|
+
headers,
|
|
149
169
|
body: JSON.stringify({ function: name, args }),
|
|
150
170
|
});
|
|
151
171
|
if (!response.ok) {
|
|
152
|
-
|
|
172
|
+
const error = await response.json().catch(() => ({ error: response.statusText }));
|
|
173
|
+
throw new Error(error.error || `Query failed: ${response.statusText}`);
|
|
153
174
|
}
|
|
154
175
|
const result = await response.json();
|
|
155
176
|
return result.data;
|
|
156
177
|
}
|
|
157
178
|
/**
|
|
158
|
-
* Execute a mutation
|
|
179
|
+
* Execute a mutation via HTTP
|
|
159
180
|
*/
|
|
160
181
|
async mutation(name, args) {
|
|
161
|
-
|
|
162
|
-
const
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
if (this.pendingRequests.has(id)) {
|
|
174
|
-
this.pendingRequests.delete(id);
|
|
175
|
-
reject(new Error('Mutation timeout'));
|
|
176
|
-
}
|
|
177
|
-
}, 30000);
|
|
182
|
+
const url = `${this.getHttpUrl()}/mutation`;
|
|
183
|
+
const token = await this.getAuthToken();
|
|
184
|
+
const headers = {
|
|
185
|
+
'Content-Type': 'application/json',
|
|
186
|
+
};
|
|
187
|
+
if (token) {
|
|
188
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
189
|
+
}
|
|
190
|
+
const response = await fetch(url, {
|
|
191
|
+
method: 'POST',
|
|
192
|
+
headers,
|
|
193
|
+
body: JSON.stringify({ function: name, args }),
|
|
178
194
|
});
|
|
195
|
+
if (!response.ok) {
|
|
196
|
+
const error = await response.json().catch(() => ({ error: response.statusText }));
|
|
197
|
+
throw new Error(error.error || `Mutation failed: ${response.statusText}`);
|
|
198
|
+
}
|
|
199
|
+
const result = await response.json();
|
|
200
|
+
return result.data;
|
|
179
201
|
}
|
|
180
202
|
/**
|
|
181
|
-
* Subscribe to a query
|
|
203
|
+
* Subscribe to a query for realtime updates
|
|
182
204
|
*/
|
|
183
205
|
subscribe(query, args, callback) {
|
|
184
206
|
const id = this.generateId();
|
|
@@ -187,10 +209,12 @@ export class TetherClient {
|
|
|
187
209
|
args,
|
|
188
210
|
callback: callback,
|
|
189
211
|
});
|
|
190
|
-
//
|
|
191
|
-
|
|
192
|
-
this.
|
|
193
|
-
|
|
212
|
+
// Connect and subscribe
|
|
213
|
+
this.connect().then(() => {
|
|
214
|
+
if (this.ws?.readyState === WebSocket.OPEN) {
|
|
215
|
+
this.sendSubscribe(id, query, args);
|
|
216
|
+
}
|
|
217
|
+
}).catch(console.error);
|
|
194
218
|
// Return unsubscribe function
|
|
195
219
|
return () => {
|
|
196
220
|
this.subscriptions.delete(id);
|
|
@@ -224,7 +248,6 @@ export class TetherClient {
|
|
|
224
248
|
this.ws = null;
|
|
225
249
|
}
|
|
226
250
|
this.subscriptions.clear();
|
|
227
|
-
this.pendingRequests.clear();
|
|
228
251
|
this.connectionId = null;
|
|
229
252
|
}
|
|
230
253
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|