@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentick/client",
3
- "version": "0.0.1",
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.0.1"
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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"}
@@ -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"}
@@ -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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"}