@supabase/realtime-js 2.13.0 → 2.15.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.
Files changed (61) hide show
  1. package/dist/main/RealtimeChannel.d.ts.map +1 -1
  2. package/dist/main/RealtimeChannel.js +26 -10
  3. package/dist/main/RealtimeChannel.js.map +1 -1
  4. package/dist/main/RealtimeClient.d.ts +1 -1
  5. package/dist/main/RealtimeClient.d.ts.map +1 -1
  6. package/dist/main/RealtimeClient.js +22 -8
  7. package/dist/main/RealtimeClient.js.map +1 -1
  8. package/dist/main/index.d.ts +2 -1
  9. package/dist/main/index.d.ts.map +1 -1
  10. package/dist/main/index.js +3 -1
  11. package/dist/main/index.js.map +1 -1
  12. package/dist/main/lib/constants.d.ts +1 -0
  13. package/dist/main/lib/constants.d.ts.map +1 -1
  14. package/dist/main/lib/constants.js +2 -1
  15. package/dist/main/lib/constants.js.map +1 -1
  16. package/dist/main/lib/timer.d.ts.map +1 -1
  17. package/dist/main/lib/timer.js +1 -0
  18. package/dist/main/lib/timer.js.map +1 -1
  19. package/dist/main/lib/transformers.js +1 -1
  20. package/dist/main/lib/transformers.js.map +1 -1
  21. package/dist/main/lib/version.d.ts +1 -1
  22. package/dist/main/lib/version.js +1 -1
  23. package/dist/main/lib/websocket-factory.d.ts +41 -0
  24. package/dist/main/lib/websocket-factory.d.ts.map +1 -0
  25. package/dist/main/lib/websocket-factory.js +132 -0
  26. package/dist/main/lib/websocket-factory.js.map +1 -0
  27. package/dist/module/RealtimeChannel.d.ts.map +1 -1
  28. package/dist/module/RealtimeChannel.js +27 -11
  29. package/dist/module/RealtimeChannel.js.map +1 -1
  30. package/dist/module/RealtimeClient.d.ts +1 -1
  31. package/dist/module/RealtimeClient.d.ts.map +1 -1
  32. package/dist/module/RealtimeClient.js +23 -8
  33. package/dist/module/RealtimeClient.js.map +1 -1
  34. package/dist/module/index.d.ts +2 -1
  35. package/dist/module/index.d.ts.map +1 -1
  36. package/dist/module/index.js +2 -1
  37. package/dist/module/index.js.map +1 -1
  38. package/dist/module/lib/constants.d.ts +1 -0
  39. package/dist/module/lib/constants.d.ts.map +1 -1
  40. package/dist/module/lib/constants.js +1 -0
  41. package/dist/module/lib/constants.js.map +1 -1
  42. package/dist/module/lib/timer.d.ts.map +1 -1
  43. package/dist/module/lib/timer.js +1 -0
  44. package/dist/module/lib/timer.js.map +1 -1
  45. package/dist/module/lib/transformers.js +1 -1
  46. package/dist/module/lib/transformers.js.map +1 -1
  47. package/dist/module/lib/version.d.ts +1 -1
  48. package/dist/module/lib/version.js +1 -1
  49. package/dist/module/lib/websocket-factory.d.ts +41 -0
  50. package/dist/module/lib/websocket-factory.d.ts.map +1 -0
  51. package/dist/module/lib/websocket-factory.js +128 -0
  52. package/dist/module/lib/websocket-factory.js.map +1 -0
  53. package/package.json +4 -6
  54. package/src/RealtimeChannel.ts +38 -12
  55. package/src/RealtimeClient.ts +24 -14
  56. package/src/index.ts +3 -0
  57. package/src/lib/constants.ts +1 -0
  58. package/src/lib/timer.ts +1 -0
  59. package/src/lib/transformers.ts +1 -1
  60. package/src/lib/version.ts +1 -1
  61. package/src/lib/websocket-factory.ts +189 -0
@@ -1 +1 @@
1
- {"version":3,"file":"transformers.js","sourceRoot":"","sources":["../../../src/lib/transformers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transformers.js","sourceRoot":"","sources":["../../../src/lib/transformers.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export declare const version = "2.13.0";
1
+ export declare const version = "2.15.0";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,2 +1,2 @@
1
- export const version = '2.13.0';
1
+ export const version = '2.15.0';
2
2
  //# sourceMappingURL=version.js.map
@@ -0,0 +1,41 @@
1
+ export interface WebSocketLike {
2
+ readonly CONNECTING: number;
3
+ readonly OPEN: number;
4
+ readonly CLOSING: number;
5
+ readonly CLOSED: number;
6
+ readonly readyState: number;
7
+ readonly url: string;
8
+ readonly protocol: string;
9
+ close(code?: number, reason?: string): void;
10
+ send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;
11
+ onopen: ((this: any, ev: Event) => any) | null;
12
+ onmessage: ((this: any, ev: MessageEvent) => any) | null;
13
+ onclose: ((this: any, ev: CloseEvent) => any) | null;
14
+ onerror: ((this: any, ev: Event) => any) | null;
15
+ addEventListener(type: string, listener: EventListener): void;
16
+ removeEventListener(type: string, listener: EventListener): void;
17
+ binaryType?: string;
18
+ bufferedAmount?: number;
19
+ extensions?: string;
20
+ dispatchEvent?: (event: Event) => boolean;
21
+ }
22
+ export interface WebSocketEnvironment {
23
+ type: 'native' | 'ws' | 'cloudflare' | 'unsupported';
24
+ constructor?: any;
25
+ error?: string;
26
+ workaround?: string;
27
+ }
28
+ export declare class WebSocketFactory {
29
+ /**
30
+ * Dynamic require that works in both CJS and ESM environments
31
+ * Bulletproof against strict ESM environments where require might not be in scope
32
+ * @private
33
+ */
34
+ private static dynamicRequire;
35
+ private static detectEnvironment;
36
+ static getWebSocketConstructor(): typeof WebSocket;
37
+ static createWebSocket(url: string | URL, protocols?: string | string[]): WebSocketLike;
38
+ static isWebSocketSupported(): boolean;
39
+ }
40
+ export default WebSocketFactory;
41
+ //# sourceMappingURL=websocket-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-factory.d.ts","sourceRoot":"","sources":["../../../src/lib/websocket-factory.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IAEzB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3C,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,GAAG,eAAe,GAAG,IAAI,CAAA;IAEnE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,KAAK,GAAG,CAAC,GAAG,IAAI,CAAA;IAC9C,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,YAAY,KAAK,GAAG,CAAC,GAAG,IAAI,CAAA;IACxD,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,UAAU,KAAK,GAAG,CAAC,GAAG,IAAI,CAAA;IACpD,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,KAAK,GAAG,CAAC,GAAG,IAAI,CAAA;IAE/C,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAA;IAC7D,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAA;IAGhE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAA;CAC1C;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,YAAY,GAAG,aAAa,CAAA;IACpD,WAAW,CAAC,EAAE,GAAG,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,qBAAa,gBAAgB;IAC3B;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAqB7B,OAAO,CAAC,MAAM,CAAC,iBAAiB;WAgGlB,uBAAuB,IAAI,OAAO,SAAS;WAa3C,eAAe,CAC3B,GAAG,EAAE,MAAM,GAAG,GAAG,EACjB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAC5B,aAAa;WAKF,oBAAoB,IAAI,OAAO;CAQ9C;AAED,eAAe,gBAAgB,CAAA"}
@@ -0,0 +1,128 @@
1
+ export class WebSocketFactory {
2
+ /**
3
+ * Dynamic require that works in both CJS and ESM environments
4
+ * Bulletproof against strict ESM environments where require might not be in scope
5
+ * @private
6
+ */
7
+ static dynamicRequire(moduleId) {
8
+ try {
9
+ // Check if we're in a Node.js environment first
10
+ if (typeof process !== 'undefined' &&
11
+ process.versions &&
12
+ process.versions.node) {
13
+ // In Node.js, both CJS and ESM support require for dynamic imports
14
+ // Wrap in try/catch to handle strict ESM environments
15
+ if (typeof require !== 'undefined') {
16
+ return require(moduleId);
17
+ }
18
+ }
19
+ return null;
20
+ }
21
+ catch (_a) {
22
+ // Catches any error from typeof require OR require() call in strict ESM
23
+ return null;
24
+ }
25
+ }
26
+ static detectEnvironment() {
27
+ var _a, _b;
28
+ if (typeof WebSocket !== 'undefined') {
29
+ return { type: 'native', constructor: WebSocket };
30
+ }
31
+ if (typeof globalThis !== 'undefined' &&
32
+ typeof globalThis.WebSocket !== 'undefined') {
33
+ return { type: 'native', constructor: globalThis.WebSocket };
34
+ }
35
+ if (typeof global !== 'undefined' &&
36
+ typeof global.WebSocket !== 'undefined') {
37
+ return { type: 'native', constructor: global.WebSocket };
38
+ }
39
+ if (typeof globalThis !== 'undefined' &&
40
+ typeof globalThis.WebSocketPair !== 'undefined' &&
41
+ typeof globalThis.WebSocket === 'undefined') {
42
+ return {
43
+ type: 'cloudflare',
44
+ error: 'Cloudflare Workers detected. WebSocket clients are not supported in Cloudflare Workers.',
45
+ workaround: 'Use Cloudflare Workers WebSocket API for server-side WebSocket handling, or deploy to a different runtime.',
46
+ };
47
+ }
48
+ if ((typeof globalThis !== 'undefined' && globalThis.EdgeRuntime) ||
49
+ (typeof navigator !== 'undefined' &&
50
+ ((_a = navigator.userAgent) === null || _a === void 0 ? void 0 : _a.includes('Vercel-Edge')))) {
51
+ return {
52
+ type: 'unsupported',
53
+ error: 'Edge runtime detected (Vercel Edge/Netlify Edge). WebSockets are not supported in edge functions.',
54
+ workaround: 'Use serverless functions or a different deployment target for WebSocket functionality.',
55
+ };
56
+ }
57
+ if (typeof process !== 'undefined' &&
58
+ process.versions &&
59
+ process.versions.node) {
60
+ const nodeVersion = parseInt(process.versions.node.split('.')[0]);
61
+ if (nodeVersion >= 22) {
62
+ try {
63
+ if (typeof globalThis.WebSocket !== 'undefined') {
64
+ return { type: 'native', constructor: globalThis.WebSocket };
65
+ }
66
+ const undici = this.dynamicRequire('undici');
67
+ if (undici && undici.WebSocket) {
68
+ return { type: 'native', constructor: undici.WebSocket };
69
+ }
70
+ throw new Error('undici not available');
71
+ }
72
+ catch (err) {
73
+ return {
74
+ type: 'unsupported',
75
+ error: `Node.js ${nodeVersion} detected but native WebSocket not found.`,
76
+ workaround: 'Install the "ws" package or check your Node.js installation.',
77
+ };
78
+ }
79
+ }
80
+ try {
81
+ // Use dynamic require to work in both CJS and ESM environments
82
+ const ws = this.dynamicRequire('ws');
83
+ if (ws) {
84
+ return { type: 'ws', constructor: (_b = ws.WebSocket) !== null && _b !== void 0 ? _b : ws };
85
+ }
86
+ throw new Error('ws package not available');
87
+ }
88
+ catch (err) {
89
+ return {
90
+ type: 'unsupported',
91
+ error: `Node.js ${nodeVersion} detected without WebSocket support.`,
92
+ workaround: 'Install the "ws" package: npm install ws',
93
+ };
94
+ }
95
+ }
96
+ return {
97
+ type: 'unsupported',
98
+ error: 'Unknown JavaScript runtime without WebSocket support.',
99
+ workaround: "Ensure you're running in a supported environment (browser, Node.js, Deno) or provide a custom WebSocket implementation.",
100
+ };
101
+ }
102
+ static getWebSocketConstructor() {
103
+ const env = this.detectEnvironment();
104
+ if (env.constructor) {
105
+ return env.constructor;
106
+ }
107
+ let errorMessage = env.error || 'WebSocket not supported in this environment.';
108
+ if (env.workaround) {
109
+ errorMessage += `\n\nSuggested solution: ${env.workaround}`;
110
+ }
111
+ throw new Error(errorMessage);
112
+ }
113
+ static createWebSocket(url, protocols) {
114
+ const WS = this.getWebSocketConstructor();
115
+ return new WS(url, protocols);
116
+ }
117
+ static isWebSocketSupported() {
118
+ try {
119
+ const env = this.detectEnvironment();
120
+ return env.type === 'native' || env.type === 'ws';
121
+ }
122
+ catch (_a) {
123
+ return false;
124
+ }
125
+ }
126
+ }
127
+ export default WebSocketFactory;
128
+ //# sourceMappingURL=websocket-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-factory.js","sourceRoot":"","sources":["../../../src/lib/websocket-factory.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@supabase/realtime-js",
3
- "version": "2.13.0",
3
+ "version": "2.15.0",
4
4
  "description": "Listen to realtime updates to your PostgreSQL database",
5
5
  "keywords": [
6
6
  "realtime",
@@ -32,6 +32,7 @@
32
32
  "test": "vitest run",
33
33
  "test:watch": "vitest",
34
34
  "coverage": "vitest run --coverage",
35
+ "coverage:text": "vitest run --coverage.enabled true --coverage.reporter=text",
35
36
  "docs": "typedoc src/index.ts --out docs/v2",
36
37
  "docs:json": "typedoc --json docs/v2/spec.json --excludeExternals src/index.ts",
37
38
  "check-exports": "attw --pack .",
@@ -40,13 +41,11 @@
40
41
  "dependencies": {
41
42
  "@supabase/node-fetch": "^2.6.13",
42
43
  "@types/phoenix": "^1.6.6",
43
- "isows": "^1.0.7",
44
- "@types/ws": "^8.18.1",
45
- "ws": "^8.18.2"
44
+ "ws": "^8.18.2",
45
+ "@types/ws": "^8.18.1"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@arethetypeswrong/cli": "^0.16.4",
49
- "@types/sinon": "^17.0.4",
50
49
  "@vitest/coverage-v8": "^3.1.4",
51
50
  "eslint": "^9.27.0",
52
51
  "esm": "^3.2.25",
@@ -58,7 +57,6 @@
58
57
  "nyc": "^15.1.0",
59
58
  "prettier": "^2.8.8",
60
59
  "semantic-release-plugin-update-version-in-files": "^1.1.0",
61
- "sinon": "^18.0.1",
62
60
  "typedoc": "^0.27.9",
63
61
  "typescript": "^5.8.3",
64
62
  "vitest": "^3.1.4",
@@ -1,4 +1,8 @@
1
- import { CHANNEL_EVENTS, CHANNEL_STATES } from './lib/constants'
1
+ import {
2
+ CHANNEL_EVENTS,
3
+ CHANNEL_STATES,
4
+ MAX_PUSH_BUFFER_SIZE,
5
+ } from './lib/constants'
2
6
  import Push from './lib/push'
3
7
  import type RealtimeClient from './RealtimeClient'
4
8
  import Timer from './lib/timer'
@@ -213,8 +217,7 @@ export default class RealtimeChannel {
213
217
 
214
218
  this.presence = new RealtimePresence(this)
215
219
 
216
- this.broadcastEndpointURL =
217
- httpEndpointURL(this.socket.endPoint) + '/api/broadcast'
220
+ this.broadcastEndpointURL = httpEndpointURL(this.socket.endPoint)
218
221
  this.private = this.params.config.private || false
219
222
  }
220
223
 
@@ -571,8 +574,11 @@ export default class RealtimeChannel {
571
574
  */
572
575
  teardown() {
573
576
  this.pushBuffer.forEach((push: Push) => push.destroy())
574
- this.rejoinTimer && clearTimeout(this.rejoinTimer.timer)
577
+ this.pushBuffer = []
578
+ this.rejoinTimer.reset()
575
579
  this.joinPush.destroy()
580
+ this.state = CHANNEL_STATES.closed
581
+ this.bindings = {}
576
582
  }
577
583
 
578
584
  /** @internal */
@@ -608,13 +614,31 @@ export default class RealtimeChannel {
608
614
  if (this._canPush()) {
609
615
  pushEvent.send()
610
616
  } else {
611
- pushEvent.startTimeout()
612
- this.pushBuffer.push(pushEvent)
617
+ this._addToPushBuffer(pushEvent)
613
618
  }
614
619
 
615
620
  return pushEvent
616
621
  }
617
622
 
623
+ /** @internal */
624
+ _addToPushBuffer(pushEvent: Push) {
625
+ pushEvent.startTimeout()
626
+ this.pushBuffer.push(pushEvent)
627
+
628
+ // Enforce buffer size limit
629
+ if (this.pushBuffer.length > MAX_PUSH_BUFFER_SIZE) {
630
+ const removedPush = this.pushBuffer.shift()
631
+ if (removedPush) {
632
+ removedPush.destroy()
633
+ this.socket.log(
634
+ 'channel',
635
+ `discarded push due to buffer overflow: ${removedPush.event}`,
636
+ removedPush.payload
637
+ )
638
+ }
639
+ }
640
+ }
641
+
618
642
  /**
619
643
  * Overridable message hook
620
644
  *
@@ -757,12 +781,14 @@ export default class RealtimeChannel {
757
781
  _off(type: string, filter: { [key: string]: any }) {
758
782
  const typeLower = type.toLocaleLowerCase()
759
783
 
760
- this.bindings[typeLower] = this.bindings[typeLower].filter((bind) => {
761
- return !(
762
- bind.type?.toLocaleLowerCase() === typeLower &&
763
- RealtimeChannel.isEqual(bind.filter, filter)
764
- )
765
- })
784
+ if (this.bindings[typeLower]) {
785
+ this.bindings[typeLower] = this.bindings[typeLower].filter((bind) => {
786
+ return !(
787
+ bind.type?.toLocaleLowerCase() === typeLower &&
788
+ RealtimeChannel.isEqual(bind.filter, filter)
789
+ )
790
+ })
791
+ }
766
792
  return this
767
793
  }
768
794
 
@@ -1,4 +1,4 @@
1
- import { WebSocket } from 'isows'
1
+ import WebSocketFactory, { WebSocketLike } from './lib/websocket-factory'
2
2
 
3
3
  import {
4
4
  CHANNEL_EVENTS,
@@ -69,8 +69,6 @@ export interface WebSocketLikeConstructor {
69
69
  ): WebSocketLike
70
70
  }
71
71
 
72
- export type WebSocketLike = WebSocket
73
-
74
72
  export interface WebSocketLikeError {
75
73
  error: any
76
74
  message: string
@@ -200,14 +198,16 @@ export default class RealtimeClient {
200
198
 
201
199
  // Establish WebSocket connection
202
200
  if (!this.transport) {
203
- this.transport = WebSocket
204
- }
205
- if (!this.transport) {
206
- this._setConnectionState('disconnected')
207
- throw new Error('No transport provided')
201
+ try {
202
+ this.conn = WebSocketFactory.createWebSocket(this.endpointURL())
203
+ } catch (error) {
204
+ this._setConnectionState('disconnected')
205
+ throw new Error(`WebSocket not available: ${(error as Error).message}`)
206
+ }
207
+ } else {
208
+ // Use custom transport if provided
209
+ this.conn = new this.transport!(this.endpointURL()) as WebSocketLike
208
210
  }
209
-
210
- this.conn = new this.transport!(this.endpointURL()) as WebSocketLike
211
211
  this._setupConnectionHandlers()
212
212
  }
213
213
 
@@ -462,10 +462,16 @@ export default class RealtimeClient {
462
462
  if (customFetch) {
463
463
  _fetch = customFetch
464
464
  } else if (typeof fetch === 'undefined') {
465
+ // Node.js environment without native fetch
465
466
  _fetch = (...args) =>
466
- import('@supabase/node-fetch' as any).then(({ default: fetch }) =>
467
- fetch(...args)
468
- )
467
+ import('@supabase/node-fetch' as any)
468
+ .then(({ default: fetch }) => fetch(...args))
469
+ .catch((error) => {
470
+ throw new Error(
471
+ `Failed to load @supabase/node-fetch: ${error.message}. ` +
472
+ `This is required for HTTP requests in Node.js environments without native fetch.`
473
+ )
474
+ })
469
475
  } else {
470
476
  _fetch = fetch
471
477
  }
@@ -577,7 +583,11 @@ export default class RealtimeClient {
577
583
  private _setupConnectionHandlers(): void {
578
584
  if (!this.conn) return
579
585
 
580
- this.conn.binaryType = 'arraybuffer'
586
+ // Set binary type if supported (browsers and most WebSocket implementations)
587
+ if ('binaryType' in this.conn) {
588
+ ;(this.conn as any).binaryType = 'arraybuffer'
589
+ }
590
+
581
591
  this.conn.onopen = () => this._onConnOpen()
582
592
  this.conn.onerror = (error: Event) => this._onConnError(error)
583
593
  this.conn.onmessage = (event: any) => this._onConnMessage(event)
package/src/index.ts CHANGED
@@ -22,6 +22,7 @@ import RealtimePresence, {
22
22
  RealtimePresenceLeavePayload,
23
23
  REALTIME_PRESENCE_LISTEN_EVENTS,
24
24
  } from './RealtimePresence'
25
+ import WebSocketFactory, { WebSocketLike } from './lib/websocket-factory'
25
26
 
26
27
  export {
27
28
  RealtimePresence,
@@ -45,4 +46,6 @@ export {
45
46
  REALTIME_PRESENCE_LISTEN_EVENTS,
46
47
  REALTIME_SUBSCRIBE_STATES,
47
48
  REALTIME_CHANNEL_STATES,
49
+ WebSocketFactory,
50
+ WebSocketLike,
48
51
  }
@@ -8,6 +8,7 @@ export const VERSION = version
8
8
  export const DEFAULT_TIMEOUT = 10000
9
9
 
10
10
  export const WS_CLOSE_NORMAL = 1000
11
+ export const MAX_PUSH_BUFFER_SIZE = 100
11
12
 
12
13
  export enum SOCKET_STATES {
13
14
  connecting = 0,
package/src/lib/timer.ts CHANGED
@@ -22,6 +22,7 @@ export default class Timer {
22
22
  reset() {
23
23
  this.tries = 0
24
24
  clearTimeout(this.timer)
25
+ this.timer = undefined
25
26
  }
26
27
 
27
28
  // Cancels any previous scheduleTimeout and schedules callback
@@ -250,5 +250,5 @@ export const httpEndpointURL = (socketUrl: string): string => {
250
250
  let url = socketUrl
251
251
  url = url.replace(/^ws/i, 'http')
252
252
  url = url.replace(/(\/socket\/websocket|\/socket|\/websocket)\/?$/i, '')
253
- return url.replace(/\/+$/, '')
253
+ return url.replace(/\/+$/, '') + '/api/broadcast'
254
254
  }
@@ -1 +1 @@
1
- export const version = '2.13.0'
1
+ export const version = '2.15.0'
@@ -0,0 +1,189 @@
1
+ export interface WebSocketLike {
2
+ readonly CONNECTING: number
3
+ readonly OPEN: number
4
+ readonly CLOSING: number
5
+ readonly CLOSED: number
6
+ readonly readyState: number
7
+ readonly url: string
8
+ readonly protocol: string
9
+
10
+ close(code?: number, reason?: string): void
11
+ send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void
12
+
13
+ onopen: ((this: any, ev: Event) => any) | null
14
+ onmessage: ((this: any, ev: MessageEvent) => any) | null
15
+ onclose: ((this: any, ev: CloseEvent) => any) | null
16
+ onerror: ((this: any, ev: Event) => any) | null
17
+
18
+ addEventListener(type: string, listener: EventListener): void
19
+ removeEventListener(type: string, listener: EventListener): void
20
+
21
+ // Add additional properties that may exist on WebSocket implementations
22
+ binaryType?: string
23
+ bufferedAmount?: number
24
+ extensions?: string
25
+ dispatchEvent?: (event: Event) => boolean
26
+ }
27
+
28
+ export interface WebSocketEnvironment {
29
+ type: 'native' | 'ws' | 'cloudflare' | 'unsupported'
30
+ constructor?: any
31
+ error?: string
32
+ workaround?: string
33
+ }
34
+
35
+ export class WebSocketFactory {
36
+ /**
37
+ * Dynamic require that works in both CJS and ESM environments
38
+ * Bulletproof against strict ESM environments where require might not be in scope
39
+ * @private
40
+ */
41
+ private static dynamicRequire(moduleId: string): any {
42
+ try {
43
+ // Check if we're in a Node.js environment first
44
+ if (
45
+ typeof process !== 'undefined' &&
46
+ process.versions &&
47
+ process.versions.node
48
+ ) {
49
+ // In Node.js, both CJS and ESM support require for dynamic imports
50
+ // Wrap in try/catch to handle strict ESM environments
51
+ if (typeof require !== 'undefined') {
52
+ return require(moduleId)
53
+ }
54
+ }
55
+ return null
56
+ } catch {
57
+ // Catches any error from typeof require OR require() call in strict ESM
58
+ return null
59
+ }
60
+ }
61
+
62
+ private static detectEnvironment(): WebSocketEnvironment {
63
+ if (typeof WebSocket !== 'undefined') {
64
+ return { type: 'native', constructor: WebSocket }
65
+ }
66
+
67
+ if (
68
+ typeof globalThis !== 'undefined' &&
69
+ typeof (globalThis as any).WebSocket !== 'undefined'
70
+ ) {
71
+ return { type: 'native', constructor: (globalThis as any).WebSocket }
72
+ }
73
+
74
+ if (
75
+ typeof global !== 'undefined' &&
76
+ typeof (global as any).WebSocket !== 'undefined'
77
+ ) {
78
+ return { type: 'native', constructor: (global as any).WebSocket }
79
+ }
80
+
81
+ if (
82
+ typeof globalThis !== 'undefined' &&
83
+ typeof (globalThis as any).WebSocketPair !== 'undefined' &&
84
+ typeof globalThis.WebSocket === 'undefined'
85
+ ) {
86
+ return {
87
+ type: 'cloudflare',
88
+ error:
89
+ 'Cloudflare Workers detected. WebSocket clients are not supported in Cloudflare Workers.',
90
+ workaround:
91
+ 'Use Cloudflare Workers WebSocket API for server-side WebSocket handling, or deploy to a different runtime.',
92
+ }
93
+ }
94
+
95
+ if (
96
+ (typeof globalThis !== 'undefined' && (globalThis as any).EdgeRuntime) ||
97
+ (typeof navigator !== 'undefined' &&
98
+ navigator.userAgent?.includes('Vercel-Edge'))
99
+ ) {
100
+ return {
101
+ type: 'unsupported',
102
+ error:
103
+ 'Edge runtime detected (Vercel Edge/Netlify Edge). WebSockets are not supported in edge functions.',
104
+ workaround:
105
+ 'Use serverless functions or a different deployment target for WebSocket functionality.',
106
+ }
107
+ }
108
+
109
+ if (
110
+ typeof process !== 'undefined' &&
111
+ process.versions &&
112
+ process.versions.node
113
+ ) {
114
+ const nodeVersion = parseInt(process.versions.node.split('.')[0])
115
+ if (nodeVersion >= 22) {
116
+ try {
117
+ if (typeof globalThis.WebSocket !== 'undefined') {
118
+ return { type: 'native', constructor: globalThis.WebSocket }
119
+ }
120
+ const undici = this.dynamicRequire('undici')
121
+ if (undici && undici.WebSocket) {
122
+ return { type: 'native', constructor: undici.WebSocket }
123
+ }
124
+ throw new Error('undici not available')
125
+ } catch (err) {
126
+ return {
127
+ type: 'unsupported',
128
+ error: `Node.js ${nodeVersion} detected but native WebSocket not found.`,
129
+ workaround:
130
+ 'Install the "ws" package or check your Node.js installation.',
131
+ }
132
+ }
133
+ }
134
+ try {
135
+ // Use dynamic require to work in both CJS and ESM environments
136
+ const ws = this.dynamicRequire('ws')
137
+ if (ws) {
138
+ return { type: 'ws', constructor: ws.WebSocket ?? ws }
139
+ }
140
+ throw new Error('ws package not available')
141
+ } catch (err) {
142
+ return {
143
+ type: 'unsupported',
144
+ error: `Node.js ${nodeVersion} detected without WebSocket support.`,
145
+ workaround: 'Install the "ws" package: npm install ws',
146
+ }
147
+ }
148
+ }
149
+
150
+ return {
151
+ type: 'unsupported',
152
+ error: 'Unknown JavaScript runtime without WebSocket support.',
153
+ workaround:
154
+ "Ensure you're running in a supported environment (browser, Node.js, Deno) or provide a custom WebSocket implementation.",
155
+ }
156
+ }
157
+
158
+ public static getWebSocketConstructor(): typeof WebSocket {
159
+ const env = this.detectEnvironment()
160
+ if (env.constructor) {
161
+ return env.constructor
162
+ }
163
+ let errorMessage =
164
+ env.error || 'WebSocket not supported in this environment.'
165
+ if (env.workaround) {
166
+ errorMessage += `\n\nSuggested solution: ${env.workaround}`
167
+ }
168
+ throw new Error(errorMessage)
169
+ }
170
+
171
+ public static createWebSocket(
172
+ url: string | URL,
173
+ protocols?: string | string[]
174
+ ): WebSocketLike {
175
+ const WS = this.getWebSocketConstructor()
176
+ return new WS(url, protocols)
177
+ }
178
+
179
+ public static isWebSocketSupported(): boolean {
180
+ try {
181
+ const env = this.detectEnvironment()
182
+ return env.type === 'native' || env.type === 'ws'
183
+ } catch {
184
+ return false
185
+ }
186
+ }
187
+ }
188
+
189
+ export default WebSocketFactory