@agentick/client 0.0.1 → 0.1.9
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/package.json +7 -2
- package/dist/transports/http.d.ts +0 -213
- package/dist/transports/http.d.ts.map +0 -1
- package/dist/transports/http.js +0 -309
- package/dist/transports/http.js.map +0 -1
- package/dist/transports/index.d.ts +0 -16
- package/dist/transports/index.d.ts.map +0 -1
- package/dist/transports/index.js +0 -18
- package/dist/transports/index.js.map +0 -1
- package/dist/transports/websocket.d.ts +0 -114
- package/dist/transports/websocket.d.ts.map +0 -1
- package/dist/transports/websocket.js +0 -239
- package/dist/transports/websocket.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentick/client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1.9",
|
|
4
4
|
"description": "Client SDK for Agentick - multiplexed sessions over SSE",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent",
|
|
@@ -27,11 +27,16 @@
|
|
|
27
27
|
"access": "public"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@agentick/shared": "0.
|
|
30
|
+
"@agentick/shared": "0.1.9"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"typescript": "^5.8.3"
|
|
34
34
|
},
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "git+https://github.com/agenticklabs/agentick.git",
|
|
38
|
+
"directory": "packages/client"
|
|
39
|
+
},
|
|
35
40
|
"scripts": {
|
|
36
41
|
"build": "tsc -p tsconfig.build.json",
|
|
37
42
|
"test": "echo \"Tests run from workspace root\"",
|
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HTTP/SSE Transport - Default transport implementation
|
|
3
|
-
*
|
|
4
|
-
* - Server → Client: Server-Sent Events (SSE)
|
|
5
|
-
* - Client → Server: HTTP POST
|
|
6
|
-
*
|
|
7
|
-
* @module @tentickle/client/transports/http
|
|
8
|
-
*/
|
|
9
|
-
import type { Transport, ClientConfig, ConnectionState, ConnectionMetadata, ChannelEvent } from "../types.js";
|
|
10
|
-
/**
|
|
11
|
-
* Custom fetch function signature.
|
|
12
|
-
* Allows replacing the default fetch with axios, ky, or a custom wrapper.
|
|
13
|
-
*/
|
|
14
|
-
export type FetchFn = typeof fetch;
|
|
15
|
-
/**
|
|
16
|
-
* EventSource constructor signature.
|
|
17
|
-
* Allows replacing the default EventSource (e.g., for polyfills or custom implementations).
|
|
18
|
-
*/
|
|
19
|
-
export interface EventSourceConstructor {
|
|
20
|
-
new (url: string | URL, init?: {
|
|
21
|
-
withCredentials?: boolean;
|
|
22
|
-
}): EventSource;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* HTTP transport configuration.
|
|
26
|
-
*/
|
|
27
|
-
export interface HTTPTransportConfig extends ClientConfig {
|
|
28
|
-
/**
|
|
29
|
-
* Custom headers to include in all requests.
|
|
30
|
-
* These are merged with defaults (Content-Type: application/json).
|
|
31
|
-
* User-provided headers take precedence over defaults.
|
|
32
|
-
*
|
|
33
|
-
* Use this for custom auth schemes, API keys, or any other headers.
|
|
34
|
-
*
|
|
35
|
-
* @example
|
|
36
|
-
* ```typescript
|
|
37
|
-
* // Basic auth
|
|
38
|
-
* const transport = createHTTPTransport({
|
|
39
|
-
* baseUrl: 'https://api.example.com',
|
|
40
|
-
* headers: { Authorization: 'Basic ' + btoa('user:pass') },
|
|
41
|
-
* });
|
|
42
|
-
*
|
|
43
|
-
* // API key
|
|
44
|
-
* const transport = createHTTPTransport({
|
|
45
|
-
* baseUrl: 'https://api.example.com',
|
|
46
|
-
* headers: { 'X-API-Key': 'my-api-key' },
|
|
47
|
-
* });
|
|
48
|
-
* ```
|
|
49
|
-
*/
|
|
50
|
-
headers?: Record<string, string>;
|
|
51
|
-
/**
|
|
52
|
-
* Send cookies with requests and SSE (EventSource withCredentials).
|
|
53
|
-
* Defaults to false.
|
|
54
|
-
*/
|
|
55
|
-
withCredentials?: boolean;
|
|
56
|
-
/**
|
|
57
|
-
* Include auth token in SSE query params (EventSource lacks headers).
|
|
58
|
-
* Defaults to false to avoid token leakage in logs.
|
|
59
|
-
*/
|
|
60
|
-
authTokenInQuery?: boolean;
|
|
61
|
-
/**
|
|
62
|
-
* Custom fetch implementation.
|
|
63
|
-
* Use this to inject axios, ky, or a fetch wrapper with custom credentials/interceptors.
|
|
64
|
-
*
|
|
65
|
-
* @example
|
|
66
|
-
* ```typescript
|
|
67
|
-
* import ky from 'ky';
|
|
68
|
-
*
|
|
69
|
-
* const transport = createHTTPTransport({
|
|
70
|
-
* baseUrl: 'https://api.example.com',
|
|
71
|
-
* fetch: ky as unknown as FetchFn,
|
|
72
|
-
* });
|
|
73
|
-
* ```
|
|
74
|
-
*/
|
|
75
|
-
fetch?: FetchFn;
|
|
76
|
-
/**
|
|
77
|
-
* Custom EventSource constructor.
|
|
78
|
-
* Use this for polyfills (e.g., eventsource package in Node.js) or custom implementations.
|
|
79
|
-
*
|
|
80
|
-
* @example
|
|
81
|
-
* ```typescript
|
|
82
|
-
* import EventSource from 'eventsource';
|
|
83
|
-
*
|
|
84
|
-
* const transport = createHTTPTransport({
|
|
85
|
-
* baseUrl: 'https://api.example.com',
|
|
86
|
-
* EventSource: EventSource,
|
|
87
|
-
* });
|
|
88
|
-
* ```
|
|
89
|
-
*/
|
|
90
|
-
EventSource?: EventSourceConstructor;
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* HTTP/SSE Transport implementation.
|
|
94
|
-
*
|
|
95
|
-
* This is the default transport for Tentickle clients.
|
|
96
|
-
* Uses SSE for server-to-client streaming and HTTP POST for client-to-server messages.
|
|
97
|
-
*
|
|
98
|
-
* Supports custom fetch and EventSource implementations for:
|
|
99
|
-
* - Server-side (Node.js) usage with polyfills
|
|
100
|
-
* - Custom HTTP clients (axios, ky, got)
|
|
101
|
-
* - Credentials/interceptors
|
|
102
|
-
* - Testing with mocks
|
|
103
|
-
*/
|
|
104
|
-
export declare class HTTPTransport implements Transport {
|
|
105
|
-
readonly name = "http";
|
|
106
|
-
private _state;
|
|
107
|
-
private sessionId?;
|
|
108
|
-
private metadata?;
|
|
109
|
-
private eventSource?;
|
|
110
|
-
private reconnectAttempts;
|
|
111
|
-
private reconnectTimer?;
|
|
112
|
-
private receiveHandlers;
|
|
113
|
-
private stateHandlers;
|
|
114
|
-
private readonly baseUrl;
|
|
115
|
-
private readonly eventsPath;
|
|
116
|
-
private readonly timeout;
|
|
117
|
-
private readonly reconnectDelay;
|
|
118
|
-
private readonly maxReconnectAttempts;
|
|
119
|
-
private readonly withCredentials;
|
|
120
|
-
private readonly authTokenInQuery;
|
|
121
|
-
/** Token for SSE query param auth (EventSource doesn't support headers) */
|
|
122
|
-
private readonly token?;
|
|
123
|
-
/** Custom headers to merge with defaults for fetch requests */
|
|
124
|
-
private readonly customHeaders;
|
|
125
|
-
/** Custom fetch implementation (defaults to global fetch) */
|
|
126
|
-
private readonly fetchFn;
|
|
127
|
-
/** Custom EventSource constructor (defaults to global EventSource) */
|
|
128
|
-
private readonly EventSourceCtor;
|
|
129
|
-
constructor(config: HTTPTransportConfig);
|
|
130
|
-
get state(): ConnectionState;
|
|
131
|
-
private setState;
|
|
132
|
-
/**
|
|
133
|
-
* Connect to the SSE stream.
|
|
134
|
-
*/
|
|
135
|
-
connect(sessionId: string, metadata?: ConnectionMetadata): Promise<void>;
|
|
136
|
-
private connectSSE;
|
|
137
|
-
private handleReconnect;
|
|
138
|
-
private closeEventSource;
|
|
139
|
-
/**
|
|
140
|
-
* Disconnect from the server.
|
|
141
|
-
*/
|
|
142
|
-
disconnect(): Promise<void>;
|
|
143
|
-
/**
|
|
144
|
-
* Send event via HTTP POST.
|
|
145
|
-
*/
|
|
146
|
-
send(event: ChannelEvent): Promise<void>;
|
|
147
|
-
/**
|
|
148
|
-
* Register receive handler.
|
|
149
|
-
*/
|
|
150
|
-
onReceive(handler: (event: ChannelEvent) => void): () => void;
|
|
151
|
-
/**
|
|
152
|
-
* Register state change handler.
|
|
153
|
-
*/
|
|
154
|
-
onStateChange(handler: (state: ConnectionState) => void): () => void;
|
|
155
|
-
private notifyReceive;
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Create HTTP/SSE transport.
|
|
159
|
-
*
|
|
160
|
-
* @example
|
|
161
|
-
* ```typescript
|
|
162
|
-
* // Default usage
|
|
163
|
-
* const transport = createHTTPTransport({
|
|
164
|
-
* baseUrl: 'https://api.example.com',
|
|
165
|
-
* });
|
|
166
|
-
*
|
|
167
|
-
* // With custom headers (API key, Basic auth, etc.)
|
|
168
|
-
* const transportWithApiKey = createHTTPTransport({
|
|
169
|
-
* baseUrl: 'https://api.example.com',
|
|
170
|
-
* headers: { 'X-API-Key': 'my-api-key' },
|
|
171
|
-
* });
|
|
172
|
-
*
|
|
173
|
-
* const transportWithBasicAuth = createHTTPTransport({
|
|
174
|
-
* baseUrl: 'https://api.example.com',
|
|
175
|
-
* headers: { Authorization: 'Basic ' + btoa('user:pass') },
|
|
176
|
-
* });
|
|
177
|
-
*
|
|
178
|
-
* // With Bearer token (convenience - same as headers: { Authorization: 'Bearer ...' })
|
|
179
|
-
* const transportWithToken = createHTTPTransport({
|
|
180
|
-
* baseUrl: 'https://api.example.com',
|
|
181
|
-
* token: 'my-jwt-token',
|
|
182
|
-
* });
|
|
183
|
-
*
|
|
184
|
-
* // With custom fetch (e.g., for credentials)
|
|
185
|
-
* const transportWithCredentials = createHTTPTransport({
|
|
186
|
-
* baseUrl: 'https://api.example.com',
|
|
187
|
-
* fetch: (url, init) => fetch(url, { ...init, credentials: 'include' }),
|
|
188
|
-
* });
|
|
189
|
-
*
|
|
190
|
-
* // With cookie-based auth for SSE + POST
|
|
191
|
-
* const transportWithCookies = createHTTPTransport({
|
|
192
|
-
* baseUrl: 'https://api.example.com',
|
|
193
|
-
* withCredentials: true,
|
|
194
|
-
* });
|
|
195
|
-
*
|
|
196
|
-
* // If you must pass auth token to SSE via query params
|
|
197
|
-
* const transportWithQueryToken = createHTTPTransport({
|
|
198
|
-
* baseUrl: 'https://api.example.com',
|
|
199
|
-
* token: 'my-jwt-token',
|
|
200
|
-
* authTokenInQuery: true,
|
|
201
|
-
* });
|
|
202
|
-
*
|
|
203
|
-
* // Node.js with polyfills
|
|
204
|
-
* import EventSource from 'eventsource';
|
|
205
|
-
*
|
|
206
|
-
* const nodeTransport = createHTTPTransport({
|
|
207
|
-
* baseUrl: 'https://api.example.com',
|
|
208
|
-
* EventSource,
|
|
209
|
-
* });
|
|
210
|
-
* ```
|
|
211
|
-
*/
|
|
212
|
-
export declare function createHTTPTransport(config: HTTPTransportConfig): Transport;
|
|
213
|
-
//# sourceMappingURL=http.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"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"}
|
package/dist/transports/http.js
DELETED
|
@@ -1,309 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HTTP/SSE Transport - Default transport implementation
|
|
3
|
-
*
|
|
4
|
-
* - Server → Client: Server-Sent Events (SSE)
|
|
5
|
-
* - Client → Server: HTTP POST
|
|
6
|
-
*
|
|
7
|
-
* @module @tentickle/client/transports/http
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
* HTTP/SSE Transport implementation.
|
|
11
|
-
*
|
|
12
|
-
* This is the default transport for Tentickle clients.
|
|
13
|
-
* Uses SSE for server-to-client streaming and HTTP POST for client-to-server messages.
|
|
14
|
-
*
|
|
15
|
-
* Supports custom fetch and EventSource implementations for:
|
|
16
|
-
* - Server-side (Node.js) usage with polyfills
|
|
17
|
-
* - Custom HTTP clients (axios, ky, got)
|
|
18
|
-
* - Credentials/interceptors
|
|
19
|
-
* - Testing with mocks
|
|
20
|
-
*/
|
|
21
|
-
export class HTTPTransport {
|
|
22
|
-
name = "http";
|
|
23
|
-
_state = "disconnected";
|
|
24
|
-
sessionId;
|
|
25
|
-
metadata;
|
|
26
|
-
eventSource;
|
|
27
|
-
reconnectAttempts = 0;
|
|
28
|
-
reconnectTimer;
|
|
29
|
-
receiveHandlers = new Set();
|
|
30
|
-
stateHandlers = new Set();
|
|
31
|
-
baseUrl;
|
|
32
|
-
eventsPath;
|
|
33
|
-
timeout;
|
|
34
|
-
reconnectDelay;
|
|
35
|
-
maxReconnectAttempts;
|
|
36
|
-
withCredentials;
|
|
37
|
-
authTokenInQuery;
|
|
38
|
-
/** Token for SSE query param auth (EventSource doesn't support headers) */
|
|
39
|
-
token;
|
|
40
|
-
/** Custom headers to merge with defaults for fetch requests */
|
|
41
|
-
customHeaders;
|
|
42
|
-
/** Custom fetch implementation (defaults to global fetch) */
|
|
43
|
-
fetchFn;
|
|
44
|
-
/** Custom EventSource constructor (defaults to global EventSource) */
|
|
45
|
-
EventSourceCtor;
|
|
46
|
-
constructor(config) {
|
|
47
|
-
this.baseUrl = config.baseUrl.replace(/\/$/, ""); // Remove trailing slash
|
|
48
|
-
this.eventsPath = config.paths?.events ?? "/events";
|
|
49
|
-
this.timeout = config.timeout ?? 30000;
|
|
50
|
-
this.reconnectDelay = config.reconnectDelay ?? 1000;
|
|
51
|
-
this.maxReconnectAttempts = config.maxReconnectAttempts ?? 10;
|
|
52
|
-
this.withCredentials = config.withCredentials ?? false;
|
|
53
|
-
this.authTokenInQuery = config.authTokenInQuery ?? false;
|
|
54
|
-
// Token is used for SSE query param (EventSource doesn't support custom headers)
|
|
55
|
-
this.token = config.token;
|
|
56
|
-
// Build custom headers for fetch requests - token adds Bearer auth if no custom Authorization
|
|
57
|
-
this.customHeaders = { ...config.headers };
|
|
58
|
-
if (config.token && !this.customHeaders["Authorization"]) {
|
|
59
|
-
this.customHeaders["Authorization"] = `Bearer ${config.token}`;
|
|
60
|
-
}
|
|
61
|
-
// Use custom implementations or fall back to globals
|
|
62
|
-
this.fetchFn = config.fetch ?? globalThis.fetch.bind(globalThis);
|
|
63
|
-
this.EventSourceCtor = config.EventSource ?? globalThis.EventSource;
|
|
64
|
-
}
|
|
65
|
-
get state() {
|
|
66
|
-
return this._state;
|
|
67
|
-
}
|
|
68
|
-
setState(state) {
|
|
69
|
-
if (this._state === state)
|
|
70
|
-
return;
|
|
71
|
-
this._state = state;
|
|
72
|
-
for (const handler of this.stateHandlers) {
|
|
73
|
-
try {
|
|
74
|
-
handler(state);
|
|
75
|
-
}
|
|
76
|
-
catch (error) {
|
|
77
|
-
console.error("Error in state handler:", error);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Connect to the SSE stream.
|
|
83
|
-
*/
|
|
84
|
-
async connect(sessionId, metadata) {
|
|
85
|
-
if (this._state === "connected") {
|
|
86
|
-
throw new Error("Already connected");
|
|
87
|
-
}
|
|
88
|
-
this.sessionId = sessionId;
|
|
89
|
-
this.metadata = metadata;
|
|
90
|
-
this.reconnectAttempts = 0;
|
|
91
|
-
this.setState("connecting");
|
|
92
|
-
try {
|
|
93
|
-
await this.connectSSE();
|
|
94
|
-
this.setState("connected");
|
|
95
|
-
}
|
|
96
|
-
catch (error) {
|
|
97
|
-
this.setState("error");
|
|
98
|
-
throw error;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
async connectSSE() {
|
|
102
|
-
if (!this.sessionId) {
|
|
103
|
-
throw new Error("Session ID required");
|
|
104
|
-
}
|
|
105
|
-
// Close existing connection
|
|
106
|
-
this.closeEventSource();
|
|
107
|
-
// Build SSE URL with query params
|
|
108
|
-
const url = new URL(`${this.baseUrl}${this.eventsPath}`);
|
|
109
|
-
url.searchParams.set("sessionId", this.sessionId);
|
|
110
|
-
if (this.metadata?.userId) {
|
|
111
|
-
url.searchParams.set("userId", String(this.metadata.userId));
|
|
112
|
-
}
|
|
113
|
-
if (this.token && this.authTokenInQuery) {
|
|
114
|
-
url.searchParams.set("token", this.token);
|
|
115
|
-
}
|
|
116
|
-
return new Promise((resolve, reject) => {
|
|
117
|
-
try {
|
|
118
|
-
this.eventSource = new this.EventSourceCtor(url.toString(), {
|
|
119
|
-
withCredentials: this.withCredentials,
|
|
120
|
-
});
|
|
121
|
-
const onOpen = () => {
|
|
122
|
-
this.reconnectAttempts = 0;
|
|
123
|
-
resolve();
|
|
124
|
-
};
|
|
125
|
-
const onMessage = (event) => {
|
|
126
|
-
try {
|
|
127
|
-
const channelEvent = JSON.parse(event.data);
|
|
128
|
-
this.notifyReceive(channelEvent);
|
|
129
|
-
}
|
|
130
|
-
catch (error) {
|
|
131
|
-
console.error("Failed to parse SSE event:", error);
|
|
132
|
-
}
|
|
133
|
-
};
|
|
134
|
-
const onError = () => {
|
|
135
|
-
if (this._state === "connecting") {
|
|
136
|
-
this.closeEventSource();
|
|
137
|
-
reject(new Error("SSE connection failed"));
|
|
138
|
-
}
|
|
139
|
-
else {
|
|
140
|
-
this.handleReconnect();
|
|
141
|
-
}
|
|
142
|
-
};
|
|
143
|
-
this.eventSource.addEventListener("open", onOpen);
|
|
144
|
-
this.eventSource.addEventListener("message", onMessage);
|
|
145
|
-
this.eventSource.addEventListener("error", onError);
|
|
146
|
-
}
|
|
147
|
-
catch (error) {
|
|
148
|
-
reject(error);
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
handleReconnect() {
|
|
153
|
-
if (this.reconnectAttempts >= this.maxReconnectAttempts) {
|
|
154
|
-
console.error("Max reconnection attempts reached");
|
|
155
|
-
this.setState("error");
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
-
this.reconnectAttempts++;
|
|
159
|
-
const delay = this.reconnectDelay * Math.min(this.reconnectAttempts, 5); // Cap backoff
|
|
160
|
-
this.reconnectTimer = setTimeout(() => {
|
|
161
|
-
if (this.sessionId && this._state !== "disconnected") {
|
|
162
|
-
this.connectSSE()
|
|
163
|
-
.then(() => this.setState("connected"))
|
|
164
|
-
.catch((error) => {
|
|
165
|
-
console.error("Reconnection failed:", error);
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
}, delay);
|
|
169
|
-
}
|
|
170
|
-
closeEventSource() {
|
|
171
|
-
if (this.eventSource) {
|
|
172
|
-
this.eventSource.close();
|
|
173
|
-
this.eventSource = undefined;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Disconnect from the server.
|
|
178
|
-
*/
|
|
179
|
-
async disconnect() {
|
|
180
|
-
if (this.reconnectTimer) {
|
|
181
|
-
clearTimeout(this.reconnectTimer);
|
|
182
|
-
this.reconnectTimer = undefined;
|
|
183
|
-
}
|
|
184
|
-
this.closeEventSource();
|
|
185
|
-
this.sessionId = undefined;
|
|
186
|
-
this.metadata = undefined;
|
|
187
|
-
this.reconnectAttempts = 0;
|
|
188
|
-
this.setState("disconnected");
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Send event via HTTP POST.
|
|
192
|
-
*/
|
|
193
|
-
async send(event) {
|
|
194
|
-
if (!this.sessionId) {
|
|
195
|
-
throw new Error("Not connected");
|
|
196
|
-
}
|
|
197
|
-
// Merge default headers with custom headers (custom takes precedence)
|
|
198
|
-
const headers = {
|
|
199
|
-
"Content-Type": "application/json",
|
|
200
|
-
...this.customHeaders,
|
|
201
|
-
};
|
|
202
|
-
const response = await this.fetchFn(`${this.baseUrl}${this.eventsPath}`, {
|
|
203
|
-
method: "POST",
|
|
204
|
-
headers,
|
|
205
|
-
credentials: this.withCredentials ? "include" : "same-origin",
|
|
206
|
-
body: JSON.stringify({
|
|
207
|
-
...event,
|
|
208
|
-
metadata: {
|
|
209
|
-
...event.metadata,
|
|
210
|
-
sessionId: this.sessionId,
|
|
211
|
-
userId: this.metadata?.userId,
|
|
212
|
-
timestamp: Date.now(),
|
|
213
|
-
},
|
|
214
|
-
}),
|
|
215
|
-
signal: AbortSignal.timeout(this.timeout),
|
|
216
|
-
});
|
|
217
|
-
if (!response.ok) {
|
|
218
|
-
const text = await response.text();
|
|
219
|
-
throw new Error(`Failed to send event: ${response.status} ${text}`);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* Register receive handler.
|
|
224
|
-
*/
|
|
225
|
-
onReceive(handler) {
|
|
226
|
-
this.receiveHandlers.add(handler);
|
|
227
|
-
return () => {
|
|
228
|
-
this.receiveHandlers.delete(handler);
|
|
229
|
-
};
|
|
230
|
-
}
|
|
231
|
-
/**
|
|
232
|
-
* Register state change handler.
|
|
233
|
-
*/
|
|
234
|
-
onStateChange(handler) {
|
|
235
|
-
this.stateHandlers.add(handler);
|
|
236
|
-
return () => {
|
|
237
|
-
this.stateHandlers.delete(handler);
|
|
238
|
-
};
|
|
239
|
-
}
|
|
240
|
-
notifyReceive(event) {
|
|
241
|
-
for (const handler of this.receiveHandlers) {
|
|
242
|
-
try {
|
|
243
|
-
handler(event);
|
|
244
|
-
}
|
|
245
|
-
catch (error) {
|
|
246
|
-
console.error("Error in receive handler:", error);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
/**
|
|
252
|
-
* Create HTTP/SSE transport.
|
|
253
|
-
*
|
|
254
|
-
* @example
|
|
255
|
-
* ```typescript
|
|
256
|
-
* // Default usage
|
|
257
|
-
* const transport = createHTTPTransport({
|
|
258
|
-
* baseUrl: 'https://api.example.com',
|
|
259
|
-
* });
|
|
260
|
-
*
|
|
261
|
-
* // With custom headers (API key, Basic auth, etc.)
|
|
262
|
-
* const transportWithApiKey = createHTTPTransport({
|
|
263
|
-
* baseUrl: 'https://api.example.com',
|
|
264
|
-
* headers: { 'X-API-Key': 'my-api-key' },
|
|
265
|
-
* });
|
|
266
|
-
*
|
|
267
|
-
* const transportWithBasicAuth = createHTTPTransport({
|
|
268
|
-
* baseUrl: 'https://api.example.com',
|
|
269
|
-
* headers: { Authorization: 'Basic ' + btoa('user:pass') },
|
|
270
|
-
* });
|
|
271
|
-
*
|
|
272
|
-
* // With Bearer token (convenience - same as headers: { Authorization: 'Bearer ...' })
|
|
273
|
-
* const transportWithToken = createHTTPTransport({
|
|
274
|
-
* baseUrl: 'https://api.example.com',
|
|
275
|
-
* token: 'my-jwt-token',
|
|
276
|
-
* });
|
|
277
|
-
*
|
|
278
|
-
* // With custom fetch (e.g., for credentials)
|
|
279
|
-
* const transportWithCredentials = createHTTPTransport({
|
|
280
|
-
* baseUrl: 'https://api.example.com',
|
|
281
|
-
* fetch: (url, init) => fetch(url, { ...init, credentials: 'include' }),
|
|
282
|
-
* });
|
|
283
|
-
*
|
|
284
|
-
* // With cookie-based auth for SSE + POST
|
|
285
|
-
* const transportWithCookies = createHTTPTransport({
|
|
286
|
-
* baseUrl: 'https://api.example.com',
|
|
287
|
-
* withCredentials: true,
|
|
288
|
-
* });
|
|
289
|
-
*
|
|
290
|
-
* // If you must pass auth token to SSE via query params
|
|
291
|
-
* const transportWithQueryToken = createHTTPTransport({
|
|
292
|
-
* baseUrl: 'https://api.example.com',
|
|
293
|
-
* token: 'my-jwt-token',
|
|
294
|
-
* authTokenInQuery: true,
|
|
295
|
-
* });
|
|
296
|
-
*
|
|
297
|
-
* // Node.js with polyfills
|
|
298
|
-
* import EventSource from 'eventsource';
|
|
299
|
-
*
|
|
300
|
-
* const nodeTransport = createHTTPTransport({
|
|
301
|
-
* baseUrl: 'https://api.example.com',
|
|
302
|
-
* EventSource,
|
|
303
|
-
* });
|
|
304
|
-
* ```
|
|
305
|
-
*/
|
|
306
|
-
export function createHTTPTransport(config) {
|
|
307
|
-
return new HTTPTransport(config);
|
|
308
|
-
}
|
|
309
|
-
//# sourceMappingURL=http.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Transport implementations for @tentickle/client
|
|
3
|
-
*
|
|
4
|
-
* Default: HTTP/SSE transport
|
|
5
|
-
* Alternative: WebSocket transport
|
|
6
|
-
*
|
|
7
|
-
* Both transports support custom implementations for:
|
|
8
|
-
* - Server-side (Node.js) usage with polyfills
|
|
9
|
-
* - Custom HTTP clients (axios, ky, got)
|
|
10
|
-
* - Testing with mocks
|
|
11
|
-
*
|
|
12
|
-
* @module @tentickle/client/transports
|
|
13
|
-
*/
|
|
14
|
-
export { HTTPTransport, createHTTPTransport, type HTTPTransportConfig, type FetchFn, type EventSourceConstructor, } from "./http.js";
|
|
15
|
-
export { WebSocketTransport, createWebSocketTransport, type WebSocketConfig, type WebSocketConstructor, } from "./websocket.js";
|
|
16
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transports/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,KAAK,mBAAmB,EACxB,KAAK,OAAO,EACZ,KAAK,sBAAsB,GAC5B,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,KAAK,eAAe,EACpB,KAAK,oBAAoB,GAC1B,MAAM,gBAAgB,CAAC"}
|
package/dist/transports/index.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Transport implementations for @tentickle/client
|
|
3
|
-
*
|
|
4
|
-
* Default: HTTP/SSE transport
|
|
5
|
-
* Alternative: WebSocket transport
|
|
6
|
-
*
|
|
7
|
-
* Both transports support custom implementations for:
|
|
8
|
-
* - Server-side (Node.js) usage with polyfills
|
|
9
|
-
* - Custom HTTP clients (axios, ky, got)
|
|
10
|
-
* - Testing with mocks
|
|
11
|
-
*
|
|
12
|
-
* @module @tentickle/client/transports
|
|
13
|
-
*/
|
|
14
|
-
// Default HTTP/SSE transport
|
|
15
|
-
export { HTTPTransport, createHTTPTransport, } from "./http.js";
|
|
16
|
-
// Alternative WebSocket transport
|
|
17
|
-
export { WebSocketTransport, createWebSocketTransport, } from "./websocket.js";
|
|
18
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transports/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,6BAA6B;AAC7B,OAAO,EACL,aAAa,EACb,mBAAmB,GAIpB,MAAM,WAAW,CAAC;AAEnB,kCAAkC;AAClC,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GAGzB,MAAM,gBAAgB,CAAC"}
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WebSocket Transport - Alternative transport implementation
|
|
3
|
-
*
|
|
4
|
-
* Bidirectional communication over WebSocket.
|
|
5
|
-
* Use when you need lower latency or when SSE is not available.
|
|
6
|
-
*
|
|
7
|
-
* @module @tentickle/client/transports/websocket
|
|
8
|
-
*/
|
|
9
|
-
import type { Transport, ClientConfig, ConnectionState, ConnectionMetadata, ChannelEvent } from "../types.js";
|
|
10
|
-
/**
|
|
11
|
-
* WebSocket constructor signature.
|
|
12
|
-
* Allows replacing the default WebSocket (e.g., with 'ws' package in Node.js).
|
|
13
|
-
*/
|
|
14
|
-
export interface WebSocketConstructor {
|
|
15
|
-
new (url: string | URL, protocols?: string | string[]): WebSocket;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* WebSocket transport configuration.
|
|
19
|
-
*/
|
|
20
|
-
export interface WebSocketConfig extends ClientConfig {
|
|
21
|
-
/** WebSocket URL (ws:// or wss://) - overrides baseUrl */
|
|
22
|
-
wsUrl?: string;
|
|
23
|
-
/** WebSocket protocols */
|
|
24
|
-
protocols?: string[];
|
|
25
|
-
/**
|
|
26
|
-
* Custom WebSocket constructor.
|
|
27
|
-
* Use this for Node.js (ws package) or custom implementations.
|
|
28
|
-
*
|
|
29
|
-
* @example
|
|
30
|
-
* ```typescript
|
|
31
|
-
* import WebSocket from 'ws';
|
|
32
|
-
*
|
|
33
|
-
* const transport = createWebSocketTransport({
|
|
34
|
-
* baseUrl: 'wss://api.example.com',
|
|
35
|
-
* WebSocket: WebSocket as unknown as WebSocketConstructor,
|
|
36
|
-
* });
|
|
37
|
-
* ```
|
|
38
|
-
*/
|
|
39
|
-
WebSocket?: WebSocketConstructor;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* WebSocket Transport implementation.
|
|
43
|
-
*
|
|
44
|
-
* Use this when:
|
|
45
|
-
* - You need bidirectional real-time communication
|
|
46
|
-
* - SSE is blocked or unavailable
|
|
47
|
-
* - You want lower latency
|
|
48
|
-
*/
|
|
49
|
-
export declare class WebSocketTransport implements Transport {
|
|
50
|
-
readonly name = "websocket";
|
|
51
|
-
private _state;
|
|
52
|
-
private sessionId?;
|
|
53
|
-
private metadata?;
|
|
54
|
-
private ws?;
|
|
55
|
-
private reconnectAttempts;
|
|
56
|
-
private reconnectTimer?;
|
|
57
|
-
private receiveHandlers;
|
|
58
|
-
private stateHandlers;
|
|
59
|
-
private readonly wsUrl;
|
|
60
|
-
private readonly protocols?;
|
|
61
|
-
private readonly token?;
|
|
62
|
-
private readonly reconnectDelay;
|
|
63
|
-
private readonly maxReconnectAttempts;
|
|
64
|
-
/** Custom WebSocket constructor (defaults to global WebSocket) */
|
|
65
|
-
private readonly WebSocketCtor;
|
|
66
|
-
constructor(config: WebSocketConfig);
|
|
67
|
-
get state(): ConnectionState;
|
|
68
|
-
private setState;
|
|
69
|
-
/**
|
|
70
|
-
* Connect to WebSocket server.
|
|
71
|
-
*/
|
|
72
|
-
connect(sessionId: string, metadata?: ConnectionMetadata): Promise<void>;
|
|
73
|
-
private connectWebSocket;
|
|
74
|
-
private handleReconnect;
|
|
75
|
-
private closeWebSocket;
|
|
76
|
-
/**
|
|
77
|
-
* Disconnect from server.
|
|
78
|
-
*/
|
|
79
|
-
disconnect(): Promise<void>;
|
|
80
|
-
/**
|
|
81
|
-
* Send event via WebSocket.
|
|
82
|
-
*/
|
|
83
|
-
send(event: ChannelEvent): Promise<void>;
|
|
84
|
-
/**
|
|
85
|
-
* Register receive handler.
|
|
86
|
-
*/
|
|
87
|
-
onReceive(handler: (event: ChannelEvent) => void): () => void;
|
|
88
|
-
/**
|
|
89
|
-
* Register state change handler.
|
|
90
|
-
*/
|
|
91
|
-
onStateChange(handler: (state: ConnectionState) => void): () => void;
|
|
92
|
-
private notifyReceive;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Create WebSocket transport.
|
|
96
|
-
*
|
|
97
|
-
* @example
|
|
98
|
-
* ```typescript
|
|
99
|
-
* // Browser usage
|
|
100
|
-
* const transport = createWebSocketTransport({
|
|
101
|
-
* baseUrl: 'wss://api.example.com',
|
|
102
|
-
* });
|
|
103
|
-
*
|
|
104
|
-
* // Node.js with ws package
|
|
105
|
-
* import WebSocket from 'ws';
|
|
106
|
-
*
|
|
107
|
-
* const nodeTransport = createWebSocketTransport({
|
|
108
|
-
* baseUrl: 'wss://api.example.com',
|
|
109
|
-
* WebSocket: WebSocket as unknown as WebSocketConstructor,
|
|
110
|
-
* });
|
|
111
|
-
* ```
|
|
112
|
-
*/
|
|
113
|
-
export declare function createWebSocketTransport(config: WebSocketConfig): Transport;
|
|
114
|
-
//# sourceMappingURL=websocket.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/transports/websocket.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,YAAY,EACb,MAAM,aAAa,CAAC;AAMrB;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;CACnE;AAED;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,EAAE,oBAAoB,CAAC;CAClC;AAED;;;;;;;GAOG;AACH,qBAAa,kBAAmB,YAAW,SAAS;IAClD,QAAQ,CAAC,IAAI,eAAe;IAE5B,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,CAAqB;IACtC,OAAO,CAAC,EAAE,CAAC,CAAY;IACvB,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,cAAc,CAAC,CAAgC;IACvD,OAAO,CAAC,eAAe,CAA4C;IACnE,OAAO,CAAC,aAAa,CAA+C;IAEpE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAW;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAE9C,kEAAkE;IAClE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuB;gBAEzC,MAAM,EAAE,eAAe;IAiBnC,IAAI,KAAK,IAAI,eAAe,CAE3B;IAED,OAAO,CAAC,QAAQ;IAYhB;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;YAmBhE,gBAAgB;IAuD9B,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAajC;;OAEG;IACG,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB9C;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,MAAM,IAAI;IAO7D;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI;IAOpE,OAAO,CAAC,aAAa;CAStB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAE3E"}
|
|
@@ -1,239 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WebSocket Transport - Alternative transport implementation
|
|
3
|
-
*
|
|
4
|
-
* Bidirectional communication over WebSocket.
|
|
5
|
-
* Use when you need lower latency or when SSE is not available.
|
|
6
|
-
*
|
|
7
|
-
* @module @tentickle/client/transports/websocket
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
* WebSocket Transport implementation.
|
|
11
|
-
*
|
|
12
|
-
* Use this when:
|
|
13
|
-
* - You need bidirectional real-time communication
|
|
14
|
-
* - SSE is blocked or unavailable
|
|
15
|
-
* - You want lower latency
|
|
16
|
-
*/
|
|
17
|
-
export class WebSocketTransport {
|
|
18
|
-
name = "websocket";
|
|
19
|
-
_state = "disconnected";
|
|
20
|
-
sessionId;
|
|
21
|
-
metadata;
|
|
22
|
-
ws;
|
|
23
|
-
reconnectAttempts = 0;
|
|
24
|
-
reconnectTimer;
|
|
25
|
-
receiveHandlers = new Set();
|
|
26
|
-
stateHandlers = new Set();
|
|
27
|
-
wsUrl;
|
|
28
|
-
protocols;
|
|
29
|
-
token;
|
|
30
|
-
reconnectDelay;
|
|
31
|
-
maxReconnectAttempts;
|
|
32
|
-
/** Custom WebSocket constructor (defaults to global WebSocket) */
|
|
33
|
-
WebSocketCtor;
|
|
34
|
-
constructor(config) {
|
|
35
|
-
// Convert HTTP URL to WebSocket URL if needed
|
|
36
|
-
const baseUrl = config.wsUrl ?? config.baseUrl;
|
|
37
|
-
this.wsUrl = baseUrl
|
|
38
|
-
.replace(/^http:/, "ws:")
|
|
39
|
-
.replace(/^https:/, "wss:")
|
|
40
|
-
.replace(/\/$/, "");
|
|
41
|
-
this.protocols = config.protocols;
|
|
42
|
-
this.token = config.token;
|
|
43
|
-
this.reconnectDelay = config.reconnectDelay ?? 1000;
|
|
44
|
-
this.maxReconnectAttempts = config.maxReconnectAttempts ?? 10;
|
|
45
|
-
// Use custom implementation or fall back to global
|
|
46
|
-
this.WebSocketCtor = config.WebSocket ?? globalThis.WebSocket;
|
|
47
|
-
}
|
|
48
|
-
get state() {
|
|
49
|
-
return this._state;
|
|
50
|
-
}
|
|
51
|
-
setState(state) {
|
|
52
|
-
if (this._state === state)
|
|
53
|
-
return;
|
|
54
|
-
this._state = state;
|
|
55
|
-
for (const handler of this.stateHandlers) {
|
|
56
|
-
try {
|
|
57
|
-
handler(state);
|
|
58
|
-
}
|
|
59
|
-
catch (error) {
|
|
60
|
-
console.error("Error in state handler:", error);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Connect to WebSocket server.
|
|
66
|
-
*/
|
|
67
|
-
async connect(sessionId, metadata) {
|
|
68
|
-
if (this._state === "connected") {
|
|
69
|
-
throw new Error("Already connected");
|
|
70
|
-
}
|
|
71
|
-
this.sessionId = sessionId;
|
|
72
|
-
this.metadata = metadata;
|
|
73
|
-
this.reconnectAttempts = 0;
|
|
74
|
-
this.setState("connecting");
|
|
75
|
-
try {
|
|
76
|
-
await this.connectWebSocket();
|
|
77
|
-
this.setState("connected");
|
|
78
|
-
}
|
|
79
|
-
catch (error) {
|
|
80
|
-
this.setState("error");
|
|
81
|
-
throw error;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
async connectWebSocket() {
|
|
85
|
-
if (!this.sessionId) {
|
|
86
|
-
throw new Error("Session ID required");
|
|
87
|
-
}
|
|
88
|
-
// Close existing connection
|
|
89
|
-
this.closeWebSocket();
|
|
90
|
-
// Build WebSocket URL with query params
|
|
91
|
-
const url = new URL(this.wsUrl);
|
|
92
|
-
url.searchParams.set("sessionId", this.sessionId);
|
|
93
|
-
if (this.metadata?.userId) {
|
|
94
|
-
url.searchParams.set("userId", String(this.metadata.userId));
|
|
95
|
-
}
|
|
96
|
-
if (this.token) {
|
|
97
|
-
url.searchParams.set("token", this.token);
|
|
98
|
-
}
|
|
99
|
-
return new Promise((resolve, reject) => {
|
|
100
|
-
try {
|
|
101
|
-
this.ws = new this.WebSocketCtor(url.toString(), this.protocols);
|
|
102
|
-
this.ws.onopen = () => {
|
|
103
|
-
this.reconnectAttempts = 0;
|
|
104
|
-
resolve();
|
|
105
|
-
};
|
|
106
|
-
this.ws.onmessage = (event) => {
|
|
107
|
-
try {
|
|
108
|
-
const channelEvent = JSON.parse(event.data);
|
|
109
|
-
this.notifyReceive(channelEvent);
|
|
110
|
-
}
|
|
111
|
-
catch (error) {
|
|
112
|
-
console.error("Failed to parse WebSocket message:", error);
|
|
113
|
-
}
|
|
114
|
-
};
|
|
115
|
-
this.ws.onerror = () => {
|
|
116
|
-
if (this._state === "connecting") {
|
|
117
|
-
reject(new Error("WebSocket connection failed"));
|
|
118
|
-
}
|
|
119
|
-
};
|
|
120
|
-
this.ws.onclose = () => {
|
|
121
|
-
if (this._state === "disconnected") {
|
|
122
|
-
// Intentional disconnect
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
this.handleReconnect();
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
catch (error) {
|
|
129
|
-
reject(error);
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
handleReconnect() {
|
|
134
|
-
if (this.reconnectAttempts >= this.maxReconnectAttempts) {
|
|
135
|
-
console.error("Max reconnection attempts reached");
|
|
136
|
-
this.setState("error");
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
this.reconnectAttempts++;
|
|
140
|
-
const delay = this.reconnectDelay * Math.min(this.reconnectAttempts, 5);
|
|
141
|
-
this.reconnectTimer = setTimeout(() => {
|
|
142
|
-
if (this.sessionId && this._state !== "disconnected") {
|
|
143
|
-
this.connectWebSocket()
|
|
144
|
-
.then(() => this.setState("connected"))
|
|
145
|
-
.catch((error) => {
|
|
146
|
-
console.error("Reconnection failed:", error);
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
}, delay);
|
|
150
|
-
}
|
|
151
|
-
closeWebSocket() {
|
|
152
|
-
if (this.ws) {
|
|
153
|
-
this.ws.close();
|
|
154
|
-
this.ws = undefined;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Disconnect from server.
|
|
159
|
-
*/
|
|
160
|
-
async disconnect() {
|
|
161
|
-
if (this.reconnectTimer) {
|
|
162
|
-
clearTimeout(this.reconnectTimer);
|
|
163
|
-
this.reconnectTimer = undefined;
|
|
164
|
-
}
|
|
165
|
-
this.setState("disconnected"); // Set before close to prevent reconnect
|
|
166
|
-
this.closeWebSocket();
|
|
167
|
-
this.sessionId = undefined;
|
|
168
|
-
this.metadata = undefined;
|
|
169
|
-
this.reconnectAttempts = 0;
|
|
170
|
-
}
|
|
171
|
-
/**
|
|
172
|
-
* Send event via WebSocket.
|
|
173
|
-
*/
|
|
174
|
-
async send(event) {
|
|
175
|
-
if (!this.ws || this._state !== "connected") {
|
|
176
|
-
throw new Error("Not connected");
|
|
177
|
-
}
|
|
178
|
-
this.ws.send(JSON.stringify({
|
|
179
|
-
...event,
|
|
180
|
-
metadata: {
|
|
181
|
-
...event.metadata,
|
|
182
|
-
sessionId: this.sessionId,
|
|
183
|
-
userId: this.metadata?.userId,
|
|
184
|
-
timestamp: Date.now(),
|
|
185
|
-
},
|
|
186
|
-
}));
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Register receive handler.
|
|
190
|
-
*/
|
|
191
|
-
onReceive(handler) {
|
|
192
|
-
this.receiveHandlers.add(handler);
|
|
193
|
-
return () => {
|
|
194
|
-
this.receiveHandlers.delete(handler);
|
|
195
|
-
};
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* Register state change handler.
|
|
199
|
-
*/
|
|
200
|
-
onStateChange(handler) {
|
|
201
|
-
this.stateHandlers.add(handler);
|
|
202
|
-
return () => {
|
|
203
|
-
this.stateHandlers.delete(handler);
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
notifyReceive(event) {
|
|
207
|
-
for (const handler of this.receiveHandlers) {
|
|
208
|
-
try {
|
|
209
|
-
handler(event);
|
|
210
|
-
}
|
|
211
|
-
catch (error) {
|
|
212
|
-
console.error("Error in receive handler:", error);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
/**
|
|
218
|
-
* Create WebSocket transport.
|
|
219
|
-
*
|
|
220
|
-
* @example
|
|
221
|
-
* ```typescript
|
|
222
|
-
* // Browser usage
|
|
223
|
-
* const transport = createWebSocketTransport({
|
|
224
|
-
* baseUrl: 'wss://api.example.com',
|
|
225
|
-
* });
|
|
226
|
-
*
|
|
227
|
-
* // Node.js with ws package
|
|
228
|
-
* import WebSocket from 'ws';
|
|
229
|
-
*
|
|
230
|
-
* const nodeTransport = createWebSocketTransport({
|
|
231
|
-
* baseUrl: 'wss://api.example.com',
|
|
232
|
-
* WebSocket: WebSocket as unknown as WebSocketConstructor,
|
|
233
|
-
* });
|
|
234
|
-
* ```
|
|
235
|
-
*/
|
|
236
|
-
export function createWebSocketTransport(config) {
|
|
237
|
-
return new WebSocketTransport(config);
|
|
238
|
-
}
|
|
239
|
-
//# sourceMappingURL=websocket.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/transports/websocket.ts"],"names":[],"mappings":"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"}
|