@kb-labs/host-agent-transport 0.2.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/package.json +22 -17
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# TODO
|
package/dist/index.js
CHANGED
|
@@ -10,6 +10,7 @@ var NdjsonFramer = class {
|
|
|
10
10
|
constructor(onMessage) {
|
|
11
11
|
this.onMessage = onMessage;
|
|
12
12
|
}
|
|
13
|
+
onMessage;
|
|
13
14
|
buffer = "";
|
|
14
15
|
/** Feed raw data from socket. Returns false if buffer limit exceeded (socket is closed). */
|
|
15
16
|
feed(socket, chunk) {
|
|
@@ -51,6 +52,7 @@ var UnixSocketTransport = class {
|
|
|
51
52
|
constructor(socketPath) {
|
|
52
53
|
this.socketPath = socketPath;
|
|
53
54
|
}
|
|
55
|
+
socketPath;
|
|
54
56
|
server = null;
|
|
55
57
|
socket = null;
|
|
56
58
|
messageHandler = null;
|
|
@@ -167,6 +169,8 @@ var TcpTransport = class {
|
|
|
167
169
|
this.port = port;
|
|
168
170
|
this.host = host;
|
|
169
171
|
}
|
|
172
|
+
port;
|
|
173
|
+
host;
|
|
170
174
|
server = null;
|
|
171
175
|
socket = null;
|
|
172
176
|
messageHandler = null;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ndjson-framer.ts","../src/unix-socket.ts","../src/named-pipe.ts","../src/tcp.ts","../src/auto.ts"],"names":["net"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * NdjsonFramer — shared NDJSON framing logic for all transport implementations.\n *\n * Accumulates chunks, splits on newlines, emits complete JSON messages.\n * Guards against oversized buffers (DoS protection).\n */\n\nimport type net from 'node:net';\n\nconst MAX_BUFFER_BYTES = 1024 * 1024; // 1 MB\n\nexport class NdjsonFramer {\n private buffer = '';\n\n constructor(private readonly onMessage: (msg: unknown) => void) {}\n\n /** Feed raw data from socket. Returns false if buffer limit exceeded (socket is closed). */\n feed(socket: net.Socket, chunk: Buffer | string): boolean {\n if (Buffer.byteLength(this.buffer) + Buffer.byteLength(chunk as string) > MAX_BUFFER_BYTES) {\n console.warn('[transport] Buffer limit exceeded — closing socket to prevent DoS');\n socket.destroy(new Error('Buffer limit exceeded'));\n return false;\n }\n this.buffer += chunk.toString();\n\n const lines = this.buffer.split('\\n');\n this.buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (!line.trim()) { continue; }\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n console.warn('[transport] Malformed JSON, ignoring line');\n continue;\n }\n this.onMessage(parsed);\n }\n return true;\n }\n\n reset(): void {\n this.buffer = '';\n }\n}\n\nexport function writeNdjson(socket: net.Socket, msg: unknown): void {\n if (!socket.destroyed) {\n socket.write(JSON.stringify(msg) + '\\n');\n }\n}\n","/**\n * UnixSocketTransport — ILocalTransport over Unix domain socket.\n * Default on Linux/macOS.\n */\n\nimport net from 'node:net';\nimport { NdjsonFramer, writeNdjson } from './ndjson-framer.js';\nimport type { ILocalTransport } from './transport.js';\n\nexport class UnixSocketTransport implements ILocalTransport {\n private server: net.Server | null = null;\n private socket: net.Socket | null = null;\n private messageHandler: ((msg: unknown) => void) | null = null;\n\n constructor(private readonly socketPath: string) {}\n\n async listen(): Promise<void> {\n try {\n const { unlink } = await import('node:fs/promises');\n await unlink(this.socketPath);\n } catch { /* stale socket — fine */ }\n\n this.server = net.createServer((conn) => this.handleConnection(conn));\n await new Promise<void>((resolve, reject) => {\n this.server!.listen(this.socketPath, resolve);\n this.server!.once('error', reject);\n });\n\n const { chmod } = await import('node:fs/promises');\n await chmod(this.socketPath, 0o600);\n }\n\n async connect(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.socket = net.createConnection(this.socketPath, resolve);\n this.socket.once('error', reject);\n this.setupSocket(this.socket);\n });\n }\n\n send(msg: unknown): void {\n if (this.socket) { writeNdjson(this.socket, msg); }\n }\n\n onMessage(handler: (msg: unknown) => void): void {\n this.messageHandler = handler;\n }\n\n close(): void {\n this.socket?.destroy();\n this.socket = null;\n this.server?.close();\n this.server = null;\n }\n\n private handleConnection(conn: net.Socket): void {\n this.socket = conn;\n this.setupSocket(conn);\n }\n\n private setupSocket(socket: net.Socket): void {\n const framer = new NdjsonFramer((msg) => this.messageHandler?.(msg));\n socket.on('data', (chunk) => {\n if (!framer.feed(socket, chunk)) { socket.destroy(); }\n });\n socket.on('error', () => socket.destroy());\n socket.on('close', () => { framer.reset(); });\n }\n}\n","/**\n * NamedPipeTransport — ILocalTransport over Windows named pipe.\n * Default on Windows. Uses the same net.createServer API — Node.js\n * treats \\\\.\\pipe\\<name> paths as named pipes automatically.\n */\n\nimport net from 'node:net';\nimport { NdjsonFramer, writeNdjson } from './ndjson-framer.js';\nimport type { ILocalTransport } from './transport.js';\n\nfunction pipePath(name: string): string {\n return `\\\\\\\\.\\\\pipe\\\\${name}`;\n}\n\nexport class NamedPipeTransport implements ILocalTransport {\n private server: net.Server | null = null;\n private socket: net.Socket | null = null;\n private messageHandler: ((msg: unknown) => void) | null = null;\n private readonly path: string;\n\n constructor(pipeName: string) {\n this.path = pipePath(pipeName);\n }\n\n async listen(): Promise<void> {\n this.server = net.createServer((conn) => this.handleConnection(conn));\n await new Promise<void>((resolve, reject) => {\n this.server!.listen(this.path, resolve);\n this.server!.once('error', reject);\n });\n }\n\n async connect(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.socket = net.createConnection(this.path, resolve);\n this.socket.once('error', reject);\n this.setupSocket(this.socket);\n });\n }\n\n send(msg: unknown): void {\n if (this.socket) { writeNdjson(this.socket, msg); }\n }\n\n onMessage(handler: (msg: unknown) => void): void {\n this.messageHandler = handler;\n }\n\n close(): void {\n this.socket?.destroy();\n this.socket = null;\n this.server?.close();\n this.server = null;\n }\n\n private handleConnection(conn: net.Socket): void {\n this.socket = conn;\n this.setupSocket(conn);\n }\n\n private setupSocket(socket: net.Socket): void {\n const framer = new NdjsonFramer((msg) => this.messageHandler?.(msg));\n socket.on('data', (chunk) => {\n if (!framer.feed(socket, chunk)) { socket.destroy(); }\n });\n socket.on('error', () => socket.destroy());\n socket.on('close', () => { framer.reset(); });\n }\n}\n","/**\n * TcpTransport — ILocalTransport over TCP localhost.\n * Universal fallback: works on Linux, macOS, Windows without special paths.\n */\n\nimport net from 'node:net';\nimport { NdjsonFramer, writeNdjson } from './ndjson-framer.js';\nimport type { ILocalTransport } from './transport.js';\n\nexport class TcpTransport implements ILocalTransport {\n private server: net.Server | null = null;\n private socket: net.Socket | null = null;\n private messageHandler: ((msg: unknown) => void) | null = null;\n\n constructor(\n private readonly port: number,\n private readonly host = '127.0.0.1',\n ) {}\n\n async listen(): Promise<void> {\n this.server = net.createServer((conn) => this.handleConnection(conn));\n await new Promise<void>((resolve, reject) => {\n this.server!.listen(this.port, this.host, resolve);\n this.server!.once('error', reject);\n });\n }\n\n async connect(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.socket = net.createConnection(this.port, this.host, resolve);\n this.socket.once('error', reject);\n this.setupSocket(this.socket);\n });\n }\n\n send(msg: unknown): void {\n if (this.socket) { writeNdjson(this.socket, msg); }\n }\n\n onMessage(handler: (msg: unknown) => void): void {\n this.messageHandler = handler;\n }\n\n close(): void {\n this.socket?.destroy();\n this.socket = null;\n this.server?.close();\n this.server = null;\n }\n\n private handleConnection(conn: net.Socket): void {\n this.socket = conn;\n this.setupSocket(conn);\n }\n\n private setupSocket(socket: net.Socket): void {\n const framer = new NdjsonFramer((msg) => this.messageHandler?.(msg));\n socket.on('data', (chunk) => {\n if (!framer.feed(socket, chunk)) { socket.destroy(); }\n });\n socket.on('error', () => socket.destroy());\n socket.on('close', () => { framer.reset(); });\n }\n}\n","/**\n * createTransport — factory that picks the right ILocalTransport\n * based on config.mode (or platform when mode === 'auto').\n *\n * auto resolution:\n * Windows → NamedPipeTransport\n * Linux/Mac → UnixSocketTransport\n */\n\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { ILocalTransport, TransportConfig } from './transport.js';\nimport { UnixSocketTransport } from './unix-socket.js';\nimport { NamedPipeTransport } from './named-pipe.js';\nimport { TcpTransport } from './tcp.js';\n\nconst DEFAULT_SOCKET_PATH = join(homedir(), '.kb', 'agent.sock');\nconst DEFAULT_PIPE_NAME = 'kb-agent';\nconst DEFAULT_TCP_PORT = 7779;\nconst DEFAULT_TCP_HOST = '127.0.0.1';\n\nexport function createTransport(config: TransportConfig): ILocalTransport {\n const mode = config.mode === 'auto'\n ? (process.platform === 'win32' ? 'named-pipe' : 'unix')\n : config.mode;\n\n switch (mode) {\n case 'unix':\n return new UnixSocketTransport(config.socketPath ?? DEFAULT_SOCKET_PATH);\n case 'named-pipe':\n return new NamedPipeTransport(config.pipeName ?? DEFAULT_PIPE_NAME);\n case 'tcp':\n return new TcpTransport(\n config.port ?? DEFAULT_TCP_PORT,\n config.host ?? DEFAULT_TCP_HOST,\n );\n default:\n throw new Error(`Unknown transport mode: ${String(mode)}`);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ndjson-framer.ts","../src/unix-socket.ts","../src/named-pipe.ts","../src/tcp.ts","../src/auto.ts"],"names":["net"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * NdjsonFramer — shared NDJSON framing logic for all transport implementations.\n *\n * Accumulates chunks, splits on newlines, emits complete JSON messages.\n * Guards against oversized buffers (DoS protection).\n */\n\nimport type net from 'node:net';\n\nconst MAX_BUFFER_BYTES = 1024 * 1024; // 1 MB\n\nexport class NdjsonFramer {\n private buffer = '';\n\n constructor(private readonly onMessage: (msg: unknown) => void) {}\n\n /** Feed raw data from socket. Returns false if buffer limit exceeded (socket is closed). */\n feed(socket: net.Socket, chunk: Buffer | string): boolean {\n if (Buffer.byteLength(this.buffer) + Buffer.byteLength(chunk as string) > MAX_BUFFER_BYTES) {\n console.warn('[transport] Buffer limit exceeded — closing socket to prevent DoS');\n socket.destroy(new Error('Buffer limit exceeded'));\n return false;\n }\n this.buffer += chunk.toString();\n\n const lines = this.buffer.split('\\n');\n this.buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (!line.trim()) { continue; }\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n console.warn('[transport] Malformed JSON, ignoring line');\n continue;\n }\n this.onMessage(parsed);\n }\n return true;\n }\n\n reset(): void {\n this.buffer = '';\n }\n}\n\nexport function writeNdjson(socket: net.Socket, msg: unknown): void {\n if (!socket.destroyed) {\n socket.write(JSON.stringify(msg) + '\\n');\n }\n}\n","/**\n * UnixSocketTransport — ILocalTransport over Unix domain socket.\n * Default on Linux/macOS.\n */\n\nimport net from 'node:net';\nimport { NdjsonFramer, writeNdjson } from './ndjson-framer.js';\nimport type { ILocalTransport } from './transport.js';\n\nexport class UnixSocketTransport implements ILocalTransport {\n private server: net.Server | null = null;\n private socket: net.Socket | null = null;\n private messageHandler: ((msg: unknown) => void) | null = null;\n\n constructor(private readonly socketPath: string) {}\n\n async listen(): Promise<void> {\n try {\n const { unlink } = await import('node:fs/promises');\n await unlink(this.socketPath);\n } catch { /* stale socket — fine */ }\n\n this.server = net.createServer((conn) => this.handleConnection(conn));\n await new Promise<void>((resolve, reject) => {\n this.server!.listen(this.socketPath, resolve);\n this.server!.once('error', reject);\n });\n\n const { chmod } = await import('node:fs/promises');\n await chmod(this.socketPath, 0o600);\n }\n\n async connect(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.socket = net.createConnection(this.socketPath, resolve);\n this.socket.once('error', reject);\n this.setupSocket(this.socket);\n });\n }\n\n send(msg: unknown): void {\n if (this.socket) { writeNdjson(this.socket, msg); }\n }\n\n onMessage(handler: (msg: unknown) => void): void {\n this.messageHandler = handler;\n }\n\n close(): void {\n this.socket?.destroy();\n this.socket = null;\n this.server?.close();\n this.server = null;\n }\n\n private handleConnection(conn: net.Socket): void {\n this.socket = conn;\n this.setupSocket(conn);\n }\n\n private setupSocket(socket: net.Socket): void {\n const framer = new NdjsonFramer((msg) => this.messageHandler?.(msg));\n socket.on('data', (chunk) => {\n if (!framer.feed(socket, chunk)) { socket.destroy(); }\n });\n socket.on('error', () => socket.destroy());\n socket.on('close', () => { framer.reset(); });\n }\n}\n","/**\n * NamedPipeTransport — ILocalTransport over Windows named pipe.\n * Default on Windows. Uses the same net.createServer API — Node.js\n * treats \\\\.\\pipe\\<name> paths as named pipes automatically.\n */\n\nimport net from 'node:net';\nimport { NdjsonFramer, writeNdjson } from './ndjson-framer.js';\nimport type { ILocalTransport } from './transport.js';\n\nfunction pipePath(name: string): string {\n return `\\\\\\\\.\\\\pipe\\\\${name}`;\n}\n\nexport class NamedPipeTransport implements ILocalTransport {\n private server: net.Server | null = null;\n private socket: net.Socket | null = null;\n private messageHandler: ((msg: unknown) => void) | null = null;\n private readonly path: string;\n\n constructor(pipeName: string) {\n this.path = pipePath(pipeName);\n }\n\n async listen(): Promise<void> {\n this.server = net.createServer((conn) => this.handleConnection(conn));\n await new Promise<void>((resolve, reject) => {\n this.server!.listen(this.path, resolve);\n this.server!.once('error', reject);\n });\n }\n\n async connect(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.socket = net.createConnection(this.path, resolve);\n this.socket.once('error', reject);\n this.setupSocket(this.socket);\n });\n }\n\n send(msg: unknown): void {\n if (this.socket) { writeNdjson(this.socket, msg); }\n }\n\n onMessage(handler: (msg: unknown) => void): void {\n this.messageHandler = handler;\n }\n\n close(): void {\n this.socket?.destroy();\n this.socket = null;\n this.server?.close();\n this.server = null;\n }\n\n private handleConnection(conn: net.Socket): void {\n this.socket = conn;\n this.setupSocket(conn);\n }\n\n private setupSocket(socket: net.Socket): void {\n const framer = new NdjsonFramer((msg) => this.messageHandler?.(msg));\n socket.on('data', (chunk) => {\n if (!framer.feed(socket, chunk)) { socket.destroy(); }\n });\n socket.on('error', () => socket.destroy());\n socket.on('close', () => { framer.reset(); });\n }\n}\n","/**\n * TcpTransport — ILocalTransport over TCP localhost.\n * Universal fallback: works on Linux, macOS, Windows without special paths.\n */\n\nimport net from 'node:net';\nimport { NdjsonFramer, writeNdjson } from './ndjson-framer.js';\nimport type { ILocalTransport } from './transport.js';\n\nexport class TcpTransport implements ILocalTransport {\n private server: net.Server | null = null;\n private socket: net.Socket | null = null;\n private messageHandler: ((msg: unknown) => void) | null = null;\n\n constructor(\n private readonly port: number,\n private readonly host = '127.0.0.1',\n ) {}\n\n async listen(): Promise<void> {\n this.server = net.createServer((conn) => this.handleConnection(conn));\n await new Promise<void>((resolve, reject) => {\n this.server!.listen(this.port, this.host, resolve);\n this.server!.once('error', reject);\n });\n }\n\n async connect(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.socket = net.createConnection(this.port, this.host, resolve);\n this.socket.once('error', reject);\n this.setupSocket(this.socket);\n });\n }\n\n send(msg: unknown): void {\n if (this.socket) { writeNdjson(this.socket, msg); }\n }\n\n onMessage(handler: (msg: unknown) => void): void {\n this.messageHandler = handler;\n }\n\n close(): void {\n this.socket?.destroy();\n this.socket = null;\n this.server?.close();\n this.server = null;\n }\n\n private handleConnection(conn: net.Socket): void {\n this.socket = conn;\n this.setupSocket(conn);\n }\n\n private setupSocket(socket: net.Socket): void {\n const framer = new NdjsonFramer((msg) => this.messageHandler?.(msg));\n socket.on('data', (chunk) => {\n if (!framer.feed(socket, chunk)) { socket.destroy(); }\n });\n socket.on('error', () => socket.destroy());\n socket.on('close', () => { framer.reset(); });\n }\n}\n","/**\n * createTransport — factory that picks the right ILocalTransport\n * based on config.mode (or platform when mode === 'auto').\n *\n * auto resolution:\n * Windows → NamedPipeTransport\n * Linux/Mac → UnixSocketTransport\n */\n\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport type { ILocalTransport, TransportConfig } from './transport.js';\nimport { UnixSocketTransport } from './unix-socket.js';\nimport { NamedPipeTransport } from './named-pipe.js';\nimport { TcpTransport } from './tcp.js';\n\nconst DEFAULT_SOCKET_PATH = join(homedir(), '.kb', 'agent.sock');\nconst DEFAULT_PIPE_NAME = 'kb-agent';\nconst DEFAULT_TCP_PORT = 7779;\nconst DEFAULT_TCP_HOST = '127.0.0.1';\n\nexport function createTransport(config: TransportConfig): ILocalTransport {\n const mode = config.mode === 'auto'\n ? (process.platform === 'win32' ? 'named-pipe' : 'unix')\n : config.mode;\n\n switch (mode) {\n case 'unix':\n return new UnixSocketTransport(config.socketPath ?? DEFAULT_SOCKET_PATH);\n case 'named-pipe':\n return new NamedPipeTransport(config.pipeName ?? DEFAULT_PIPE_NAME);\n case 'tcp':\n return new TcpTransport(\n config.port ?? DEFAULT_TCP_PORT,\n config.host ?? DEFAULT_TCP_HOST,\n );\n default:\n throw new Error(`Unknown transport mode: ${String(mode)}`);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
"
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
"dependencies": {},
|
|
3
|
+
"devDependencies": {
|
|
4
|
+
"@kb-labs/devkit": "workspace:*",
|
|
5
|
+
"@types/node": "^20",
|
|
6
|
+
"rimraf": "^6",
|
|
7
|
+
"tsup": "^8.5.0",
|
|
8
|
+
"typescript": "^5",
|
|
9
|
+
"vitest": "^3.2.4"
|
|
10
|
+
},
|
|
11
|
+
"engines": {
|
|
12
|
+
"node": ">=20.0.0",
|
|
13
|
+
"pnpm": ">=9.0.0"
|
|
14
|
+
},
|
|
7
15
|
"exports": {
|
|
8
16
|
".": {
|
|
9
17
|
"import": "./dist/index.js",
|
|
@@ -14,23 +22,20 @@
|
|
|
14
22
|
"dist",
|
|
15
23
|
"README.md"
|
|
16
24
|
],
|
|
17
|
-
"
|
|
25
|
+
"main": "./dist/index.js",
|
|
26
|
+
"name": "@kb-labs/host-agent-transport",
|
|
18
27
|
"scripts": {
|
|
19
|
-
"clean": "rimraf dist",
|
|
20
28
|
"build": "tsup",
|
|
29
|
+
"clean": "rimraf dist",
|
|
21
30
|
"dev": "tsup --watch",
|
|
22
|
-
"type-check": "tsc --noEmit",
|
|
23
31
|
"lint": "eslint .",
|
|
24
32
|
"lint:fix": "eslint . --fix",
|
|
25
33
|
"test": "vitest run -c ../../vitest.config.ts",
|
|
26
|
-
"test:watch": "vitest -c ../../vitest.config.ts"
|
|
34
|
+
"test:watch": "vitest -c ../../vitest.config.ts",
|
|
35
|
+
"type-check": "tsc --noEmit"
|
|
27
36
|
},
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
"rimraf": "^6",
|
|
33
|
-
"tsup": "^8.5.0",
|
|
34
|
-
"vitest": "^3.2.4"
|
|
35
|
-
}
|
|
37
|
+
"sideEffects": false,
|
|
38
|
+
"type": "module",
|
|
39
|
+
"types": "./dist/index.d.ts",
|
|
40
|
+
"version": "2.6.0"
|
|
36
41
|
}
|