@agentick/gateway 0.0.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.
- package/LICENSE +21 -0
- package/README.md +477 -0
- package/dist/agent-registry.d.ts +51 -0
- package/dist/agent-registry.d.ts.map +1 -0
- package/dist/agent-registry.js +78 -0
- package/dist/agent-registry.js.map +1 -0
- package/dist/app-registry.d.ts +51 -0
- package/dist/app-registry.d.ts.map +1 -0
- package/dist/app-registry.js +78 -0
- package/dist/app-registry.js.map +1 -0
- package/dist/bin.d.ts +8 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +37 -0
- package/dist/bin.js.map +1 -0
- package/dist/gateway.d.ts +165 -0
- package/dist/gateway.d.ts.map +1 -0
- package/dist/gateway.js +1339 -0
- package/dist/gateway.js.map +1 -0
- package/dist/http-transport.d.ts +65 -0
- package/dist/http-transport.d.ts.map +1 -0
- package/dist/http-transport.js +517 -0
- package/dist/http-transport.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/protocol.d.ts +162 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +16 -0
- package/dist/protocol.js.map +1 -0
- package/dist/session-manager.d.ts +101 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +208 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/testing.d.ts +92 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +129 -0
- package/dist/testing.js.map +1 -0
- package/dist/transport-protocol.d.ts +162 -0
- package/dist/transport-protocol.d.ts.map +1 -0
- package/dist/transport-protocol.js +16 -0
- package/dist/transport-protocol.js.map +1 -0
- package/dist/transport.d.ts +115 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +56 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +314 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +37 -0
- package/dist/types.js.map +1 -0
- package/dist/websocket-server.d.ts +87 -0
- package/dist/websocket-server.d.ts.map +1 -0
- package/dist/websocket-server.js +245 -0
- package/dist/websocket-server.js.map +1 -0
- package/dist/ws-transport.d.ts +17 -0
- package/dist/ws-transport.d.ts.map +1 -0
- package/dist/ws-transport.js +174 -0
- package/dist/ws-transport.js.map +1 -0
- package/package.json +51 -0
- package/src/__tests__/custom-methods.spec.ts +220 -0
- package/src/__tests__/gateway-methods.spec.ts +262 -0
- package/src/__tests__/gateway.spec.ts +404 -0
- package/src/__tests__/guards.spec.ts +235 -0
- package/src/__tests__/protocol.spec.ts +58 -0
- package/src/__tests__/session-manager.spec.ts +220 -0
- package/src/__tests__/ws-transport.spec.ts +246 -0
- package/src/app-registry.ts +103 -0
- package/src/bin.ts +38 -0
- package/src/gateway.ts +1712 -0
- package/src/http-transport.ts +623 -0
- package/src/index.ts +94 -0
- package/src/session-manager.ts +272 -0
- package/src/testing.ts +236 -0
- package/src/transport-protocol.ts +249 -0
- package/src/transport.ts +191 -0
- package/src/types.ts +392 -0
- package/src/websocket-server.ts +303 -0
- package/src/ws-transport.ts +205 -0
package/dist/testing.js
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway Testing Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides helpers for testing gateway interactions.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import { createTestGateway, createMockApp } from '@agentick/gateway/testing';
|
|
9
|
+
*
|
|
10
|
+
* test('gateway handles messages', async () => {
|
|
11
|
+
* const mockApp = createMockApp({
|
|
12
|
+
* response: 'Hello!',
|
|
13
|
+
* });
|
|
14
|
+
*
|
|
15
|
+
* const { gateway, client, cleanup } = await createTestGateway({
|
|
16
|
+
* agents: { chat: mockApp },
|
|
17
|
+
* defaultAgent: 'chat',
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* try {
|
|
21
|
+
* const response = await client.send('main', 'Hi there');
|
|
22
|
+
* expect(response.payload.messageId).toBeDefined();
|
|
23
|
+
* } finally {
|
|
24
|
+
* await cleanup();
|
|
25
|
+
* }
|
|
26
|
+
* });
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* @module @agentick/gateway/testing
|
|
30
|
+
*/
|
|
31
|
+
import WebSocket from "ws";
|
|
32
|
+
import { createGateway } from "./gateway.js";
|
|
33
|
+
// Re-export mock factories from core
|
|
34
|
+
export { createMockApp, createMockSession, createMockExecutionHandle, createTestProcedure, } from "@agentick/core/testing";
|
|
35
|
+
/**
|
|
36
|
+
* Create a test gateway with a connected client.
|
|
37
|
+
*
|
|
38
|
+
* Automatically handles port allocation, client connection, and cleanup.
|
|
39
|
+
*/
|
|
40
|
+
export async function createTestGateway(options) {
|
|
41
|
+
// Use random high port to avoid conflicts
|
|
42
|
+
const port = options.port ?? 19000 + Math.floor(Math.random() * 1000);
|
|
43
|
+
const host = "127.0.0.1";
|
|
44
|
+
const url = `ws://${host}:${port}`;
|
|
45
|
+
const gateway = createGateway({
|
|
46
|
+
...options,
|
|
47
|
+
port,
|
|
48
|
+
host,
|
|
49
|
+
});
|
|
50
|
+
await gateway.start();
|
|
51
|
+
// Create and connect client
|
|
52
|
+
const ws = new WebSocket(url);
|
|
53
|
+
await new Promise((resolve, reject) => {
|
|
54
|
+
ws.on("open", () => resolve());
|
|
55
|
+
ws.on("error", reject);
|
|
56
|
+
});
|
|
57
|
+
// Authenticate
|
|
58
|
+
ws.send(JSON.stringify({ type: "connect", clientId: "test-client" }));
|
|
59
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
60
|
+
let requestId = 0;
|
|
61
|
+
const pendingRequests = new Map();
|
|
62
|
+
ws.on("message", (data) => {
|
|
63
|
+
const msg = JSON.parse(data.toString());
|
|
64
|
+
if (msg.type === "res" && pendingRequests.has(msg.id)) {
|
|
65
|
+
const { resolve } = pendingRequests.get(msg.id);
|
|
66
|
+
pendingRequests.delete(msg.id);
|
|
67
|
+
resolve({ ok: msg.ok, payload: msg.payload, error: msg.error });
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
const client = {
|
|
71
|
+
ws,
|
|
72
|
+
async request(method, params = {}) {
|
|
73
|
+
const id = `req-${++requestId}`;
|
|
74
|
+
return new Promise((resolve, reject) => {
|
|
75
|
+
pendingRequests.set(id, { resolve, reject });
|
|
76
|
+
ws.send(JSON.stringify({ type: "req", id, method, params }));
|
|
77
|
+
// Timeout after 5s
|
|
78
|
+
setTimeout(() => {
|
|
79
|
+
if (pendingRequests.has(id)) {
|
|
80
|
+
pendingRequests.delete(id);
|
|
81
|
+
reject(new Error(`Request ${method} timed out`));
|
|
82
|
+
}
|
|
83
|
+
}, 5000);
|
|
84
|
+
});
|
|
85
|
+
},
|
|
86
|
+
async send(sessionId, message) {
|
|
87
|
+
return this.request("send", { sessionId, message });
|
|
88
|
+
},
|
|
89
|
+
async collectEvents(sessionId, timeout = 1000) {
|
|
90
|
+
const events = [];
|
|
91
|
+
const handler = (data) => {
|
|
92
|
+
const msg = JSON.parse(data.toString());
|
|
93
|
+
if (msg.type === "event" && msg.sessionId === sessionId) {
|
|
94
|
+
events.push({ type: msg.event, data: msg.data });
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
ws.on("message", handler);
|
|
98
|
+
await new Promise((r) => setTimeout(r, timeout));
|
|
99
|
+
ws.off("message", handler);
|
|
100
|
+
return events;
|
|
101
|
+
},
|
|
102
|
+
close() {
|
|
103
|
+
ws.close();
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
const cleanup = async () => {
|
|
107
|
+
client.close();
|
|
108
|
+
await gateway.stop();
|
|
109
|
+
};
|
|
110
|
+
return { gateway, client, url, port, cleanup };
|
|
111
|
+
}
|
|
112
|
+
// ============================================================================
|
|
113
|
+
// Event Helpers
|
|
114
|
+
// ============================================================================
|
|
115
|
+
/**
|
|
116
|
+
* Wait for a specific gateway event.
|
|
117
|
+
*/
|
|
118
|
+
export function waitForGatewayEvent(gateway, event, timeout = 5000) {
|
|
119
|
+
return new Promise((resolve, reject) => {
|
|
120
|
+
const timer = setTimeout(() => {
|
|
121
|
+
reject(new Error(`Timeout waiting for gateway event: ${event}`));
|
|
122
|
+
}, timeout);
|
|
123
|
+
gateway.on(event, (payload) => {
|
|
124
|
+
clearTimeout(timer);
|
|
125
|
+
resolve(payload);
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway Protocol Types
|
|
3
|
+
*
|
|
4
|
+
* Defines the WebSocket message protocol between clients and the gateway.
|
|
5
|
+
*/
|
|
6
|
+
export interface ConnectMessage {
|
|
7
|
+
type: "connect";
|
|
8
|
+
clientId: string;
|
|
9
|
+
token?: string;
|
|
10
|
+
metadata?: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
export interface RequestMessage {
|
|
13
|
+
type: "req";
|
|
14
|
+
id: string;
|
|
15
|
+
method: GatewayMethod;
|
|
16
|
+
params: Record<string, unknown>;
|
|
17
|
+
}
|
|
18
|
+
export interface PingMessage {
|
|
19
|
+
type: "ping";
|
|
20
|
+
timestamp: number;
|
|
21
|
+
}
|
|
22
|
+
export type ClientMessage = ConnectMessage | RequestMessage | PingMessage;
|
|
23
|
+
export interface ConnectedMessage {
|
|
24
|
+
type: "connected";
|
|
25
|
+
gatewayId: string;
|
|
26
|
+
apps: string[];
|
|
27
|
+
sessions: string[];
|
|
28
|
+
}
|
|
29
|
+
export interface ResponseMessage {
|
|
30
|
+
type: "res";
|
|
31
|
+
id: string;
|
|
32
|
+
ok: boolean;
|
|
33
|
+
payload?: unknown;
|
|
34
|
+
error?: {
|
|
35
|
+
code: string;
|
|
36
|
+
message: string;
|
|
37
|
+
details?: unknown;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export interface EventMessage {
|
|
41
|
+
type: "event";
|
|
42
|
+
event: GatewayEventType;
|
|
43
|
+
sessionId: string;
|
|
44
|
+
data: unknown;
|
|
45
|
+
}
|
|
46
|
+
export interface PongMessage {
|
|
47
|
+
type: "pong";
|
|
48
|
+
timestamp: number;
|
|
49
|
+
}
|
|
50
|
+
export interface ErrorMessage {
|
|
51
|
+
type: "error";
|
|
52
|
+
code: string;
|
|
53
|
+
message: string;
|
|
54
|
+
}
|
|
55
|
+
export type GatewayMessage = ConnectedMessage | ResponseMessage | EventMessage | PongMessage | ErrorMessage;
|
|
56
|
+
/**
|
|
57
|
+
* Built-in gateway methods with autocomplete support.
|
|
58
|
+
*/
|
|
59
|
+
export type BuiltInMethod = "send" | "abort" | "status" | "history" | "reset" | "close" | "apps" | "sessions" | "subscribe" | "unsubscribe";
|
|
60
|
+
/**
|
|
61
|
+
* Gateway method - built-in methods or custom method strings.
|
|
62
|
+
* The (string & {}) allows any string while preserving autocomplete for built-in methods.
|
|
63
|
+
*/
|
|
64
|
+
export type GatewayMethod = BuiltInMethod | (string & {});
|
|
65
|
+
export type GatewayEventType = "content_delta" | "content_block_start" | "content_block_end" | "tool_call_start" | "tool_call_delta" | "tool_result" | "message_start" | "message_end" | "error";
|
|
66
|
+
export interface SendParams {
|
|
67
|
+
sessionId: string;
|
|
68
|
+
message: string;
|
|
69
|
+
attachments?: Array<{
|
|
70
|
+
type: "image" | "file";
|
|
71
|
+
data: string;
|
|
72
|
+
mimeType: string;
|
|
73
|
+
name?: string;
|
|
74
|
+
}>;
|
|
75
|
+
}
|
|
76
|
+
export interface AbortParams {
|
|
77
|
+
sessionId: string;
|
|
78
|
+
}
|
|
79
|
+
export interface StatusParams {
|
|
80
|
+
sessionId?: string;
|
|
81
|
+
}
|
|
82
|
+
export interface HistoryParams {
|
|
83
|
+
sessionId: string;
|
|
84
|
+
limit?: number;
|
|
85
|
+
before?: string;
|
|
86
|
+
}
|
|
87
|
+
export interface ResetParams {
|
|
88
|
+
sessionId: string;
|
|
89
|
+
}
|
|
90
|
+
export interface CloseParams {
|
|
91
|
+
sessionId: string;
|
|
92
|
+
}
|
|
93
|
+
export interface SubscribeParams {
|
|
94
|
+
sessionId: string;
|
|
95
|
+
}
|
|
96
|
+
export interface UnsubscribeParams {
|
|
97
|
+
sessionId: string;
|
|
98
|
+
}
|
|
99
|
+
export interface StatusPayload {
|
|
100
|
+
gateway: {
|
|
101
|
+
id: string;
|
|
102
|
+
uptime: number;
|
|
103
|
+
clients: number;
|
|
104
|
+
sessions: number;
|
|
105
|
+
apps: string[];
|
|
106
|
+
};
|
|
107
|
+
session?: {
|
|
108
|
+
id: string;
|
|
109
|
+
appId: string;
|
|
110
|
+
messageCount: number;
|
|
111
|
+
createdAt: string;
|
|
112
|
+
lastActivityAt: string;
|
|
113
|
+
isActive: boolean;
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
export interface HistoryPayload {
|
|
117
|
+
messages: Array<{
|
|
118
|
+
id: string;
|
|
119
|
+
role: "user" | "assistant" | "system";
|
|
120
|
+
content: string;
|
|
121
|
+
timestamp: string;
|
|
122
|
+
toolCalls?: Array<{
|
|
123
|
+
name: string;
|
|
124
|
+
input: unknown;
|
|
125
|
+
output?: unknown;
|
|
126
|
+
}>;
|
|
127
|
+
}>;
|
|
128
|
+
hasMore: boolean;
|
|
129
|
+
}
|
|
130
|
+
export interface AppsPayload {
|
|
131
|
+
apps: Array<{
|
|
132
|
+
id: string;
|
|
133
|
+
name: string;
|
|
134
|
+
description?: string;
|
|
135
|
+
isDefault: boolean;
|
|
136
|
+
}>;
|
|
137
|
+
}
|
|
138
|
+
export interface SessionsPayload {
|
|
139
|
+
sessions: Array<{
|
|
140
|
+
id: string;
|
|
141
|
+
appId: string;
|
|
142
|
+
createdAt: string;
|
|
143
|
+
lastActivityAt: string;
|
|
144
|
+
messageCount: number;
|
|
145
|
+
}>;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Session keys follow the format: [app:]name
|
|
149
|
+
*
|
|
150
|
+
* Examples:
|
|
151
|
+
* - "main" → default app, "main" session
|
|
152
|
+
* - "chat:main" → "chat" app, "main" session
|
|
153
|
+
* - "research:task-123" → "research" app, "task-123" session
|
|
154
|
+
* - "whatsapp:+1234567890" → WhatsApp channel session
|
|
155
|
+
*/
|
|
156
|
+
export interface SessionKey {
|
|
157
|
+
appId: string;
|
|
158
|
+
sessionName: string;
|
|
159
|
+
}
|
|
160
|
+
export declare function parseSessionKey(key: string, defaultApp: string): SessionKey;
|
|
161
|
+
export declare function formatSessionKey(key: SessionKey): string;
|
|
162
|
+
//# sourceMappingURL=transport-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-protocol.d.ts","sourceRoot":"","sources":["../src/transport-protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway Protocol Types
|
|
3
|
+
*
|
|
4
|
+
* Defines the WebSocket message protocol between clients and the gateway.
|
|
5
|
+
*/
|
|
6
|
+
export function parseSessionKey(key, defaultApp) {
|
|
7
|
+
const parts = key.split(":");
|
|
8
|
+
if (parts.length === 1) {
|
|
9
|
+
return { appId: defaultApp, sessionName: parts[0] };
|
|
10
|
+
}
|
|
11
|
+
return { appId: parts[0], sessionName: parts.slice(1).join(":") };
|
|
12
|
+
}
|
|
13
|
+
export function formatSessionKey(key) {
|
|
14
|
+
return `${key.appId}:${key.sessionName}`;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=transport-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-protocol.js","sourceRoot":"","sources":["../src/transport-protocol.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA0OH,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,UAAkB;IAC7D,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAe;IAC9C,OAAO,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway Transport Interface
|
|
3
|
+
*
|
|
4
|
+
* Abstracts the transport layer (WebSocket, HTTP/SSE) from gateway business logic.
|
|
5
|
+
* This allows the same GatewayCore to serve clients via different protocols.
|
|
6
|
+
*/
|
|
7
|
+
import type { Message } from "@agentick/shared";
|
|
8
|
+
import { type AuthResult } from "@agentick/server";
|
|
9
|
+
import type { GatewayMessage, ClientMessage } from "./transport-protocol.js";
|
|
10
|
+
import type { AuthConfig, ClientState, UserContext } from "./types.js";
|
|
11
|
+
/**
|
|
12
|
+
* A connected client from the transport's perspective.
|
|
13
|
+
*/
|
|
14
|
+
export interface TransportClient {
|
|
15
|
+
/** Unique client identifier */
|
|
16
|
+
readonly id: string;
|
|
17
|
+
/** Client state (auth, subscriptions, etc.) */
|
|
18
|
+
readonly state: ClientState;
|
|
19
|
+
/** Send a message to this client */
|
|
20
|
+
send(message: GatewayMessage): void;
|
|
21
|
+
/** Close the connection */
|
|
22
|
+
close(code?: number, reason?: string): void;
|
|
23
|
+
/** Check if connected */
|
|
24
|
+
readonly isConnected: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Events emitted by a transport.
|
|
28
|
+
*/
|
|
29
|
+
export interface TransportEvents {
|
|
30
|
+
/** Client connected (may not be authenticated yet) */
|
|
31
|
+
connection: (client: TransportClient) => void;
|
|
32
|
+
/** Client disconnected */
|
|
33
|
+
disconnect: (clientId: string, reason?: string) => void;
|
|
34
|
+
/** Message received from authenticated client */
|
|
35
|
+
message: (clientId: string, message: ClientMessage) => void;
|
|
36
|
+
/** Transport error */
|
|
37
|
+
error: (error: Error) => void;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Transport configuration.
|
|
41
|
+
*/
|
|
42
|
+
export interface TransportConfig {
|
|
43
|
+
/** Port to listen on */
|
|
44
|
+
port: number;
|
|
45
|
+
/** Host to bind to */
|
|
46
|
+
host: string;
|
|
47
|
+
/** Authentication configuration */
|
|
48
|
+
auth?: AuthConfig;
|
|
49
|
+
/**
|
|
50
|
+
* Direct send handler for HTTP transport.
|
|
51
|
+
* Called instead of routing through message handler when streaming response is needed.
|
|
52
|
+
* Accepts full Message object to support multimodal content (images, audio, video, docs).
|
|
53
|
+
*/
|
|
54
|
+
onDirectSend?: (sessionId: string, message: Message) => AsyncIterable<{
|
|
55
|
+
type: string;
|
|
56
|
+
data?: unknown;
|
|
57
|
+
}>;
|
|
58
|
+
/**
|
|
59
|
+
* Method invocation handler for HTTP transport.
|
|
60
|
+
* Called to execute custom gateway methods.
|
|
61
|
+
* Returns the method result directly (no streaming).
|
|
62
|
+
*/
|
|
63
|
+
onInvoke?: (method: string, params: Record<string, unknown>, user?: UserContext) => Promise<unknown>;
|
|
64
|
+
}
|
|
65
|
+
/** Transport type identifier */
|
|
66
|
+
export type TransportType = "websocket" | "http" | "sse";
|
|
67
|
+
/**
|
|
68
|
+
* Transport interface - abstracts WebSocket vs HTTP/SSE.
|
|
69
|
+
*/
|
|
70
|
+
export interface Transport {
|
|
71
|
+
/** Transport type identifier */
|
|
72
|
+
readonly type: TransportType;
|
|
73
|
+
/** Start the transport server */
|
|
74
|
+
start(): Promise<void>;
|
|
75
|
+
/** Stop the transport server */
|
|
76
|
+
stop(): Promise<void>;
|
|
77
|
+
/** Register event handlers */
|
|
78
|
+
on<K extends keyof TransportEvents>(event: K, handler: TransportEvents[K]): void;
|
|
79
|
+
/** Get a client by ID */
|
|
80
|
+
getClient(id: string): TransportClient | undefined;
|
|
81
|
+
/** Get all connected clients */
|
|
82
|
+
getClients(): TransportClient[];
|
|
83
|
+
/** Get authenticated clients */
|
|
84
|
+
getAuthenticatedClients(): TransportClient[];
|
|
85
|
+
/** Broadcast to all authenticated clients */
|
|
86
|
+
broadcast(message: GatewayMessage): void;
|
|
87
|
+
/** Send to clients subscribed to a session */
|
|
88
|
+
sendToSubscribers(sessionId: string, message: GatewayMessage): void;
|
|
89
|
+
/** Number of connected clients */
|
|
90
|
+
readonly clientCount: number;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Base class with shared transport functionality.
|
|
94
|
+
*/
|
|
95
|
+
export declare abstract class BaseTransport implements Transport {
|
|
96
|
+
/** Transport type - must be set by subclass */
|
|
97
|
+
abstract readonly type: TransportType;
|
|
98
|
+
protected clients: Map<string, TransportClient>;
|
|
99
|
+
protected handlers: Partial<TransportEvents>;
|
|
100
|
+
protected config: TransportConfig;
|
|
101
|
+
protected clientIdCounter: number;
|
|
102
|
+
constructor(config: TransportConfig);
|
|
103
|
+
abstract start(): Promise<void>;
|
|
104
|
+
abstract stop(): Promise<void>;
|
|
105
|
+
on<K extends keyof TransportEvents>(event: K, handler: TransportEvents[K]): void;
|
|
106
|
+
getClient(id: string): TransportClient | undefined;
|
|
107
|
+
getClients(): TransportClient[];
|
|
108
|
+
getAuthenticatedClients(): TransportClient[];
|
|
109
|
+
broadcast(message: GatewayMessage): void;
|
|
110
|
+
sendToSubscribers(sessionId: string, message: GatewayMessage): void;
|
|
111
|
+
get clientCount(): number;
|
|
112
|
+
protected generateClientId(): string;
|
|
113
|
+
protected validateAuth(token?: string): Promise<AuthResult>;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway Transport Interface
|
|
3
|
+
*
|
|
4
|
+
* Abstracts the transport layer (WebSocket, HTTP/SSE) from gateway business logic.
|
|
5
|
+
* This allows the same GatewayCore to serve clients via different protocols.
|
|
6
|
+
*/
|
|
7
|
+
import { validateAuth } from "@agentick/server";
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Base Transport Implementation (shared logic)
|
|
10
|
+
// ============================================================================
|
|
11
|
+
/**
|
|
12
|
+
* Base class with shared transport functionality.
|
|
13
|
+
*/
|
|
14
|
+
export class BaseTransport {
|
|
15
|
+
clients = new Map();
|
|
16
|
+
handlers = {};
|
|
17
|
+
config;
|
|
18
|
+
clientIdCounter = 0;
|
|
19
|
+
constructor(config) {
|
|
20
|
+
this.config = config;
|
|
21
|
+
}
|
|
22
|
+
on(event, handler) {
|
|
23
|
+
this.handlers[event] = handler;
|
|
24
|
+
}
|
|
25
|
+
getClient(id) {
|
|
26
|
+
return this.clients.get(id);
|
|
27
|
+
}
|
|
28
|
+
getClients() {
|
|
29
|
+
return Array.from(this.clients.values());
|
|
30
|
+
}
|
|
31
|
+
getAuthenticatedClients() {
|
|
32
|
+
return this.getClients().filter((c) => c.state.authenticated);
|
|
33
|
+
}
|
|
34
|
+
broadcast(message) {
|
|
35
|
+
for (const client of this.getAuthenticatedClients()) {
|
|
36
|
+
client.send(message);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
sendToSubscribers(sessionId, message) {
|
|
40
|
+
for (const client of this.getAuthenticatedClients()) {
|
|
41
|
+
if (client.state.subscriptions.has(sessionId)) {
|
|
42
|
+
client.send(message);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
get clientCount() {
|
|
47
|
+
return this.clients.size;
|
|
48
|
+
}
|
|
49
|
+
generateClientId() {
|
|
50
|
+
return `client-${++this.clientIdCounter}`;
|
|
51
|
+
}
|
|
52
|
+
validateAuth(token) {
|
|
53
|
+
return validateAuth(token, this.config.auth);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,YAAY,EAAmB,MAAM,kBAAkB,CAAC;AAsHjE,+EAA+E;AAC/E,+CAA+C;AAC/C,+EAA+E;AAE/E;;GAEG;AACH,MAAM,OAAgB,aAAa;IAIvB,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC7C,QAAQ,GAA6B,EAAE,CAAC;IACxC,MAAM,CAAkB;IACxB,eAAe,GAAG,CAAC,CAAC;IAE9B,YAAY,MAAuB;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAKD,EAAE,CAAkC,KAAQ,EAAE,OAA2B;QACvE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;IACjC,CAAC;IAED,SAAS,CAAC,EAAU;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,UAAU;QACR,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,uBAAuB;QACrB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAChE,CAAC;IAED,SAAS,CAAC,OAAuB;QAC/B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,iBAAiB,CAAC,SAAiB,EAAE,OAAuB;QAC1D,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;YACpD,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAES,gBAAgB;QACxB,OAAO,UAAU,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;IAC5C,CAAC;IAES,YAAY,CAAC,KAAc;QACnC,OAAO,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;CACF"}
|