@agentick/client-multiplexer 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 +168 -0
- package/dist/broadcast-bridge.d.ts +115 -0
- package/dist/broadcast-bridge.d.ts.map +1 -0
- package/dist/broadcast-bridge.js +59 -0
- package/dist/broadcast-bridge.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/leader-elector.d.ts +19 -0
- package/dist/leader-elector.d.ts.map +1 -0
- package/dist/leader-elector.js +193 -0
- package/dist/leader-elector.js.map +1 -0
- package/dist/shared-transport.d.ts +84 -0
- package/dist/shared-transport.d.ts.map +1 -0
- package/dist/shared-transport.js +697 -0
- package/dist/shared-transport.js.map +1 -0
- package/package.json +32 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Leader Elector
|
|
3
|
+
*
|
|
4
|
+
* Uses Web Locks API for instant, reliable leader election across browser tabs.
|
|
5
|
+
* Falls back to BroadcastChannel-based election if Web Locks unavailable.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Create a leader elector for the given channel name.
|
|
9
|
+
* Uses Web Locks API (instant) with BroadcastChannel fallback.
|
|
10
|
+
*/
|
|
11
|
+
export function createLeaderElector(channelName) {
|
|
12
|
+
const tabId = `${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
13
|
+
let _isLeader = false;
|
|
14
|
+
let leadershipPromise = null;
|
|
15
|
+
let leadershipResolve = null;
|
|
16
|
+
let lockHeld = false;
|
|
17
|
+
const callbacks = new Set();
|
|
18
|
+
// Check if Web Locks API is available
|
|
19
|
+
const hasWebLocks = typeof navigator !== "undefined" && "locks" in navigator;
|
|
20
|
+
function setLeader(value) {
|
|
21
|
+
if (_isLeader !== value) {
|
|
22
|
+
_isLeader = value;
|
|
23
|
+
for (const cb of callbacks) {
|
|
24
|
+
try {
|
|
25
|
+
cb(value);
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
console.error("Error in leadership callback:", e);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (value && leadershipResolve) {
|
|
32
|
+
leadershipResolve();
|
|
33
|
+
leadershipResolve = null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Store the release function for resign()
|
|
38
|
+
let releaseLock = null;
|
|
39
|
+
async function acquireWithWebLocks() {
|
|
40
|
+
const lockName = `agentick:leader:${channelName}`;
|
|
41
|
+
// First, try to acquire the lock WITHOUT waiting (ifAvailable: true)
|
|
42
|
+
// This tells us immediately if we can become leader
|
|
43
|
+
const acquired = await navigator.locks.request(lockName, { mode: "exclusive", ifAvailable: true }, async (lock) => {
|
|
44
|
+
if (lock) {
|
|
45
|
+
// We got the lock - we're the leader!
|
|
46
|
+
lockHeld = true;
|
|
47
|
+
setLeader(true);
|
|
48
|
+
// Now hold it by waiting on a promise that only resolves on resign()
|
|
49
|
+
await new Promise((resolve) => {
|
|
50
|
+
releaseLock = resolve;
|
|
51
|
+
});
|
|
52
|
+
// Lock released
|
|
53
|
+
lockHeld = false;
|
|
54
|
+
setLeader(false);
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
// Lock is held by someone else - we're a follower
|
|
58
|
+
return false;
|
|
59
|
+
});
|
|
60
|
+
if (!acquired) {
|
|
61
|
+
// Someone else is leader - resolve the leadership promise anyway
|
|
62
|
+
// so connect() can proceed (we're a follower)
|
|
63
|
+
if (leadershipResolve) {
|
|
64
|
+
leadershipResolve();
|
|
65
|
+
leadershipResolve = null;
|
|
66
|
+
}
|
|
67
|
+
// Now wait in queue for when we might become leader later
|
|
68
|
+
// (when current leader closes their tab)
|
|
69
|
+
navigator.locks
|
|
70
|
+
.request(lockName, { mode: "exclusive" }, async () => {
|
|
71
|
+
lockHeld = true;
|
|
72
|
+
setLeader(true);
|
|
73
|
+
await new Promise((resolve) => {
|
|
74
|
+
releaseLock = resolve;
|
|
75
|
+
});
|
|
76
|
+
lockHeld = false;
|
|
77
|
+
setLeader(false);
|
|
78
|
+
})
|
|
79
|
+
.catch(console.error);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Fallback: BroadcastChannel-based election (for older browsers)
|
|
83
|
+
let fallbackChannel = null;
|
|
84
|
+
let fallbackHeartbeat = null;
|
|
85
|
+
let fallbackTimeout = null;
|
|
86
|
+
async function acquireWithFallback() {
|
|
87
|
+
fallbackChannel = new BroadcastChannel(`agentick:election:${channelName}`);
|
|
88
|
+
const HEARTBEAT_INTERVAL = 1000;
|
|
89
|
+
const LEADER_TIMEOUT = 2500;
|
|
90
|
+
let currentLeaderId = null;
|
|
91
|
+
fallbackChannel.onmessage = (event) => {
|
|
92
|
+
const msg = event.data;
|
|
93
|
+
if (msg.type === "heartbeat") {
|
|
94
|
+
if (msg.leaderId !== tabId) {
|
|
95
|
+
// Another leader exists
|
|
96
|
+
currentLeaderId = msg.leaderId;
|
|
97
|
+
setLeader(false);
|
|
98
|
+
// Reset timeout
|
|
99
|
+
if (fallbackTimeout)
|
|
100
|
+
clearTimeout(fallbackTimeout);
|
|
101
|
+
fallbackTimeout = setTimeout(() => {
|
|
102
|
+
// Leader went silent, try to become leader
|
|
103
|
+
tryBecomeLeader();
|
|
104
|
+
}, LEADER_TIMEOUT);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
function tryBecomeLeader() {
|
|
109
|
+
// Announce candidacy
|
|
110
|
+
fallbackChannel?.postMessage({ type: "heartbeat", leaderId: tabId });
|
|
111
|
+
currentLeaderId = tabId;
|
|
112
|
+
setLeader(true);
|
|
113
|
+
// Start heartbeat
|
|
114
|
+
if (fallbackHeartbeat)
|
|
115
|
+
clearInterval(fallbackHeartbeat);
|
|
116
|
+
fallbackHeartbeat = setInterval(() => {
|
|
117
|
+
if (_isLeader) {
|
|
118
|
+
fallbackChannel?.postMessage({ type: "heartbeat", leaderId: tabId });
|
|
119
|
+
}
|
|
120
|
+
}, HEARTBEAT_INTERVAL);
|
|
121
|
+
}
|
|
122
|
+
// Wait a bit to see if a leader announces
|
|
123
|
+
await new Promise((resolve) => {
|
|
124
|
+
fallbackTimeout = setTimeout(() => {
|
|
125
|
+
if (!currentLeaderId) {
|
|
126
|
+
tryBecomeLeader();
|
|
127
|
+
}
|
|
128
|
+
resolve();
|
|
129
|
+
}, LEADER_TIMEOUT);
|
|
130
|
+
// Also resolve early if we see a leader
|
|
131
|
+
const originalOnMessage = fallbackChannel.onmessage;
|
|
132
|
+
fallbackChannel.onmessage = (event) => {
|
|
133
|
+
originalOnMessage?.call(fallbackChannel, event);
|
|
134
|
+
if (event.data.type === "heartbeat") {
|
|
135
|
+
resolve();
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
get isLeader() {
|
|
142
|
+
return _isLeader;
|
|
143
|
+
},
|
|
144
|
+
get tabId() {
|
|
145
|
+
return tabId;
|
|
146
|
+
},
|
|
147
|
+
awaitLeadership() {
|
|
148
|
+
if (_isLeader) {
|
|
149
|
+
return Promise.resolve();
|
|
150
|
+
}
|
|
151
|
+
if (!leadershipPromise) {
|
|
152
|
+
leadershipPromise = new Promise((resolve) => {
|
|
153
|
+
leadershipResolve = resolve;
|
|
154
|
+
});
|
|
155
|
+
// Start trying to acquire leadership
|
|
156
|
+
if (hasWebLocks) {
|
|
157
|
+
acquireWithWebLocks().catch(console.error);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
acquireWithFallback().catch(console.error);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return leadershipPromise;
|
|
164
|
+
},
|
|
165
|
+
resign() {
|
|
166
|
+
if (!_isLeader)
|
|
167
|
+
return;
|
|
168
|
+
if (hasWebLocks && lockHeld && releaseLock) {
|
|
169
|
+
// Release the web lock
|
|
170
|
+
releaseLock();
|
|
171
|
+
releaseLock = null;
|
|
172
|
+
}
|
|
173
|
+
if (fallbackHeartbeat) {
|
|
174
|
+
clearInterval(fallbackHeartbeat);
|
|
175
|
+
fallbackHeartbeat = null;
|
|
176
|
+
}
|
|
177
|
+
if (fallbackTimeout) {
|
|
178
|
+
clearTimeout(fallbackTimeout);
|
|
179
|
+
fallbackTimeout = null;
|
|
180
|
+
}
|
|
181
|
+
if (fallbackChannel) {
|
|
182
|
+
fallbackChannel.close();
|
|
183
|
+
fallbackChannel = null;
|
|
184
|
+
}
|
|
185
|
+
setLeader(false);
|
|
186
|
+
},
|
|
187
|
+
onLeadershipChange(callback) {
|
|
188
|
+
callbacks.add(callback);
|
|
189
|
+
return () => callbacks.delete(callback);
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=leader-elector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leader-elector.js","sourceRoot":"","sources":["../src/leader-elector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Transport
|
|
3
|
+
*
|
|
4
|
+
* A ClientTransport implementation that multiplexes connections across browser tabs.
|
|
5
|
+
* Only the leader tab maintains a real SSE connection; followers communicate via BroadcastChannel.
|
|
6
|
+
*/
|
|
7
|
+
import { type ClientTransport, type TransportConfig, type TransportState, type TransportEventData, type SSETransportConfig, type WSTransportConfig, type SendInput, type ChannelEvent, type ToolConfirmationResponse } from "@agentick/client";
|
|
8
|
+
export interface SharedTransportConfig extends TransportConfig {
|
|
9
|
+
/**
|
|
10
|
+
* Transport type to use.
|
|
11
|
+
* - "sse": HTTP/SSE transport (default for http:// URLs)
|
|
12
|
+
* - "websocket": WebSocket transport (default for ws:// URLs)
|
|
13
|
+
* - "auto": Auto-detect based on URL scheme (default)
|
|
14
|
+
* @default "auto"
|
|
15
|
+
*/
|
|
16
|
+
transport?: "sse" | "websocket" | "auto";
|
|
17
|
+
/** Override default endpoint paths (SSE transport only) */
|
|
18
|
+
paths?: SSETransportConfig["paths"];
|
|
19
|
+
/** Client ID for WebSocket connections */
|
|
20
|
+
clientId?: string;
|
|
21
|
+
/** WebSocket implementation (for Node.js compatibility) */
|
|
22
|
+
WebSocket?: WSTransportConfig["WebSocket"];
|
|
23
|
+
/** Reconnection settings (WebSocket only) */
|
|
24
|
+
reconnect?: WSTransportConfig["reconnect"];
|
|
25
|
+
}
|
|
26
|
+
export declare class SharedTransport implements ClientTransport {
|
|
27
|
+
private config;
|
|
28
|
+
private elector;
|
|
29
|
+
private bridge;
|
|
30
|
+
private realTransport;
|
|
31
|
+
private mySessionSubscriptions;
|
|
32
|
+
private myChannelSubscriptions;
|
|
33
|
+
private _state;
|
|
34
|
+
private _connectionId;
|
|
35
|
+
private eventHandlers;
|
|
36
|
+
private stateHandlers;
|
|
37
|
+
private pendingRequests;
|
|
38
|
+
private pendingStreams;
|
|
39
|
+
private readyResolve?;
|
|
40
|
+
private readyPromise?;
|
|
41
|
+
constructor(config: SharedTransportConfig);
|
|
42
|
+
get state(): TransportState;
|
|
43
|
+
get connectionId(): string | undefined;
|
|
44
|
+
connect(): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Wait until a leader is available AND ready to handle requests (for followers).
|
|
47
|
+
* The key distinction is waiting for "leader:transport_ready" not just "leader:ready".
|
|
48
|
+
*/
|
|
49
|
+
private waitForLeader;
|
|
50
|
+
disconnect(): void;
|
|
51
|
+
send(input: SendInput, sessionId?: string): AsyncIterable<TransportEventData> & {
|
|
52
|
+
abort: (reason?: string) => void;
|
|
53
|
+
};
|
|
54
|
+
subscribeToSession(sessionId: string): Promise<void>;
|
|
55
|
+
unsubscribeFromSession(sessionId: string): Promise<void>;
|
|
56
|
+
abortSession(sessionId: string, reason?: string): Promise<void>;
|
|
57
|
+
closeSession(sessionId: string): Promise<void>;
|
|
58
|
+
submitToolResult(sessionId: string, toolUseId: string, result: ToolConfirmationResponse): Promise<void>;
|
|
59
|
+
subscribeToChannel(sessionId: string, channel: string): Promise<void>;
|
|
60
|
+
publishToChannel(sessionId: string, channel: string, event: ChannelEvent): Promise<void>;
|
|
61
|
+
onEvent(handler: (event: TransportEventData) => void): () => void;
|
|
62
|
+
onStateChange(handler: (state: TransportState) => void): () => void;
|
|
63
|
+
get isLeader(): boolean;
|
|
64
|
+
get tabId(): string;
|
|
65
|
+
onLeadershipChange(callback: (isLeader: boolean) => void): () => void;
|
|
66
|
+
private setupLeadershipHandlers;
|
|
67
|
+
private onBecomeLeader;
|
|
68
|
+
private onLoseLeadership;
|
|
69
|
+
private connectAsLeader;
|
|
70
|
+
private detectTransportType;
|
|
71
|
+
private setupBridgeHandlers;
|
|
72
|
+
private handleBridgeMessage;
|
|
73
|
+
private handleIncomingEvent;
|
|
74
|
+
private handleStreamEvent;
|
|
75
|
+
private handleStreamEnd;
|
|
76
|
+
private handleStreamError;
|
|
77
|
+
private handleResponse;
|
|
78
|
+
private handleFollowerRequest;
|
|
79
|
+
private setState;
|
|
80
|
+
private forwardRequest;
|
|
81
|
+
private sendResponse;
|
|
82
|
+
}
|
|
83
|
+
export declare function createSharedTransport(config: SharedTransportConfig): SharedTransport;
|
|
84
|
+
//# sourceMappingURL=shared-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-transport.d.ts","sourceRoot":"","sources":["../src/shared-transport.ts"],"names":[],"mappings":"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"}
|