@arena-im/buzz-client 1.1.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.
@@ -0,0 +1,601 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ // Prefer compile-time flag when available (set by bundler), otherwise detect at runtime
6
+ let WSImpl;
7
+ {
8
+ // Node.js
9
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
10
+ WSImpl = require("ws");
11
+ }
12
+ // Exponential backoff
13
+ const baseReconnectDelay = 1000;
14
+ const maxReconnectDelay = 10000;
15
+ const reconnectDelayFactor = 2;
16
+ class FaultTolerantWebSocket {
17
+ constructor(url, onOpen, onMessage, onError, options = {}) {
18
+ this.onOpen = onOpen;
19
+ this.onMessage = onMessage;
20
+ this.onError = onError;
21
+ this.options = options;
22
+ this.reconnectDelay = baseReconnectDelay;
23
+ this.shouldReconnect = true;
24
+ this.isOpen = false;
25
+ this.pendingOpenResolvers = [];
26
+ this.url = url;
27
+ this.ws = this.createWebsocket();
28
+ this.connect();
29
+ }
30
+ createWebsocket() {
31
+ if (typeof window === "undefined") {
32
+ // Node.js ws: new WebSocket(url, protocols?, options)
33
+ return new WSImpl(this.url, undefined, {
34
+ headers: this.options.headers,
35
+ });
36
+ }
37
+ else {
38
+ // Browser WebSocket: new WebSocket(url, protocols?)
39
+ return new WSImpl(this.url);
40
+ }
41
+ }
42
+ connect() {
43
+ let errored = false;
44
+ this.ws.onopen = () => {
45
+ console.debug("WebSocket connected");
46
+ this.reconnectDelay = baseReconnectDelay;
47
+ this.isOpen = true;
48
+ // Resolve any pending waiters for open state
49
+ this.pendingOpenResolvers.splice(0).forEach((resolve) => resolve());
50
+ this.onOpen();
51
+ };
52
+ this.ws.onmessage = (event) => {
53
+ if (typeof event.data !== "string") {
54
+ console.error("binary messages are not supported");
55
+ return;
56
+ }
57
+ this.onMessage(event.data);
58
+ };
59
+ this.ws.onclose = (event) => {
60
+ console.debug("WebSocket closed. Reason:", event.reason);
61
+ this.isOpen = false;
62
+ if (this.shouldReconnect)
63
+ this.scheduleReconnect();
64
+ };
65
+ this.ws.onerror = (event) => {
66
+ if (errored) {
67
+ return;
68
+ }
69
+ errored = true;
70
+ console.error("WebSocket error:", event);
71
+ this.ws.close(); // Trigger `onclose` to handle reconnection
72
+ this.isOpen = false;
73
+ this.onError();
74
+ };
75
+ }
76
+ scheduleReconnect() {
77
+ console.debug(`Reconnecting in ${this.reconnectDelay}ms...`);
78
+ setTimeout(() => {
79
+ this.reconnectDelay = Math.min(this.reconnectDelay * reconnectDelayFactor, maxReconnectDelay);
80
+ this.ws = this.createWebsocket();
81
+ this.connect();
82
+ }, this.reconnectDelay);
83
+ }
84
+ send(data) {
85
+ if (this.ws.readyState !== WSImpl.OPEN) {
86
+ throw new Error(`Websocket connection not open: ${this.ws.readyState}`);
87
+ }
88
+ try {
89
+ this.ws.send(data);
90
+ }
91
+ catch (error) {
92
+ const errorMessage = `Websocket connection not open: race condition`;
93
+ console.error(errorMessage);
94
+ throw new Error(errorMessage);
95
+ }
96
+ }
97
+ close() {
98
+ this.shouldReconnect = false;
99
+ this.ws.close();
100
+ }
101
+ whenOpen() {
102
+ if (this.isOpen && this.ws.readyState === WSImpl.OPEN) {
103
+ return Promise.resolve();
104
+ }
105
+ return new Promise((resolve) => {
106
+ this.pendingOpenResolvers.push(resolve);
107
+ });
108
+ }
109
+ }
110
+
111
+ // A request queue that executes up to `threshold` requests every `windowDuration` milliseconds,
112
+ // enforcing rate limits to prevent throttling
113
+ const windowSafetyPadding = 500;
114
+ class ThrottledQueue {
115
+ constructor(windowDuration, threshold, onError) {
116
+ this.windowDuration = windowDuration;
117
+ this.threshold = threshold;
118
+ this.onError = onError;
119
+ this.requests = [];
120
+ this.requestCount = 0;
121
+ this.status = 0 /* QueueStatus.Buffering */;
122
+ this.windowStart = 0;
123
+ }
124
+ push(request) {
125
+ if (this.status === 3 /* QueueStatus.Destroyed */) {
126
+ throw new Error(`push to a destroyed queue`);
127
+ }
128
+ this.requests.push(request);
129
+ if (this.status === 1 /* QueueStatus.Idle */) {
130
+ this.awake();
131
+ }
132
+ }
133
+ run() {
134
+ if (this.status !== 0 /* QueueStatus.Buffering */) {
135
+ return;
136
+ }
137
+ console.debug('Throttled queue processing started');
138
+ this.awake();
139
+ }
140
+ destroy() {
141
+ if (this.waitTimer !== undefined) {
142
+ clearTimeout(this.waitTimer);
143
+ }
144
+ console.debug('Throttled queue destroyed');
145
+ this.status = 3 /* QueueStatus.Destroyed */;
146
+ }
147
+ awake() {
148
+ this.status = 2 /* QueueStatus.Running */;
149
+ this.processNext();
150
+ }
151
+ processNext() {
152
+ if (this.status === 3 /* QueueStatus.Destroyed */) {
153
+ return;
154
+ }
155
+ const now = Date.now();
156
+ if (now - this.windowStart > this.windowDuration) {
157
+ this.windowStart = now;
158
+ this.requestCount = 0;
159
+ }
160
+ const next = this.requests.shift();
161
+ if (next === undefined) {
162
+ this.status = 1 /* QueueStatus.Idle */;
163
+ return;
164
+ }
165
+ this.runRequest(next);
166
+ this.requestCount++;
167
+ if (this.requestCount === this.threshold) {
168
+ this.waitNextWindow();
169
+ return;
170
+ }
171
+ // Giving external code a chance to call `push` or `destroy`
172
+ setTimeout(() => this.processNext(), 0);
173
+ }
174
+ runRequest(request) {
175
+ try {
176
+ request.run();
177
+ }
178
+ catch (error) {
179
+ this.onError(error, request);
180
+ }
181
+ }
182
+ waitNextWindow() {
183
+ console.warn('Throttling activated');
184
+ const wait = Math.max(0, this.windowStart + this.windowDuration - Date.now() + windowSafetyPadding);
185
+ this.waitTimer = setTimeout(() => {
186
+ console.debug('Throttling deactivated');
187
+ this.processNext();
188
+ }, wait);
189
+ }
190
+ }
191
+
192
+ class TokenManager {
193
+ constructor(siteId, identityBaseUrl) {
194
+ this.siteId = siteId;
195
+ this.identityBaseUrl = identityBaseUrl;
196
+ this.currentBuzzToken = null;
197
+ this.currentIdToken = null;
198
+ this.isExchanging = false;
199
+ this.pendingPromise = null;
200
+ this.listeners = new Set();
201
+ }
202
+ notify(token) {
203
+ this.listeners.forEach((l) => l(token));
204
+ }
205
+ async exchange() {
206
+ var _a;
207
+ if (this.isExchanging)
208
+ return (_a = this.pendingPromise) !== null && _a !== void 0 ? _a : Promise.resolve();
209
+ this.isExchanging = true;
210
+ this.pendingPromise = (async () => {
211
+ var _a, _b;
212
+ try {
213
+ if (this.currentIdToken) {
214
+ const data = await this.exchangeAuthenticated(this.currentIdToken);
215
+ this.currentBuzzToken = (_a = data.access_token) !== null && _a !== void 0 ? _a : null;
216
+ }
217
+ else {
218
+ const data = await this.getAnonymous();
219
+ const authToken = data.access_token;
220
+ const exchanged = await this.exchangeAuthenticated(authToken);
221
+ this.currentBuzzToken = (_b = exchanged.access_token) !== null && _b !== void 0 ? _b : null;
222
+ }
223
+ }
224
+ finally {
225
+ this.isExchanging = false;
226
+ this.pendingPromise = null;
227
+ this.notify(this.currentBuzzToken);
228
+ }
229
+ })();
230
+ return this.pendingPromise;
231
+ }
232
+ async exchangeAuthenticated(idToken) {
233
+ const url = `${this.identityBaseUrl}/exchange-token?siteId=${encodeURIComponent(this.siteId)}&accessToken=${encodeURIComponent(idToken)}`;
234
+ const res = await fetch(url, { method: "POST", credentials: "omit" });
235
+ if (!res.ok)
236
+ throw new Error(`exchangeAuthenticated failed: ${res.status}`);
237
+ return (await res.json());
238
+ }
239
+ async getAnonymous() {
240
+ const url = `${this.identityBaseUrl}/anonymous-token`;
241
+ const res = await fetch(url, { method: "POST", credentials: "omit" });
242
+ if (!res.ok)
243
+ throw new Error(`getAnonymous failed: ${res.status}`);
244
+ return (await res.json());
245
+ }
246
+ async getBuzzToken() {
247
+ if (!this.currentBuzzToken)
248
+ await this.exchange();
249
+ if (!this.currentBuzzToken)
250
+ throw new Error("Failed to acquire buzz token");
251
+ return this.currentBuzzToken;
252
+ }
253
+ async setIdToken(idToken) {
254
+ this.currentIdToken = idToken !== null && idToken !== void 0 ? idToken : null;
255
+ await this.exchange();
256
+ }
257
+ onTokenChange(cb) {
258
+ this.listeners.add(cb);
259
+ return () => this.listeners.delete(cb);
260
+ }
261
+ }
262
+
263
+ class Topic {
264
+ constructor(client, topic) {
265
+ this.client = client;
266
+ this.topic = topic;
267
+ this.listenerWrappers = {};
268
+ this.subscriptionPromise = this.client.subscribe(this.topic);
269
+ }
270
+ async emit(eventName, content) {
271
+ try {
272
+ await this.subscriptionPromise;
273
+ const result = await this.client.sendCommand(eventName, this.topic, content);
274
+ return result;
275
+ }
276
+ catch (error) {
277
+ throw error;
278
+ }
279
+ }
280
+ async on(eventName, callback) {
281
+ await this.subscriptionPromise;
282
+ const wrapper = (event) => {
283
+ callback(event);
284
+ };
285
+ if (!this.listenerWrappers[eventName]) {
286
+ this.listenerWrappers[eventName] = new Map();
287
+ }
288
+ this.listenerWrappers[eventName].set(callback, wrapper);
289
+ this.client.onEvent(this.topic, eventName, wrapper);
290
+ }
291
+ async off(eventName, callback) {
292
+ await this.subscriptionPromise;
293
+ const wrapperMap = this.listenerWrappers[eventName];
294
+ if (!wrapperMap)
295
+ return;
296
+ if (callback) {
297
+ const wrapper = wrapperMap.get(callback);
298
+ if (wrapper) {
299
+ this.client.offEvent(this.topic, eventName, wrapper);
300
+ wrapperMap.delete(callback);
301
+ }
302
+ if (wrapperMap.size === 0) {
303
+ delete this.listenerWrappers[eventName];
304
+ }
305
+ return;
306
+ }
307
+ for (const wrapper of wrapperMap.values()) {
308
+ this.client.offEvent(this.topic, eventName, wrapper);
309
+ }
310
+ delete this.listenerWrappers[eventName];
311
+ }
312
+ }
313
+
314
+ function readEnvironmentVariable(name) {
315
+ try {
316
+ if (typeof process !== "undefined" &&
317
+ process.env &&
318
+ typeof process.env[name] === "string") {
319
+ return process.env[name];
320
+ }
321
+ }
322
+ catch (_a) {
323
+ // no-op: fall through to undefined
324
+ }
325
+ return undefined;
326
+ }
327
+ const BUZZ_WEBSOCKET_URL = readEnvironmentVariable("BUZZ_WEBSOCKET_URL");
328
+ const BUZZ_WEBSOCKET_URL_DEV = readEnvironmentVariable("BUZZ_WEBSOCKET_URL_DEV");
329
+ const IDENTITY_SERVICE_URL = readEnvironmentVariable("IDENTITY_SERVICE_URL");
330
+ const IDENTITY_SERVICE_URL_DEV = readEnvironmentVariable("IDENTITY_SERVICE_URL_DEV");
331
+ const DEFAULTS = {
332
+ prod: {
333
+ websocketUrl: BUZZ_WEBSOCKET_URL && BUZZ_WEBSOCKET_URL.length > 0
334
+ ? BUZZ_WEBSOCKET_URL
335
+ : "wss://buzz-prd.arena.im/ws",
336
+ identityUrl: IDENTITY_SERVICE_URL && IDENTITY_SERVICE_URL.length > 0
337
+ ? IDENTITY_SERVICE_URL
338
+ : "https://token-service-prd.arena.im",
339
+ },
340
+ dev: {
341
+ websocketUrl: BUZZ_WEBSOCKET_URL_DEV && BUZZ_WEBSOCKET_URL_DEV.length > 0
342
+ ? BUZZ_WEBSOCKET_URL_DEV
343
+ : BUZZ_WEBSOCKET_URL && BUZZ_WEBSOCKET_URL.length > 0
344
+ ? BUZZ_WEBSOCKET_URL
345
+ : "wss://buzz-prd.arena.im/ws",
346
+ identityUrl: IDENTITY_SERVICE_URL_DEV && IDENTITY_SERVICE_URL_DEV.length > 0
347
+ ? IDENTITY_SERVICE_URL_DEV
348
+ : IDENTITY_SERVICE_URL && IDENTITY_SERVICE_URL.length > 0
349
+ ? IDENTITY_SERVICE_URL
350
+ : "https://token-service-prd.arena.im",
351
+ },
352
+ };
353
+ function resolveBuzzConfig(env = "prod") {
354
+ return DEFAULTS[env];
355
+ }
356
+
357
+ // These should match buzz' throttling constants
358
+ const throttleWindowDuration = 5000;
359
+ const throttleWindowThreshold = 25;
360
+ const defaultCommandTimeout = 10 * 1000;
361
+ class BuzzClient {
362
+ constructor(envOrWebsocketUrl, namespace, siteId, token, options = {}) {
363
+ var _a;
364
+ this.namespace = namespace;
365
+ this.options = options;
366
+ this.ws = null;
367
+ this.nextRequestId = 0;
368
+ this.pendingCommands = {};
369
+ this.eventListeners = {};
370
+ this.unsubscribeTokenChange = null;
371
+ // Defined with arrow for correct `this` binding
372
+ this.onQueueError = (error, request) => {
373
+ const requestId = request.requestId;
374
+ const errorMessage = error instanceof Error ? error.message : `${error}`;
375
+ const command = this.pendingCommands[requestId];
376
+ if (command === undefined) {
377
+ console.warn(`Request ID not found; request: ${JSON.stringify(request)}`);
378
+ return;
379
+ }
380
+ this.rejectCommand(command, new WebsocketError(errorMessage));
381
+ };
382
+ // Defined with arrow for correct `this` binding
383
+ this.onWebsocketOpen = () => {
384
+ this.queue.run();
385
+ };
386
+ // Defined with arrow for correct `this` binding
387
+ this.onWebsocketError = () => {
388
+ // Abort all queued commands
389
+ this.queue.destroy();
390
+ this.queue = new ThrottledQueue(throttleWindowDuration, throttleWindowThreshold, this.onQueueError);
391
+ // Fail all pending commands
392
+ const error = new WebsocketError("websocket connection error");
393
+ Object.values(this.pendingCommands).forEach((command) => this.rejectCommand(command, error));
394
+ this.pendingCommands = {};
395
+ };
396
+ // Defined with arrow for correct `this` binding
397
+ this.onWebsocketMessage = (rawMessage) => {
398
+ const message = JSON.parse(rawMessage);
399
+ // Event case
400
+ if (message.eventName && message.topic) {
401
+ this.dispatchEvent(message);
402
+ return;
403
+ }
404
+ // Command response case
405
+ // This should never happen if `throttleWindowDuration` and `throttleWindowThreshold`
406
+ // settings match buzz server's throttle settings
407
+ if (message.responseType === "rejected" && message.reason === "throttled") {
408
+ console.error("Buzz server throttled this connection. Review client throttling settings");
409
+ }
410
+ // no-op
411
+ if (message.responseType === "ack") {
412
+ return;
413
+ }
414
+ if (message.requestId === undefined) {
415
+ console.warn(`Missing request ID; message: ${JSON.stringify(message)}`);
416
+ return;
417
+ }
418
+ const requestId = `${message.requestId}`;
419
+ const command = this.pendingCommands[requestId];
420
+ if (command === undefined) {
421
+ console.warn(`Request ID not found; message: ${JSON.stringify(message)}`);
422
+ return;
423
+ }
424
+ // `responseType` field is absent in some successful responses from buzz.
425
+ // When this is fixed in buzz (set to `ok`) this `undefined` check can be removed
426
+ if (message.responseType === "ok" || message.responseType === undefined) {
427
+ clearTimeout(command.timeoutTimer);
428
+ command.resolve(message);
429
+ delete this.pendingCommands[requestId];
430
+ return;
431
+ }
432
+ const error = new CommandErrorResponse(message.reason || "", message.responseType);
433
+ this.rejectCommand(command, error);
434
+ };
435
+ // If the first arg is a known environment, resolve from config; otherwise treat it as a direct websocket URL
436
+ const isEnv = envOrWebsocketUrl === "dev" || envOrWebsocketUrl === "prod";
437
+ const envConfig = resolveBuzzConfig(isEnv ? envOrWebsocketUrl : "prod");
438
+ this.websocketUrl = isEnv
439
+ ? envConfig.websocketUrl
440
+ : envOrWebsocketUrl;
441
+ const identityUrl = (_a = this.options.identityUrl) !== null && _a !== void 0 ? _a : envConfig.identityUrl;
442
+ this.tokenManager = new TokenManager(siteId, identityUrl);
443
+ this.tokenManager.setIdToken(token);
444
+ this.queue = new ThrottledQueue(throttleWindowDuration, throttleWindowThreshold, this.onQueueError);
445
+ }
446
+ async getWebsocketUrl() {
447
+ const token = await this.tokenManager.getBuzzToken();
448
+ return `${this.websocketUrl}?ns=${this.namespace}&token=${token}`;
449
+ }
450
+ async ensureSocket() {
451
+ this.attachTokenListener();
452
+ if (!this.ws) {
453
+ this.ws = await this.createSocket();
454
+ }
455
+ return this.ws;
456
+ }
457
+ attachTokenListener() {
458
+ if (this.unsubscribeTokenChange)
459
+ return;
460
+ this.unsubscribeTokenChange = this.tokenManager.onTokenChange(async (token) => {
461
+ if (!token)
462
+ return;
463
+ if (this.ws)
464
+ this.ws.close();
465
+ this.ws = await this.createSocket();
466
+ });
467
+ }
468
+ setToken(token) {
469
+ this.tokenManager.setIdToken(token);
470
+ if (this.ws)
471
+ this.ws.close();
472
+ this.ws = null;
473
+ }
474
+ async createSocket() {
475
+ return new FaultTolerantWebSocket(await this.getWebsocketUrl(), this.onWebsocketOpen, this.onWebsocketMessage, this.onWebsocketError, this.options.websocket);
476
+ }
477
+ async subscribe(topic) {
478
+ await this.sendCommand("buzz:subscribe", topic);
479
+ }
480
+ async unsubscribe(topic) {
481
+ await this.sendCommand("buzz:unsubscribe", topic);
482
+ }
483
+ topic(topic) {
484
+ return new Topic(this, topic);
485
+ }
486
+ async sendCommand(type, topic, content) {
487
+ const requestId = `${this.nextRequestId++}`;
488
+ const payload = {
489
+ requestId,
490
+ type,
491
+ topic,
492
+ content,
493
+ };
494
+ const result = new Promise((resolve, reject) => {
495
+ const command = {
496
+ requestId,
497
+ run: () => this.sendWithTimeout(payload, command),
498
+ resolve,
499
+ reject,
500
+ };
501
+ this.pendingCommands[requestId] = command;
502
+ this.queue.push(command);
503
+ });
504
+ // Ensure the websocket connection is established so the queue can run.
505
+ // Without this, the first command could wait forever for onOpen to trigger run().
506
+ void this.ensureSocket();
507
+ return result;
508
+ }
509
+ onEvent(topic, eventName, callback) {
510
+ if (!this.eventListeners[topic]) {
511
+ this.eventListeners[topic] = {};
512
+ }
513
+ if (!this.eventListeners[topic][eventName]) {
514
+ this.eventListeners[topic][eventName] = [];
515
+ }
516
+ this.eventListeners[topic][eventName].push(callback);
517
+ }
518
+ offEvent(topic, eventName, callback) {
519
+ const topicRegistry = this.eventListeners[topic];
520
+ if (!topicRegistry)
521
+ return;
522
+ const callbacks = topicRegistry[eventName];
523
+ if (!callbacks)
524
+ return;
525
+ const index = callbacks.indexOf(callback);
526
+ if (index !== -1) {
527
+ callbacks.splice(index, 1);
528
+ }
529
+ if (callbacks.length === 0) {
530
+ delete topicRegistry[eventName];
531
+ }
532
+ if (Object.keys(topicRegistry).length === 0) {
533
+ delete this.eventListeners[topic];
534
+ }
535
+ }
536
+ clearEventListeners() {
537
+ this.eventListeners = {};
538
+ }
539
+ async disconnect() {
540
+ const ws = await this.ensureSocket();
541
+ ws.close();
542
+ this.ws = null;
543
+ this.queue.destroy();
544
+ this.pendingCommands = {};
545
+ this.eventListeners = {};
546
+ }
547
+ async sendWithTimeout(payload, command) {
548
+ const ws = await this.ensureSocket();
549
+ // Ensure the socket is open before attempting to send to avoid race conditions
550
+ if (typeof ws.whenOpen === "function") {
551
+ await ws.whenOpen();
552
+ }
553
+ ws.send(JSON.stringify(payload));
554
+ command.timeoutTimer = setTimeout(() => {
555
+ this.rejectCommand(command, new CommandTimeoutError());
556
+ }, this.options.commandTimeout || defaultCommandTimeout);
557
+ }
558
+ dispatchEvent(event) {
559
+ if (!this.eventListeners[event.topic] ||
560
+ !this.eventListeners[event.topic][event.eventName]) {
561
+ return;
562
+ }
563
+ this.eventListeners[event.topic][event.eventName].forEach((callback) => callback(event));
564
+ }
565
+ rejectCommand(command, error) {
566
+ clearTimeout(command.timeoutTimer);
567
+ command.reject(error);
568
+ delete this.pendingCommands[command.requestId];
569
+ }
570
+ }
571
+ class CommandErrorResponse extends Error {
572
+ constructor(message, errorType) {
573
+ super(message);
574
+ this.errorType = errorType;
575
+ this.name = "CommandErrorResponse";
576
+ // Fix prototype chain (needed in some environments like TS + ES5)
577
+ Object.setPrototypeOf(this, new.target.prototype);
578
+ }
579
+ }
580
+ class CommandTimeoutError extends Error {
581
+ constructor() {
582
+ super("timeout");
583
+ this.name = "CommandTimeoutError";
584
+ // Fix prototype chain (needed in some environments like TS + ES5)
585
+ Object.setPrototypeOf(this, new.target.prototype);
586
+ }
587
+ }
588
+ class WebsocketError extends Error {
589
+ constructor(message) {
590
+ super(message);
591
+ this.name = "WebsocketError";
592
+ // Fix prototype chain (needed in some environments like TS + ES5)
593
+ Object.setPrototypeOf(this, new.target.prototype);
594
+ }
595
+ }
596
+
597
+ exports.BuzzClient = BuzzClient;
598
+ exports.CommandErrorResponse = CommandErrorResponse;
599
+ exports.CommandTimeoutError = CommandTimeoutError;
600
+ exports.WebsocketError = WebsocketError;
601
+ //# sourceMappingURL=buzz-client.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buzz-client.cjs.js","sources":["../src/src/lib/fault_tolerant_websocket.ts","../src/src/lib/throttled_queue.ts","../src/src/lib/token-manager.ts","../src/src/lib/topic.ts","../src/src/lib/config.ts","../src/src/lib/index.ts"],"sourcesContent":[null,null,null,null,null,null],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";let e;Object.defineProperty(exports,"__esModule",{value:!0}),e=require("ws");class t{constructor(e,t,s,n,i={}){this.onOpen=t,this.onMessage=s,this.onError=n,this.options=i,this.reconnectDelay=1e3,this.shouldReconnect=!0,this.isOpen=!1,this.pendingOpenResolvers=[],this.url=e,this.ws=this.createWebsocket(),this.connect()}createWebsocket(){return"undefined"==typeof window?new e(this.url,void 0,{headers:this.options.headers}):new e(this.url)}connect(){let e=!1;this.ws.onopen=()=>{console.debug("WebSocket connected"),this.reconnectDelay=1e3,this.isOpen=!0,this.pendingOpenResolvers.splice(0).forEach(e=>e()),this.onOpen()},this.ws.onmessage=e=>{"string"==typeof e.data?this.onMessage(e.data):console.error("binary messages are not supported")},this.ws.onclose=e=>{console.debug("WebSocket closed. Reason:",e.reason),this.isOpen=!1,this.shouldReconnect&&this.scheduleReconnect()},this.ws.onerror=t=>{e||(e=!0,console.error("WebSocket error:",t),this.ws.close(),this.isOpen=!1,this.onError())}}scheduleReconnect(){console.debug(`Reconnecting in ${this.reconnectDelay}ms...`),setTimeout(()=>{this.reconnectDelay=Math.min(2*this.reconnectDelay,1e4),this.ws=this.createWebsocket(),this.connect()},this.reconnectDelay)}send(t){if(this.ws.readyState!==e.OPEN)throw new Error(`Websocket connection not open: ${this.ws.readyState}`);try{this.ws.send(t)}catch(e){const t="Websocket connection not open: race condition";throw console.error(t),new Error(t)}}close(){this.shouldReconnect=!1,this.ws.close()}whenOpen(){return this.isOpen&&this.ws.readyState===e.OPEN?Promise.resolve():new Promise(e=>{this.pendingOpenResolvers.push(e)})}}class s{constructor(e,t,s){this.windowDuration=e,this.threshold=t,this.onError=s,this.requests=[],this.requestCount=0,this.status=0,this.windowStart=0}push(e){if(3===this.status)throw new Error("push to a destroyed queue");this.requests.push(e),1===this.status&&this.awake()}run(){0===this.status&&(console.debug("Throttled queue processing started"),this.awake())}destroy(){void 0!==this.waitTimer&&clearTimeout(this.waitTimer),console.debug("Throttled queue destroyed"),this.status=3}awake(){this.status=2,this.processNext()}processNext(){if(3===this.status)return;const e=Date.now();e-this.windowStart>this.windowDuration&&(this.windowStart=e,this.requestCount=0);const t=this.requests.shift();void 0!==t?(this.runRequest(t),this.requestCount++,this.requestCount!==this.threshold?setTimeout(()=>this.processNext(),0):this.waitNextWindow()):this.status=1}runRequest(e){try{e.run()}catch(t){this.onError(t,e)}}waitNextWindow(){console.warn("Throttling activated");const e=Math.max(0,this.windowStart+this.windowDuration-Date.now()+500);this.waitTimer=setTimeout(()=>{console.debug("Throttling deactivated"),this.processNext()},e)}}class n{constructor(e,t){this.siteId=e,this.identityBaseUrl=t,this.currentBuzzToken=null,this.currentIdToken=null,this.isExchanging=!1,this.pendingPromise=null,this.listeners=new Set}notify(e){this.listeners.forEach(t=>t(e))}async exchange(){var e;return this.isExchanging?null!==(e=this.pendingPromise)&&void 0!==e?e:Promise.resolve():(this.isExchanging=!0,this.pendingPromise=(async()=>{var e,t;try{if(this.currentIdToken){const t=await this.exchangeAuthenticated(this.currentIdToken);this.currentBuzzToken=null!==(e=t.access_token)&&void 0!==e?e:null}else{const e=(await this.getAnonymous()).access_token,s=await this.exchangeAuthenticated(e);this.currentBuzzToken=null!==(t=s.access_token)&&void 0!==t?t:null}}finally{this.isExchanging=!1,this.pendingPromise=null,this.notify(this.currentBuzzToken)}})(),this.pendingPromise)}async exchangeAuthenticated(e){const t=`${this.identityBaseUrl}/exchange-token?siteId=${encodeURIComponent(this.siteId)}&accessToken=${encodeURIComponent(e)}`,s=await fetch(t,{method:"POST",credentials:"omit"});if(!s.ok)throw new Error(`exchangeAuthenticated failed: ${s.status}`);return await s.json()}async getAnonymous(){const e=`${this.identityBaseUrl}/anonymous-token`,t=await fetch(e,{method:"POST",credentials:"omit"});if(!t.ok)throw new Error(`getAnonymous failed: ${t.status}`);return await t.json()}async getBuzzToken(){if(this.currentBuzzToken||await this.exchange(),!this.currentBuzzToken)throw new Error("Failed to acquire buzz token");return this.currentBuzzToken}async setIdToken(e){this.currentIdToken=null!=e?e:null,await this.exchange()}onTokenChange(e){return this.listeners.add(e),()=>this.listeners.delete(e)}}class i{constructor(e,t){this.client=e,this.topic=t,this.listenerWrappers={},this.subscriptionPromise=this.client.subscribe(this.topic)}async emit(e,t){try{await this.subscriptionPromise;return await this.client.sendCommand(e,this.topic,t)}catch(e){throw e}}async on(e,t){await this.subscriptionPromise;const s=e=>{t(e)};this.listenerWrappers[e]||(this.listenerWrappers[e]=new Map),this.listenerWrappers[e].set(t,s),this.client.onEvent(this.topic,e,s)}async off(e,t){await this.subscriptionPromise;const s=this.listenerWrappers[e];if(s){if(t){const n=s.get(t);return n&&(this.client.offEvent(this.topic,e,n),s.delete(t)),void(0===s.size&&delete this.listenerWrappers[e])}for(const t of s.values())this.client.offEvent(this.topic,e,t);delete this.listenerWrappers[e]}}}function o(e){try{if("undefined"!=typeof process&&process.env&&"string"==typeof process.env[e])return process.env[e]}catch(e){}}const r=o("BUZZ_WEBSOCKET_URL"),h=o("BUZZ_WEBSOCKET_URL_DEV"),c=o("IDENTITY_SERVICE_URL"),a=o("IDENTITY_SERVICE_URL_DEV"),u={prod:{websocketUrl:r&&r.length>0?r:"wss://buzz-prd.arena.im/ws",identityUrl:c&&c.length>0?c:"https://token-service-prd.arena.im"},dev:{websocketUrl:h&&h.length>0?h:r&&r.length>0?r:"wss://buzz-prd.arena.im/ws",identityUrl:a&&a.length>0?a:c&&c.length>0?c:"https://token-service-prd.arena.im"}};class d extends Error{constructor(e,t){super(e),this.errorType=t,this.name="CommandErrorResponse",Object.setPrototypeOf(this,new.target.prototype)}}class l extends Error{constructor(){super("timeout"),this.name="CommandTimeoutError",Object.setPrototypeOf(this,new.target.prototype)}}class p extends Error{constructor(e){super(e),this.name="WebsocketError",Object.setPrototypeOf(this,new.target.prototype)}}exports.BuzzClient=class{constructor(e,t,i,o,r={}){var h;this.namespace=t,this.options=r,this.ws=null,this.nextRequestId=0,this.pendingCommands={},this.eventListeners={},this.unsubscribeTokenChange=null,this.onQueueError=(e,t)=>{const s=t.requestId,n=e instanceof Error?e.message:`${e}`,i=this.pendingCommands[s];void 0!==i?this.rejectCommand(i,new p(n)):console.warn(`Request ID not found; request: ${JSON.stringify(t)}`)},this.onWebsocketOpen=()=>{this.queue.run()},this.onWebsocketError=()=>{this.queue.destroy(),this.queue=new s(5e3,25,this.onQueueError);const e=new p("websocket connection error");Object.values(this.pendingCommands).forEach(t=>this.rejectCommand(t,e)),this.pendingCommands={}},this.onWebsocketMessage=e=>{const t=JSON.parse(e);if(t.eventName&&t.topic)return void this.dispatchEvent(t);if("rejected"===t.responseType&&"throttled"===t.reason&&console.error("Buzz server throttled this connection. Review client throttling settings"),"ack"===t.responseType)return;if(void 0===t.requestId)return void console.warn(`Missing request ID; message: ${JSON.stringify(t)}`);const s=`${t.requestId}`,n=this.pendingCommands[s];if(void 0===n)return void console.warn(`Request ID not found; message: ${JSON.stringify(t)}`);if("ok"===t.responseType||void 0===t.responseType)return clearTimeout(n.timeoutTimer),n.resolve(t),void delete this.pendingCommands[s];const i=new d(t.reason||"",t.responseType);this.rejectCommand(n,i)};const c="dev"===e||"prod"===e,a=function(e="prod"){return u[e]}(c?e:"prod");this.websocketUrl=c?a.websocketUrl:e;const l=null!==(h=this.options.identityUrl)&&void 0!==h?h:a.identityUrl;this.tokenManager=new n(i,l),this.tokenManager.setIdToken(o),this.queue=new s(5e3,25,this.onQueueError)}async getWebsocketUrl(){const e=await this.tokenManager.getBuzzToken();return`${this.websocketUrl}?ns=${this.namespace}&token=${e}`}async ensureSocket(){return this.attachTokenListener(),this.ws||(this.ws=await this.createSocket()),this.ws}attachTokenListener(){this.unsubscribeTokenChange||(this.unsubscribeTokenChange=this.tokenManager.onTokenChange(async e=>{e&&(this.ws&&this.ws.close(),this.ws=await this.createSocket())}))}setToken(e){this.tokenManager.setIdToken(e),this.ws&&this.ws.close(),this.ws=null}async createSocket(){return new t(await this.getWebsocketUrl(),this.onWebsocketOpen,this.onWebsocketMessage,this.onWebsocketError,this.options.websocket)}async subscribe(e){await this.sendCommand("buzz:subscribe",e)}async unsubscribe(e){await this.sendCommand("buzz:unsubscribe",e)}topic(e){return new i(this,e)}async sendCommand(e,t,s){const n=""+this.nextRequestId++,i={requestId:n,type:e,topic:t,content:s},o=new Promise((e,t)=>{const s={requestId:n,run:()=>this.sendWithTimeout(i,s),resolve:e,reject:t};this.pendingCommands[n]=s,this.queue.push(s)});return this.ensureSocket(),o}onEvent(e,t,s){this.eventListeners[e]||(this.eventListeners[e]={}),this.eventListeners[e][t]||(this.eventListeners[e][t]=[]),this.eventListeners[e][t].push(s)}offEvent(e,t,s){const n=this.eventListeners[e];if(!n)return;const i=n[t];if(!i)return;const o=i.indexOf(s);-1!==o&&i.splice(o,1),0===i.length&&delete n[t],0===Object.keys(n).length&&delete this.eventListeners[e]}clearEventListeners(){this.eventListeners={}}async disconnect(){(await this.ensureSocket()).close(),this.ws=null,this.queue.destroy(),this.pendingCommands={},this.eventListeners={}}async sendWithTimeout(e,t){const s=await this.ensureSocket();"function"==typeof s.whenOpen&&await s.whenOpen(),s.send(JSON.stringify(e)),t.timeoutTimer=setTimeout(()=>{this.rejectCommand(t,new l)},this.options.commandTimeout||1e4)}dispatchEvent(e){this.eventListeners[e.topic]&&this.eventListeners[e.topic][e.eventName]&&this.eventListeners[e.topic][e.eventName].forEach(t=>t(e))}rejectCommand(e,t){clearTimeout(e.timeoutTimer),e.reject(t),delete this.pendingCommands[e.requestId]}},exports.CommandErrorResponse=d,exports.CommandTimeoutError=l,exports.WebsocketError=p;
2
+ //# sourceMappingURL=buzz-client.cjs.min.js.map