agent-common 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/dist/transport/mcp.d.ts +10 -2
- package/dist/transport/mcp.d.ts.map +1 -1
- package/dist/transport/mcp.js +77 -24
- package/dist/transport/mcp.js.map +1 -1
- package/dist/transport/ws.d.ts +19 -3
- package/dist/transport/ws.d.ts.map +1 -1
- package/dist/transport/ws.js +27 -9
- package/dist/transport/ws.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.0.3] - 2026-04-07
|
|
4
|
+
|
|
5
|
+
- `startMcpServer`:
|
|
6
|
+
- `handleTool` may return a Promise (async tool handlers).
|
|
7
|
+
- `tools` may be a function returning the list (dynamic tool lists).
|
|
8
|
+
- New `formatResult(result, toolName)` to customize tool response text (e.g. append a trailing instructions footer).
|
|
9
|
+
- New `onToolCalled(name, args, notify)` post-response hook with an injected `notify(method, params)` callback for emitting JSON-RPC notifications like `notifications/tools/list_changed`.
|
|
10
|
+
- New `capabilities` option to override the default `{ tools: {} }` (e.g. `{ tools: { listChanged: true } }`).
|
|
11
|
+
- New `logLabel` for stderr error prefixes.
|
|
12
|
+
- `McpServerHandle` now exposes `notify(method, params)`.
|
|
13
|
+
|
|
14
|
+
## [1.0.2] - 2026-04-07
|
|
15
|
+
|
|
16
|
+
- `setupWebSocket`:
|
|
17
|
+
- `getCategoryData(category)` now returns an object whose keys are **spread** into the delta payload. Lets consumers bundle related fields (e.g. `messages + messageCount`) under one fingerprint.
|
|
18
|
+
- New optional `onMessage(ws, msg)` callback for custom client-to-server message types beyond the built-in `refresh`. Return `true` to signal the message was handled.
|
|
19
|
+
- `WsHandle` now exposes `broadcast(message)` for raw-string broadcasts to all open clients.
|
|
20
|
+
|
|
21
|
+
## [1.0.1] - 2026-04-07
|
|
22
|
+
|
|
23
|
+
- `json()` accepts `options.extraHeaders` to merge custom headers (e.g. SECURITY_HEADERS) into the response.
|
|
24
|
+
- `serveStatic()` accepts `options.spaFallback` (default true) — set to `false` for strict 404-on-miss behavior, and `options.extraHeaders` to merge headers into 200 responses.
|
|
25
|
+
|
|
3
26
|
## [1.0.0] - 2026-04-07
|
|
4
27
|
|
|
5
28
|
Initial release of `agent-common`. Extracted shared scaffolding from `agent-comm`, `agent-tasks`, `agent-knowledge`, and `agent-discover`:
|
package/dist/transport/mcp.d.ts
CHANGED
|
@@ -1,16 +1,24 @@
|
|
|
1
1
|
import type { ToolDefinition } from '../types.js';
|
|
2
|
+
export type ToolList = ToolDefinition[] | (() => ToolDefinition[]);
|
|
3
|
+
export type NotifyFn = (method: string, params?: unknown) => void;
|
|
2
4
|
export interface McpServerOptions {
|
|
3
5
|
serverInfo: {
|
|
4
6
|
name: string;
|
|
5
7
|
version: string;
|
|
6
8
|
};
|
|
7
|
-
tools:
|
|
8
|
-
handleTool: (name: string, args: Record<string, unknown>) => unknown
|
|
9
|
+
tools: ToolList;
|
|
10
|
+
handleTool: (name: string, args: Record<string, unknown>) => unknown | Promise<unknown>;
|
|
9
11
|
onInitialize?: () => void;
|
|
12
|
+
formatResult?: (result: unknown, toolName: string) => string;
|
|
13
|
+
onToolCalled?: (name: string, args: Record<string, unknown>, notify: NotifyFn) => void;
|
|
14
|
+
capabilities?: Record<string, unknown>;
|
|
10
15
|
protocolVersion?: string;
|
|
16
|
+
/** Label used in stderr error prefixes. Default: "agent-common". */
|
|
17
|
+
logLabel?: string;
|
|
11
18
|
}
|
|
12
19
|
export interface McpServerHandle {
|
|
13
20
|
close(): void;
|
|
21
|
+
notify: NotifyFn;
|
|
14
22
|
}
|
|
15
23
|
export declare function startMcpServer(opts: McpServerOptions): McpServerHandle;
|
|
16
24
|
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/transport/mcp.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/transport/mcp.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAmC,cAAc,EAAE,MAAM,aAAa,CAAC;AAEnF,MAAM,MAAM,QAAQ,GAAG,cAAc,EAAE,GAAG,CAAC,MAAM,cAAc,EAAE,CAAC,CAAC;AAEnE,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAElE,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,KAAK,EAAE,QAAQ,CAAC;IAChB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxF,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7D,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAC;IACvF,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,EAAE,QAAQ,CAAC;CAClB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,gBAAgB,GAAG,eAAe,CAoKtE"}
|
package/dist/transport/mcp.js
CHANGED
|
@@ -2,20 +2,51 @@
|
|
|
2
2
|
// agent-common — MCP transport
|
|
3
3
|
//
|
|
4
4
|
// Generic JSON-RPC over stdio dispatcher. The consumer provides:
|
|
5
|
-
// - tools: ToolDefinition[]
|
|
6
|
-
// - handleTool(name, args): unknown (the per-tool dispatcher)
|
|
7
5
|
// - serverInfo: { name, version }
|
|
8
|
-
// -
|
|
6
|
+
// - tools: ToolDefinition[] | () => ToolDefinition[] (dynamic supported)
|
|
7
|
+
// - handleTool(name, args): unknown | Promise<unknown> (async supported)
|
|
8
|
+
// - onInitialize(): optional hook fired on MCP initialize
|
|
9
|
+
// - formatResult?: custom JSON → text formatting for tool responses
|
|
10
|
+
// - onToolCalled?: post-response hook with a `notify` callback to emit
|
|
11
|
+
// JSON-RPC notifications like `notifications/tools/list_changed`
|
|
12
|
+
// - capabilities?: custom capabilities object merged over the default
|
|
9
13
|
// =============================================================================
|
|
10
14
|
import { createInterface } from 'readline';
|
|
11
15
|
import { KitError } from '../types.js';
|
|
12
16
|
export function startMcpServer(opts) {
|
|
13
17
|
const protocolVersion = opts.protocolVersion ?? '2024-11-05';
|
|
14
|
-
const capabilities = { tools: {} };
|
|
18
|
+
const capabilities = opts.capabilities ?? { tools: {} };
|
|
19
|
+
const label = opts.logLabel ?? 'agent-common';
|
|
15
20
|
function writeResponse(response) {
|
|
16
21
|
process.stdout.write(JSON.stringify(response) + '\n');
|
|
17
22
|
}
|
|
18
|
-
|
|
23
|
+
const notify = (method, params) => {
|
|
24
|
+
const payload = { jsonrpc: '2.0', method };
|
|
25
|
+
if (params !== undefined)
|
|
26
|
+
payload.params = params;
|
|
27
|
+
process.stdout.write(JSON.stringify(payload) + '\n');
|
|
28
|
+
};
|
|
29
|
+
function resolveTools() {
|
|
30
|
+
return typeof opts.tools === 'function' ? opts.tools() : opts.tools;
|
|
31
|
+
}
|
|
32
|
+
function formatToolText(result, toolName) {
|
|
33
|
+
return opts.formatResult
|
|
34
|
+
? opts.formatResult(result, toolName)
|
|
35
|
+
: JSON.stringify(result, null, 2);
|
|
36
|
+
}
|
|
37
|
+
function errorResponse(id, err) {
|
|
38
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
39
|
+
const code = err instanceof KitError ? err.code : 'UNKNOWN_ERROR';
|
|
40
|
+
return {
|
|
41
|
+
jsonrpc: '2.0',
|
|
42
|
+
id,
|
|
43
|
+
result: {
|
|
44
|
+
content: [{ type: 'text', text: `Error [${code}]: ${message}` }],
|
|
45
|
+
isError: true,
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
async function handleRequest(request) {
|
|
19
50
|
const { method, params, id } = request;
|
|
20
51
|
switch (method) {
|
|
21
52
|
case 'initialize':
|
|
@@ -24,7 +55,9 @@ export function startMcpServer(opts) {
|
|
|
24
55
|
opts.onInitialize();
|
|
25
56
|
}
|
|
26
57
|
catch (err) {
|
|
27
|
-
process.stderr.write('[
|
|
58
|
+
process.stderr.write('[' +
|
|
59
|
+
label +
|
|
60
|
+
'] onInitialize error: ' +
|
|
28
61
|
(err instanceof Error ? err.message : String(err)) +
|
|
29
62
|
'\n');
|
|
30
63
|
}
|
|
@@ -41,7 +74,7 @@ export function startMcpServer(opts) {
|
|
|
41
74
|
case 'notifications/initialized':
|
|
42
75
|
return null;
|
|
43
76
|
case 'tools/list':
|
|
44
|
-
return { jsonrpc: '2.0', id, result: { tools:
|
|
77
|
+
return { jsonrpc: '2.0', id, result: { tools: resolveTools() } };
|
|
45
78
|
case 'tools/call': {
|
|
46
79
|
const toolName = String(params?.name ?? '');
|
|
47
80
|
const rawArgs = params?.arguments;
|
|
@@ -49,26 +82,32 @@ export function startMcpServer(opts) {
|
|
|
49
82
|
? rawArgs
|
|
50
83
|
: {};
|
|
51
84
|
try {
|
|
52
|
-
const
|
|
85
|
+
const raw = opts.handleTool(toolName, toolArgs);
|
|
86
|
+
const result = raw instanceof Promise ? await raw : raw;
|
|
53
87
|
return {
|
|
54
88
|
jsonrpc: '2.0',
|
|
55
89
|
id,
|
|
56
90
|
result: {
|
|
57
|
-
content: [{ type: 'text', text:
|
|
91
|
+
content: [{ type: 'text', text: formatToolText(result, toolName) }],
|
|
58
92
|
},
|
|
59
93
|
};
|
|
60
94
|
}
|
|
61
95
|
catch (err) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
96
|
+
return errorResponse(id, err);
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
if (opts.onToolCalled) {
|
|
100
|
+
try {
|
|
101
|
+
opts.onToolCalled(toolName, toolArgs, notify);
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
process.stderr.write('[' +
|
|
105
|
+
label +
|
|
106
|
+
'] onToolCalled error: ' +
|
|
107
|
+
(err instanceof Error ? err.message : String(err)) +
|
|
108
|
+
'\n');
|
|
109
|
+
}
|
|
110
|
+
}
|
|
72
111
|
}
|
|
73
112
|
}
|
|
74
113
|
case 'ping':
|
|
@@ -85,14 +124,14 @@ export function startMcpServer(opts) {
|
|
|
85
124
|
rl.on('line', (line) => {
|
|
86
125
|
if (!line.trim())
|
|
87
126
|
return;
|
|
127
|
+
let request;
|
|
88
128
|
try {
|
|
89
|
-
|
|
90
|
-
const response = handleRequest(request);
|
|
91
|
-
if (response)
|
|
92
|
-
writeResponse(response);
|
|
129
|
+
request = JSON.parse(line);
|
|
93
130
|
}
|
|
94
131
|
catch (err) {
|
|
95
|
-
process.stderr.write('[
|
|
132
|
+
process.stderr.write('[' +
|
|
133
|
+
label +
|
|
134
|
+
'] JSON-RPC parse error: ' +
|
|
96
135
|
(err instanceof Error ? err.message : String(err)) +
|
|
97
136
|
'\n');
|
|
98
137
|
writeResponse({
|
|
@@ -100,12 +139,26 @@ export function startMcpServer(opts) {
|
|
|
100
139
|
id: null,
|
|
101
140
|
error: { code: -32700, message: 'Parse error' },
|
|
102
141
|
});
|
|
142
|
+
return;
|
|
103
143
|
}
|
|
144
|
+
handleRequest(request)
|
|
145
|
+
.then((response) => {
|
|
146
|
+
if (response)
|
|
147
|
+
writeResponse(response);
|
|
148
|
+
})
|
|
149
|
+
.catch((err) => {
|
|
150
|
+
process.stderr.write('[' +
|
|
151
|
+
label +
|
|
152
|
+
'] Handler error: ' +
|
|
153
|
+
(err instanceof Error ? err.message : String(err)) +
|
|
154
|
+
'\n');
|
|
155
|
+
});
|
|
104
156
|
});
|
|
105
157
|
return {
|
|
106
158
|
close() {
|
|
107
159
|
rl.close();
|
|
108
160
|
},
|
|
161
|
+
notify,
|
|
109
162
|
};
|
|
110
163
|
}
|
|
111
164
|
//# sourceMappingURL=mcp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/transport/mcp.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,+BAA+B;AAC/B,EAAE;AACF,iEAAiE;AACjE,
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/transport/mcp.ts"],"names":[],"mappings":"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"}
|
package/dist/transport/ws.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { WebSocketServer } from 'ws';
|
|
1
|
+
import { WebSocketServer, WebSocket } from 'ws';
|
|
2
2
|
import type { Server } from 'http';
|
|
3
3
|
export interface WsHandle {
|
|
4
4
|
wss: WebSocketServer;
|
|
5
|
+
/** Send a raw JSON string to every open client. */
|
|
6
|
+
broadcast(message: string): void;
|
|
5
7
|
close(): void;
|
|
6
8
|
}
|
|
7
9
|
export interface WsOptions<F extends Record<string, string>> {
|
|
@@ -9,10 +11,24 @@ export interface WsOptions<F extends Record<string, string>> {
|
|
|
9
11
|
httpServer: Server;
|
|
10
12
|
/** Compute current fingerprints. Cheap query — runs every poll interval. */
|
|
11
13
|
getFingerprints: () => F;
|
|
12
|
-
/**
|
|
13
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Fetch fresh data for a single changed category. Return an object that
|
|
16
|
+
* will be SPREAD into the delta payload (so the consumer controls keys).
|
|
17
|
+
* For the simple case, return `{ [category]: value }`. For bundled fields,
|
|
18
|
+
* return `{ messages: [...], messageCount: n }`.
|
|
19
|
+
*/
|
|
20
|
+
getCategoryData: (category: keyof F) => Record<string, unknown>;
|
|
14
21
|
/** Fetch full state payload (sent on connect and on client `refresh`). */
|
|
15
22
|
getFullState: () => Record<string, unknown>;
|
|
23
|
+
/**
|
|
24
|
+
* Optional custom message handler. Called after `refresh` has been ruled out.
|
|
25
|
+
* Return true to signal the message was handled; false/undefined falls through
|
|
26
|
+
* to the default "unknown message type" error response.
|
|
27
|
+
*/
|
|
28
|
+
onMessage?: (ws: WebSocket, msg: {
|
|
29
|
+
type?: string;
|
|
30
|
+
[key: string]: unknown;
|
|
31
|
+
}) => boolean | void;
|
|
16
32
|
/** Max concurrent connections (default: 50). */
|
|
17
33
|
maxConnections?: number;
|
|
18
34
|
/** Max single message size in bytes (default: 4096). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../src/transport/ws.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../src/transport/ws.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,eAAe,CAAC;IACrB,mDAAmD;IACnD,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IACzD,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,eAAe,EAAE,MAAM,CAAC,CAAC;IACzB;;;;;OAKG;IACH,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChE,0EAA0E;IAC1E,YAAY,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,KAAK,OAAO,GAAG,IAAI,CAAC;IAC9F,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0CAA0C;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4CAA4C;IAC5C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;CACnC;AAOD,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,QAAQ,CAuJ7F"}
|
package/dist/transport/ws.js
CHANGED
|
@@ -5,9 +5,15 @@
|
|
|
5
5
|
// - getFingerprints(): an object whose keys are categories and values are
|
|
6
6
|
// short fingerprint strings derived from the DB. Polled every interval.
|
|
7
7
|
// - getCategoryData(category): returns the current data for a category.
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
8
|
+
// The returned object is SPREAD into the delta payload, so the consumer
|
|
9
|
+
// controls the keys — this lets one category push multiple related
|
|
10
|
+
// fields (e.g. messages + messageCount) in a single delta.
|
|
11
|
+
// - getFullState(): returns the full state payload sent on connect and
|
|
12
|
+
// on client `refresh`.
|
|
13
|
+
//
|
|
14
|
+
// Optional:
|
|
15
|
+
// - onMessage(ws, msg): handle custom client-to-server message types
|
|
16
|
+
// beyond the built-in `refresh`. Return true if handled.
|
|
11
17
|
// =============================================================================
|
|
12
18
|
import { WebSocketServer, WebSocket } from 'ws';
|
|
13
19
|
export function setupWebSocket(opts) {
|
|
@@ -39,7 +45,8 @@ export function setupWebSocket(opts) {
|
|
|
39
45
|
let hasChanges = false;
|
|
40
46
|
for (const key of Object.keys(currentFp)) {
|
|
41
47
|
if (prev[key] !== currentFp[key]) {
|
|
42
|
-
|
|
48
|
+
const data = opts.getCategoryData(key);
|
|
49
|
+
Object.assign(changed, data);
|
|
43
50
|
hasChanges = true;
|
|
44
51
|
}
|
|
45
52
|
}
|
|
@@ -84,13 +91,17 @@ export function setupWebSocket(opts) {
|
|
|
84
91
|
if (state)
|
|
85
92
|
state.fingerprints = null;
|
|
86
93
|
sendFull(ws);
|
|
94
|
+
return;
|
|
87
95
|
}
|
|
88
|
-
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
ws.send(JSON.stringify({ type: 'error', message: `Unknown message type: ${safeType}` }));
|
|
96
|
+
if (opts.onMessage) {
|
|
97
|
+
const handled = opts.onMessage(ws, msg);
|
|
98
|
+
if (handled)
|
|
99
|
+
return;
|
|
93
100
|
}
|
|
101
|
+
const safeType = String(msg.type ?? '')
|
|
102
|
+
.slice(0, 64)
|
|
103
|
+
.replace(/[<>&"']/g, '');
|
|
104
|
+
ws.send(JSON.stringify({ type: 'error', message: `Unknown message type: ${safeType}` }));
|
|
94
105
|
});
|
|
95
106
|
ws.on('error', () => clients.delete(ws));
|
|
96
107
|
ws.on('close', () => clients.delete(ws));
|
|
@@ -129,6 +140,13 @@ export function setupWebSocket(opts) {
|
|
|
129
140
|
pollTimer.unref();
|
|
130
141
|
return {
|
|
131
142
|
wss,
|
|
143
|
+
broadcast(message) {
|
|
144
|
+
for (const [ws] of clients) {
|
|
145
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
146
|
+
ws.send(message);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
},
|
|
132
150
|
close() {
|
|
133
151
|
clearInterval(pingTimer);
|
|
134
152
|
clearInterval(pollTimer);
|
package/dist/transport/ws.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws.js","sourceRoot":"","sources":["../../src/transport/ws.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,qCAAqC;AACrC,EAAE;AACF,mEAAmE;AACnE,4EAA4E;AAC5E,4EAA4E;AAC5E,0EAA0E;AAC1E,
|
|
1
|
+
{"version":3,"file":"ws.js","sourceRoot":"","sources":["../../src/transport/ws.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED