mcp-teams 0.0.0-stage → 0.2.2

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/dist/bridge.js ADDED
@@ -0,0 +1,551 @@
1
+ import { createHmac, randomBytes, randomUUID, timingSafeEqual } from "node:crypto";
2
+ import { WebSocketServer, WebSocket } from "ws";
3
+ import { EXTENSION_ORIGIN as TRUSTED_EXTENSION_ORIGIN } from "./extension.js";
4
+ /**
5
+ * Local WebSocket bridge between MCP server processes and the browser extension.
6
+ *
7
+ * Several Claude sessions can each run an mcp-teams server, but only one can
8
+ * own the port. The first one becomes the hub: the extension connects to it (MV3
9
+ * service workers cannot listen), authenticates with the pairing token and answers
10
+ * RPC requests. Later servers become peers: they connect to the hub with the same
11
+ * token and forward their calls through it. If the hub exits, a peer takes over the
12
+ * port and the extension reconnects to it.
13
+ *
14
+ * Only loopback connections are accepted, and never from a web page: browsers always
15
+ * send an Origin header, so connections must come from an extension origin or from
16
+ * a local process (no Origin). Both sides prove they know the pairing token without
17
+ * sending it: the server opens with a challenge, the client (extension or peer) answers
18
+ * with proof(token, "client", challenge) and its own nonce, and the welcome carries
19
+ * proof(token, "server", nonce). So neither a program posing as the extension (any
20
+ * local process can send any Origin) nor one holding the port while no AI app runs
21
+ * gets anything. The extension reads the token from pairing.json, which setup writes
22
+ * into its installed folder.
23
+ */
24
+ /** HMAC-SHA256 of `${role}:${nonce}` with the pairing token, base64url. The extension computes the same (teams.js). */
25
+ export function proof(token, role, nonce) {
26
+ return createHmac("sha256", token).update(`${role}:${nonce}`).digest("base64url");
27
+ }
28
+ function sameProof(a, b) {
29
+ if (typeof a !== "string")
30
+ return false;
31
+ const x = Buffer.from(a);
32
+ const y = Buffer.from(b);
33
+ return x.length === y.length && timingSafeEqual(x, y);
34
+ }
35
+ const newNonce = () => randomBytes(24).toString("base64url");
36
+ /** How long the hub trusts what it learned about which browser has Teams signed in. */
37
+ const PICK_STATUS_TIMEOUT_MS = 3_000;
38
+ const EXTENSION_ORIGIN = /^(chrome-extension|extension):\/\/[a-z0-9]+$/i;
39
+ const RETRY_MS = 2_000;
40
+ /** Largest message accepted on the bridge. Attachments travel one per message as base64 (+33%). */
41
+ export const MAX_MESSAGE_BYTES = 256 * 1024 * 1024;
42
+ const JOIN_TIMEOUT_MS = 3_000;
43
+ /** A hub handing over to a newer server waits this long for its own calls to finish. */
44
+ const STEP_DOWN_MAX_WAIT_MS = 5 * 60_000;
45
+ /** True when version a is newer than b (x.y.z; anything else never counts as newer). */
46
+ export function isNewer(a, b) {
47
+ const parse = (v) => (typeof v === "string" && /^\d+\.\d+\.\d+$/.test(v) ? v.split(".").map(Number) : null);
48
+ const x = parse(a);
49
+ const y = parse(b);
50
+ if (!x || !y)
51
+ return false;
52
+ for (let i = 0; i < 3; i++)
53
+ if (x[i] !== y[i])
54
+ return x[i] > y[i];
55
+ return false;
56
+ }
57
+ function describeSocketError(err, limit) {
58
+ return err.code === "WS_ERR_UNSUPPORTED_MESSAGE_LENGTH"
59
+ ? `The response was too large (over ${Math.round(limit / 1024 / 1024)} MB) and was dropped. The connection is re-established automatically.`
60
+ : `Bridge connection error: ${err.message}`;
61
+ }
62
+ export class ExtensionBridge {
63
+ port;
64
+ token;
65
+ serverVersion;
66
+ maxMessageBytes;
67
+ role = "none";
68
+ /** The extension calls go to (with several browsers: the preferred one). */
69
+ extension;
70
+ /** Every connected extension, one per browser profile. */
71
+ extensions = [];
72
+ listenError;
73
+ /** Peer only: version of the hub server it forwards through. */
74
+ hubVersion;
75
+ wss;
76
+ sockets = new Map(); // hub: the extensions
77
+ preferred; // hub: the extension that last answered a call
78
+ hub; // peer: the hub
79
+ peers = new Set();
80
+ pending = new Map();
81
+ keepAlive;
82
+ retry;
83
+ closed = false;
84
+ steppingDown = false;
85
+ alive = new WeakSet(); // hub: extensions that answered the last ping
86
+ legacyReloaded = false; // hub: an extension of 0.2.0 or older was told to reload
87
+ constructor(port, token, serverVersion, maxMessageBytes = MAX_MESSAGE_BYTES) {
88
+ this.port = port;
89
+ this.token = token;
90
+ this.serverVersion = serverVersion;
91
+ this.maxMessageBytes = maxMessageBytes;
92
+ }
93
+ /** Becomes the hub, or a peer of the existing hub. Keeps retrying in the background if neither works. */
94
+ async start() {
95
+ if (this.closed)
96
+ return;
97
+ if (await this.listen())
98
+ return this.setRole("hub");
99
+ if (await this.join())
100
+ return this.setRole("peer");
101
+ this.role = "none";
102
+ clearTimeout(this.retry);
103
+ this.retry = setTimeout(() => void this.start(), RETRY_MS);
104
+ this.retry.unref();
105
+ }
106
+ get connected() {
107
+ if (this.role === "hub")
108
+ return [...this.sockets.keys()].some((s) => s.readyState === WebSocket.OPEN);
109
+ if (this.role === "peer")
110
+ return this.hub?.readyState === WebSocket.OPEN && !!this.extension;
111
+ return false;
112
+ }
113
+ setRole(role) {
114
+ this.role = role;
115
+ this.listenError = undefined;
116
+ }
117
+ // ------------------------------------------------------------------ hub
118
+ listen() {
119
+ return new Promise((resolve) => {
120
+ const wss = new WebSocketServer({
121
+ host: "127.0.0.1",
122
+ port: this.port,
123
+ maxPayload: this.maxMessageBytes,
124
+ verifyClient: ({ origin }) => !origin || EXTENSION_ORIGIN.test(origin),
125
+ });
126
+ let listening = false;
127
+ wss.once("listening", () => {
128
+ listening = true;
129
+ this.wss = wss;
130
+ resolve(true);
131
+ });
132
+ wss.on("error", (err) => {
133
+ if (listening)
134
+ return this.restartHub(`bridge server error: ${err.message}`);
135
+ if (err.code !== "EADDRINUSE")
136
+ this.listenError = err.message;
137
+ wss.close();
138
+ resolve(false);
139
+ });
140
+ wss.on("connection", (ws, req) => this.onConnection(ws, req.headers.origin));
141
+ });
142
+ }
143
+ onConnection(ws, origin) {
144
+ let authed = false;
145
+ const authTimer = setTimeout(() => !authed && ws.close(4401, "auth timeout"), 5000);
146
+ const challenge = newNonce();
147
+ ws.send(JSON.stringify({ type: "challenge", nonce: challenge }));
148
+ ws.on("message", (raw) => {
149
+ let msg;
150
+ try {
151
+ msg = JSON.parse(raw.toString());
152
+ }
153
+ catch {
154
+ return;
155
+ }
156
+ if (!msg || typeof msg !== "object")
157
+ return;
158
+ if (!authed) {
159
+ if (msg.type !== "hello" && msg.type !== "peer-hello")
160
+ return void ws.close(4401, "bad token");
161
+ // Clients up to 0.2.0 send the token itself (peers, or an extension paired by hand).
162
+ const proven = sameProof(msg.proof, proof(this.token, "client", challenge)) || (typeof msg.token === "string" && msg.token === this.token);
163
+ if (!proven) {
164
+ // Our extension up to 0.2.0 says hello with neither; it is only told to reload.
165
+ if (msg.type === "hello" && origin === TRUSTED_EXTENSION_ORIGIN && msg.token == null && msg.proof == null)
166
+ return this.reloadLegacy(ws);
167
+ return void ws.close(4401, "bad token");
168
+ }
169
+ authed = true;
170
+ clearTimeout(authTimer);
171
+ const welcome = typeof msg.nonce === "string" ? { proof: proof(this.token, "server", msg.nonce) } : {};
172
+ if (msg.type === "hello")
173
+ this.acceptExtension(ws, msg, welcome, origin);
174
+ else
175
+ this.acceptPeer(ws, msg.version, welcome);
176
+ return;
177
+ }
178
+ if (this.sockets.has(ws))
179
+ this.onExtensionMessage(msg);
180
+ else if (this.peers.has(ws))
181
+ this.onPeerMessage(ws, msg);
182
+ });
183
+ // Without a listener, a socket error (e.g. a message over MAX_MESSAGE_BYTES) would be
184
+ // an unhandled 'error' event and end the whole process. The socket closes afterwards.
185
+ ws.on("error", (err) => {
186
+ if (this.sockets.has(ws))
187
+ this.rejectAll(describeSocketError(err, this.maxMessageBytes), ws);
188
+ });
189
+ ws.on("close", () => {
190
+ clearTimeout(authTimer);
191
+ this.peers.delete(ws);
192
+ if (this.sockets.delete(ws)) {
193
+ if (this.preferred === ws)
194
+ this.preferred = undefined;
195
+ this.rejectAll("Browser extension disconnected", ws);
196
+ this.updateExtensions();
197
+ if (!this.sockets.size)
198
+ clearInterval(this.keepAlive);
199
+ }
200
+ });
201
+ }
202
+ /**
203
+ * Several browsers (or profiles) can be connected at once, one connection each. A
204
+ * reconnect from the same one (same instance, or for older extensions the same origin
205
+ * and browser) replaces its old connection. While our extension (fixed id) is
206
+ * connected, copies with another id (e.g. an older one loaded from another folder) are
207
+ * turned away, and connecting ours replaces them.
208
+ */
209
+ acceptExtension(ws, msg, welcome, origin) {
210
+ const info = {
211
+ version: String(msg.version ?? "unknown"),
212
+ browser: msg.browser,
213
+ ...(origin ? { origin } : {}),
214
+ ...(typeof msg.instance === "string" ? { instance: msg.instance } : {}),
215
+ };
216
+ const ours = origin === TRUSTED_EXTENSION_ORIGIN;
217
+ const others = [...this.sockets].filter(([s]) => s !== ws);
218
+ if (!ours && others.some(([, i]) => i.origin === TRUSTED_EXTENSION_ORIGIN)) {
219
+ ws.close(4409, "another copy of the extension is connected");
220
+ return;
221
+ }
222
+ const key = (i) => i.instance ?? `${i.origin}|${i.browser}`;
223
+ for (const [s, i] of others) {
224
+ if (key(i) === key(info) || (ours && i.origin !== TRUSTED_EXTENSION_ORIGIN) || (!ours && !i.instance)) {
225
+ s.close(4000, "replaced");
226
+ // Its close event comes later and no longer finds it, so fail its calls now.
227
+ this.sockets.delete(s);
228
+ this.rejectAll("Browser extension reconnected; try again.", s);
229
+ if (this.preferred === s)
230
+ this.preferred = undefined;
231
+ }
232
+ }
233
+ this.sockets.set(ws, info);
234
+ ws.send(JSON.stringify({ type: "welcome", serverVersion: this.serverVersion, ...welcome }));
235
+ this.startKeepAlive(ws);
236
+ this.updateExtensions();
237
+ }
238
+ /** Refreshes `extension`/`extensions` after a change and tells the peers. */
239
+ updateExtensions() {
240
+ this.extensions = [...this.sockets.values()];
241
+ this.extension = (this.preferred && this.sockets.get(this.preferred)) ?? this.extensions.at(-1);
242
+ this.broadcastState();
243
+ }
244
+ /**
245
+ * The extension a call goes to: the only one, the one that answered last, or else the
246
+ * one whose browser has Teams signed in (then: has a Teams tab, then: newest).
247
+ */
248
+ async pickExtension() {
249
+ const open = [...this.sockets.keys()].filter((s) => s.readyState === WebSocket.OPEN);
250
+ if (open.length <= 1)
251
+ return open[0];
252
+ if (this.preferred && open.includes(this.preferred))
253
+ return this.preferred;
254
+ const statuses = await Promise.all(open.map((s) => this.send(s, "status", {}, PICK_STATUS_TIMEOUT_MS).catch(() => null)));
255
+ const score = (st) => !st ? -1 : st.sessions?.some((x) => x.sessionCaptured) ? 2 : (st.teamsTabs ?? 0) > 0 ? 1 : 0;
256
+ let best = open.length - 1; // newest first among equals
257
+ for (let i = open.length - 1; i >= 0; i--)
258
+ if (score(statuses[i]) > score(statuses[best]))
259
+ best = i;
260
+ return open[best];
261
+ }
262
+ /**
263
+ * Our extension up to 0.2.0 can't prove it knows the token, and anything can claim its
264
+ * origin, so it gets no calls. It is asked once to reload, which loads the update this
265
+ * server put in its folder, and the new version connects with a proof.
266
+ */
267
+ reloadLegacy(ws) {
268
+ if (!this.legacyReloaded) {
269
+ this.legacyReloaded = true;
270
+ ws.send(JSON.stringify({ type: "request", id: randomUUID(), method: "reload", params: {}, timeoutMs: 10_000 }));
271
+ }
272
+ setTimeout(() => ws.close(4426, "extension update required"), 1_000).unref();
273
+ }
274
+ acceptPeer(ws, peerVersion, welcome) {
275
+ this.peers.add(ws);
276
+ ws.send(JSON.stringify({ type: "peer-welcome", serverVersion: this.serverVersion, extension: this.extension ?? null, extensions: this.extensions, ...welcome }));
277
+ // A newer server joined: hand the port to it, so its fixes (and what the newer
278
+ // extension expects) take effect without restarting this AI session.
279
+ if (isNewer(peerVersion, this.serverVersion))
280
+ void this.stepDown(String(peerVersion));
281
+ }
282
+ /**
283
+ * Hub: stops serving (after this server's own calls finish) and joins again as a peer.
284
+ * Peers see the hub close and race for the port, retrying after 0.1–0.5 s; this one
285
+ * waits longer, so a peer takes over. If an older peer wins, the newer one steps it
286
+ * down in turn when it joins.
287
+ */
288
+ async stepDown(newer) {
289
+ if (this.steppingDown || this.role !== "hub")
290
+ return;
291
+ this.steppingDown = true;
292
+ const end = Date.now() + STEP_DOWN_MAX_WAIT_MS;
293
+ while (this.pending.size && Date.now() < end && !this.closed)
294
+ await new Promise((r) => setTimeout(r, 500));
295
+ if (this.closed || this.role !== "hub")
296
+ return void (this.steppingDown = false);
297
+ console.error(`[mcp-teams ${this.serverVersion}] handing the bridge to mcp-teams ${newer}`);
298
+ this.restartHub("mcp-teams was updated; try again in a few seconds.", RETRY_MS);
299
+ this.steppingDown = false;
300
+ }
301
+ /** Hub: closes the server and every connection, then becomes a hub or peer again. */
302
+ restartHub(reason, delayMs = 100 + Math.random() * 400) {
303
+ const wss = this.wss;
304
+ this.wss = undefined;
305
+ this.role = "none";
306
+ clearInterval(this.keepAlive);
307
+ this.rejectAll(reason);
308
+ for (const s of this.sockets.keys())
309
+ s.close(1012, "restarting");
310
+ for (const peer of this.peers)
311
+ peer.close(1012, "restarting");
312
+ this.sockets.clear();
313
+ this.peers.clear();
314
+ this.preferred = undefined;
315
+ this.extension = undefined;
316
+ this.extensions = [];
317
+ wss?.close();
318
+ if (this.closed)
319
+ return;
320
+ clearTimeout(this.retry);
321
+ this.retry = setTimeout(() => void this.start(), delayMs);
322
+ this.retry.unref();
323
+ }
324
+ onExtensionMessage(msg) {
325
+ if (msg.type === "response" && typeof msg.id === "string")
326
+ this.settle(msg);
327
+ }
328
+ /** Runs a peer's call against the extension and sends back the outcome. */
329
+ onPeerMessage(ws, msg) {
330
+ if (msg.type !== "request" || typeof msg.id !== "string")
331
+ return;
332
+ const reply = (body) => {
333
+ try {
334
+ if (ws.readyState === WebSocket.OPEN)
335
+ ws.send(JSON.stringify({ type: "response", id: msg.id, ...body }));
336
+ }
337
+ catch (err) {
338
+ console.error(`[mcp-teams] could not answer a peer: ${err.message}`);
339
+ }
340
+ };
341
+ this.call(String(msg.method), msg.params ?? {}, Number(msg.timeoutMs) || undefined).then((result) => reply({ ok: true, result }), (err) => reply({ ok: false, error: err.message }));
342
+ }
343
+ broadcastState() {
344
+ const state = JSON.stringify({ type: "ext-state", extension: this.extension ?? null, extensions: this.extensions });
345
+ for (const peer of this.peers)
346
+ if (peer.readyState === WebSocket.OPEN)
347
+ peer.send(state);
348
+ }
349
+ /**
350
+ * Pings keep the MV3 service worker alive while connected. A connection that didn't
351
+ * answer the previous WebSocket ping (a suspended or crashed browser) is dropped.
352
+ */
353
+ startKeepAlive(ws) {
354
+ if (ws) {
355
+ this.alive.add(ws);
356
+ ws.on("pong", () => this.alive.add(ws));
357
+ }
358
+ clearInterval(this.keepAlive);
359
+ this.keepAlive = setInterval(() => {
360
+ for (const s of this.sockets.keys()) {
361
+ if (s.readyState !== WebSocket.OPEN)
362
+ continue;
363
+ if (!this.alive.has(s)) {
364
+ s.terminate();
365
+ continue;
366
+ }
367
+ this.alive.delete(s);
368
+ s.ping();
369
+ s.send(JSON.stringify({ type: "ping" }));
370
+ }
371
+ }, 20_000);
372
+ this.keepAlive.unref();
373
+ }
374
+ // ------------------------------------------------------------------ peer
375
+ join() {
376
+ return new Promise((resolve) => {
377
+ const ws = new WebSocket(`ws://127.0.0.1:${this.port}`, { maxPayload: this.maxMessageBytes });
378
+ let joined = false;
379
+ let challenged = false;
380
+ let forged = false;
381
+ const nonce = newNonce();
382
+ const timer = setTimeout(() => ws.terminate(), JOIN_TIMEOUT_MS);
383
+ ws.on("message", (raw) => {
384
+ let msg;
385
+ try {
386
+ msg = JSON.parse(raw.toString());
387
+ }
388
+ catch {
389
+ return;
390
+ }
391
+ if (!msg || typeof msg !== "object")
392
+ return;
393
+ if (msg.type === "challenge" && !challenged && typeof msg.nonce === "string") {
394
+ challenged = true;
395
+ ws.send(JSON.stringify({ type: "peer-hello", proof: proof(this.token, "client", msg.nonce), nonce, version: this.serverVersion }));
396
+ }
397
+ else if (msg.type === "peer-welcome" && !joined) {
398
+ // Only the real hub can answer our nonce; never forward calls to anything else.
399
+ if (!challenged || !sameProof(msg.proof, proof(this.token, "server", nonce))) {
400
+ forged = true;
401
+ return void ws.terminate();
402
+ }
403
+ joined = true;
404
+ clearTimeout(timer);
405
+ this.hub = ws;
406
+ this.hubVersion = String(msg.serverVersion ?? "unknown");
407
+ this.extension = msg.extension ?? undefined;
408
+ this.extensions = msg.extensions ?? (msg.extension ? [msg.extension] : []);
409
+ resolve(true);
410
+ }
411
+ else if (msg.type === "ext-state") {
412
+ this.extension = msg.extension ?? undefined;
413
+ this.extensions = msg.extensions ?? (msg.extension ? [msg.extension] : []);
414
+ }
415
+ else if (msg.type === "response" && typeof msg.id === "string") {
416
+ this.settle(msg);
417
+ }
418
+ });
419
+ ws.on("error", (err) => {
420
+ if (joined && this.hub === ws)
421
+ this.rejectAll(describeSocketError(err, this.maxMessageBytes));
422
+ });
423
+ ws.on("close", (code) => {
424
+ clearTimeout(timer);
425
+ if (!joined) {
426
+ this.listenError =
427
+ code === 4401
428
+ ? `The mcp-teams server on port ${this.port} rejected this server's token.`
429
+ : forged || !challenged
430
+ ? `Port ${this.port} is held by an mcp-teams of 0.2.0 or older (restart the other AI sessions, in Claude Code with /mcp) or by another program.`
431
+ : `Port ${this.port} is in use by another program.`;
432
+ return resolve(false);
433
+ }
434
+ if (this.hub !== ws)
435
+ return;
436
+ // The hub went away: take over the port or join whoever did.
437
+ this.hub = undefined;
438
+ this.hubVersion = undefined;
439
+ this.extension = undefined;
440
+ this.extensions = [];
441
+ this.role = "none";
442
+ this.rejectAll("The mcp-teams hub restarted; try again in a few seconds.");
443
+ if (!this.closed) {
444
+ clearTimeout(this.retry);
445
+ this.retry = setTimeout(() => void this.start(), 100 + Math.random() * 400);
446
+ this.retry.unref();
447
+ }
448
+ });
449
+ });
450
+ }
451
+ // ------------------------------------------------------------------ calls
452
+ async call(method, params = {}, timeoutMs = 60_000) {
453
+ if (method === "reloadAll" && this.role === "hub")
454
+ return this.reloadAll(timeoutMs);
455
+ const target = this.role === "hub" ? await this.pickExtension() : this.role === "peer" ? this.hub : undefined;
456
+ if (!this.connected || !target) {
457
+ const reason = this.role === "none"
458
+ ? (this.listenError ?? "Connecting to the mcp-teams bridge; try again in a few seconds.")
459
+ : "Browser extension is not connected. Open Chrome or Edge with the mcp-teams extension installed (run `mcp-teams setup`).";
460
+ throw new Error(reason);
461
+ }
462
+ const result = await this.send(target, method, params, timeoutMs);
463
+ if (this.role === "hub" && this.preferred !== target && this.sockets.has(target)) {
464
+ this.preferred = target;
465
+ this.updateExtensions();
466
+ }
467
+ return result;
468
+ }
469
+ /** Hub: asks every connected browser's extension to reload itself. */
470
+ async reloadAll(timeoutMs) {
471
+ const open = [...this.sockets.keys()].filter((s) => s.readyState === WebSocket.OPEN);
472
+ if (!open.length)
473
+ throw new Error("Browser extension is not connected.");
474
+ const results = await Promise.allSettled(open.map((s) => this.send(s, "reload", {}, timeoutMs)));
475
+ const failed = results.filter((r) => r.status === "rejected");
476
+ if (failed.length === results.length)
477
+ throw failed[0].reason;
478
+ return { reloading: results.length - failed.length };
479
+ }
480
+ /** Sends one request on a connection (an extension for the hub, the hub for a peer). */
481
+ send(target, method, params, timeoutMs) {
482
+ const id = randomUUID();
483
+ // A peer waits a little longer than the hub, so the hub's own timeout message wins.
484
+ const wait = this.role === "peer" ? timeoutMs + 5_000 : timeoutMs;
485
+ return new Promise((resolve, reject) => {
486
+ const timer = setTimeout(() => {
487
+ this.pending.delete(id);
488
+ reject(new Error(`Extension call '${method}' timed out`));
489
+ }, wait);
490
+ this.pending.set(id, { resolve: resolve, reject, timer, socket: this.role === "hub" ? target : undefined });
491
+ target.send(JSON.stringify({ type: "request", id, method, params, timeoutMs }));
492
+ });
493
+ }
494
+ /**
495
+ * Has the extension reload itself from disk, then waits until it is connected again.
496
+ * Returns its version before and after.
497
+ */
498
+ async reloadExtension(timeoutMs = 30_000) {
499
+ const before = this.extension?.version ?? null;
500
+ await this.call("reloadAll");
501
+ // The extensions reload 250 ms after answering; wait for the old connections to go,
502
+ // then for every browser to be back. Copies with another id are turned away (4409)
503
+ // once ours is back, so only ours count when ours is connected.
504
+ const ours = this.extensions.filter((e) => e.origin === TRUSTED_EXTENSION_ORIGIN).length;
505
+ const count = Math.max(1, ours || this.extensions.length);
506
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
507
+ await sleep(1_000);
508
+ const end = Date.now() + timeoutMs;
509
+ for (; Date.now() < end; await sleep(250)) {
510
+ if (this.connected && this.extension && this.extensions.length >= count)
511
+ return { before, after: this.extension.version };
512
+ }
513
+ if (this.connected && this.extension)
514
+ return { before, after: this.extension.version };
515
+ throw new Error(`The extension did not reconnect within ${timeoutMs / 1000} s. Check chrome://extensions for errors.`);
516
+ }
517
+ settle(msg) {
518
+ const p = this.pending.get(msg.id);
519
+ if (!p)
520
+ return;
521
+ this.pending.delete(msg.id);
522
+ clearTimeout(p.timer);
523
+ if (msg.ok)
524
+ p.resolve(msg.result);
525
+ else
526
+ p.reject(new Error(msg.error ?? "extension error"));
527
+ }
528
+ /** Fails the pending calls (only those sent on `socket`, when given). */
529
+ rejectAll(reason, socket) {
530
+ for (const [id, p] of this.pending) {
531
+ if (socket && p.socket !== socket)
532
+ continue;
533
+ clearTimeout(p.timer);
534
+ p.reject(new Error(reason));
535
+ this.pending.delete(id);
536
+ }
537
+ }
538
+ async close() {
539
+ this.closed = true;
540
+ clearTimeout(this.retry);
541
+ clearInterval(this.keepAlive);
542
+ this.rejectAll("mcp-teams is shutting down");
543
+ this.hub?.close();
544
+ for (const s of this.sockets.keys())
545
+ s.close();
546
+ for (const peer of this.peers)
547
+ peer.close();
548
+ await new Promise((r) => (this.wss ? this.wss.close(() => r()) : r()));
549
+ }
550
+ }
551
+ //# sourceMappingURL=bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}