openai 6.34.0 → 6.35.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 (112) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/core/EventEmitter.d.mts +11 -0
  3. package/core/EventEmitter.d.mts.map +1 -1
  4. package/core/EventEmitter.d.ts +11 -0
  5. package/core/EventEmitter.d.ts.map +1 -1
  6. package/core/EventEmitter.js +15 -1
  7. package/core/EventEmitter.js.map +1 -1
  8. package/core/EventEmitter.mjs +13 -0
  9. package/core/EventEmitter.mjs.map +1 -1
  10. package/internal/types.d.mts +6 -6
  11. package/internal/types.d.mts.map +1 -1
  12. package/internal/types.d.ts +6 -6
  13. package/internal/types.d.ts.map +1 -1
  14. package/internal/utils/env.js +2 -2
  15. package/internal/utils/env.js.map +1 -1
  16. package/internal/utils/env.mjs +2 -2
  17. package/internal/utils/env.mjs.map +1 -1
  18. package/internal/ws-adapter-browser.d.mts +34 -0
  19. package/internal/ws-adapter-browser.d.mts.map +1 -0
  20. package/internal/ws-adapter-browser.d.ts +34 -0
  21. package/internal/ws-adapter-browser.d.ts.map +1 -0
  22. package/internal/ws-adapter-browser.js +88 -0
  23. package/internal/ws-adapter-browser.js.map +1 -0
  24. package/internal/ws-adapter-browser.mjs +84 -0
  25. package/internal/ws-adapter-browser.mjs.map +1 -0
  26. package/internal/ws-adapter-node.d.mts +27 -0
  27. package/internal/ws-adapter-node.d.mts.map +1 -0
  28. package/internal/ws-adapter-node.d.ts +27 -0
  29. package/internal/ws-adapter-node.d.ts.map +1 -0
  30. package/internal/ws-adapter-node.js +90 -0
  31. package/internal/ws-adapter-node.js.map +1 -0
  32. package/internal/ws-adapter-node.mjs +86 -0
  33. package/internal/ws-adapter-node.mjs.map +1 -0
  34. package/internal/ws-adapter.d.mts +24 -0
  35. package/internal/ws-adapter.d.mts.map +1 -0
  36. package/internal/ws-adapter.d.ts +24 -0
  37. package/internal/ws-adapter.d.ts.map +1 -0
  38. package/internal/ws-adapter.js +11 -0
  39. package/internal/ws-adapter.js.map +1 -0
  40. package/internal/ws-adapter.mjs +8 -0
  41. package/internal/ws-adapter.mjs.map +1 -0
  42. package/internal/ws.d.mts +80 -0
  43. package/internal/ws.d.mts.map +1 -0
  44. package/internal/ws.d.ts +80 -0
  45. package/internal/ws.d.ts.map +1 -0
  46. package/internal/ws.js +153 -0
  47. package/internal/ws.js.map +1 -0
  48. package/internal/ws.mjs +147 -0
  49. package/internal/ws.mjs.map +1 -0
  50. package/package.json +13 -13
  51. package/resources/audio/speech.d.mts +2 -2
  52. package/resources/audio/speech.d.ts +2 -2
  53. package/resources/audio/speech.js +2 -2
  54. package/resources/audio/speech.mjs +2 -2
  55. package/resources/chat/completions/completions.d.mts +1 -1
  56. package/resources/chat/completions/completions.d.ts +1 -1
  57. package/resources/completions.d.mts +1 -1
  58. package/resources/completions.d.ts +1 -1
  59. package/resources/responses/index.d.mts +2 -0
  60. package/resources/responses/index.d.mts.map +1 -1
  61. package/resources/responses/index.d.ts +2 -0
  62. package/resources/responses/index.d.ts.map +1 -1
  63. package/resources/responses/internal-base.d.mts +24 -2
  64. package/resources/responses/internal-base.d.mts.map +1 -1
  65. package/resources/responses/internal-base.d.ts +24 -2
  66. package/resources/responses/internal-base.d.ts.map +1 -1
  67. package/resources/responses/internal-base.js +5 -9
  68. package/resources/responses/internal-base.js.map +1 -1
  69. package/resources/responses/internal-base.mjs +5 -9
  70. package/resources/responses/internal-base.mjs.map +1 -1
  71. package/resources/responses/responses.d.mts +19 -3
  72. package/resources/responses/responses.d.mts.map +1 -1
  73. package/resources/responses/responses.d.ts +19 -3
  74. package/resources/responses/responses.d.ts.map +1 -1
  75. package/resources/responses/responses.js.map +1 -1
  76. package/resources/responses/responses.mjs.map +1 -1
  77. package/resources/responses/ws-base.d.mts +106 -0
  78. package/resources/responses/ws-base.d.mts.map +1 -0
  79. package/resources/responses/ws-base.d.ts +106 -0
  80. package/resources/responses/ws-base.d.ts.map +1 -0
  81. package/resources/responses/ws-base.js +474 -0
  82. package/resources/responses/ws-base.js.map +1 -0
  83. package/resources/responses/ws-base.mjs +470 -0
  84. package/resources/responses/ws-base.mjs.map +1 -0
  85. package/resources/responses/ws.d.mts +9 -38
  86. package/resources/responses/ws.d.mts.map +1 -1
  87. package/resources/responses/ws.d.ts +9 -38
  88. package/resources/responses/ws.d.ts.map +1 -1
  89. package/resources/responses/ws.js +17 -171
  90. package/resources/responses/ws.js.map +1 -1
  91. package/resources/responses/ws.mjs +17 -171
  92. package/resources/responses/ws.mjs.map +1 -1
  93. package/src/core/EventEmitter.ts +16 -0
  94. package/src/internal/types.ts +6 -8
  95. package/src/internal/utils/env.ts +2 -2
  96. package/src/internal/ws-adapter-browser.ts +123 -0
  97. package/src/internal/ws-adapter-node.ts +105 -0
  98. package/src/internal/ws-adapter.ts +30 -0
  99. package/src/internal/ws.ts +193 -0
  100. package/src/resources/audio/speech.ts +2 -2
  101. package/src/resources/chat/completions/completions.ts +1 -1
  102. package/src/resources/completions.ts +1 -1
  103. package/src/resources/responses/index.ts +2 -0
  104. package/src/resources/responses/internal-base.ts +26 -10
  105. package/src/resources/responses/responses.ts +22 -3
  106. package/src/resources/responses/ws-base.ts +609 -0
  107. package/src/resources/responses/ws.ts +23 -186
  108. package/src/version.ts +1 -1
  109. package/version.d.mts +1 -1
  110. package/version.d.ts +1 -1
  111. package/version.js +1 -1
  112. package/version.mjs +1 -1
@@ -4,181 +4,27 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.ResponsesWS = void 0;
5
5
  const tslib_1 = require("../../internal/tslib.js");
6
6
  const WS = tslib_1.__importStar(require("ws"));
7
- const internal_base_1 = require("./internal-base.js");
8
- class ResponsesWS extends internal_base_1.ResponsesEmitter {
7
+ const ws_adapter_node_1 = require("../../internal/ws-adapter-node.js");
8
+ const ws_base_1 = require("./ws-base.js");
9
+ class ResponsesWS extends ws_base_1.ResponsesWSBase {
9
10
  constructor(client, options) {
10
- super();
11
- this.client = client;
12
- this.url = (0, internal_base_1.buildURL)(client, {});
13
- this.socket = new WS.WebSocket(this.url, {
14
- ...options,
15
- headers: {
16
- ...this.authHeaders(),
17
- ...options?.headers,
18
- },
19
- });
20
- this.socket.on('message', (wsEvent) => {
21
- const event = (() => {
22
- try {
23
- return JSON.parse(wsEvent.toString());
24
- }
25
- catch (err) {
26
- this._onError(null, 'could not parse websocket event', err);
27
- return null;
28
- }
29
- })();
30
- if (event) {
31
- this._emit('event', event);
32
- if (event.type === 'error') {
33
- this._onError(event);
34
- }
35
- else {
36
- // @ts-ignore TS isn't smart enough to get the relationship right here
37
- this._emit(event.type, event);
38
- }
39
- }
40
- });
41
- this.socket.on('error', (err) => {
42
- this._onError(null, err.message, err);
43
- });
44
- }
45
- send(event) {
46
- try {
47
- this.socket.send(JSON.stringify(event));
48
- }
49
- catch (err) {
50
- this._onError(null, 'could not send data', err);
11
+ if (!WS?.WebSocket) {
12
+ throw new Error('ResponsesWS from "openai/resources/responses/ws" requires the "ws" package but it could not be loaded.');
51
13
  }
14
+ const { reconnect, maxQueueSize, ...wsOptions } = options ?? {};
15
+ super(client, { reconnect, maxQueueSize });
16
+ this._wsOptions = wsOptions;
17
+ this._connectInitial();
52
18
  }
53
- close(props) {
54
- try {
55
- this.socket.close(props?.code ?? 1000, props?.reason ?? 'OK');
56
- }
57
- catch (err) {
58
- this._onError(null, 'could not close the connection', err);
59
- }
60
- }
61
- /**
62
- * Returns an async iterator over WebSocket lifecycle and message events,
63
- * providing an alternative to the event-based `.on()` API.
64
- * The iterator will exit if the socket closes but breaking out of the iterator
65
- * does not close the socket.
66
- *
67
- * @example
68
- * ```ts
69
- * for await (const event of connection.stream()) {
70
- * switch (event.type) {
71
- * case 'message':
72
- * console.log('received:', event.message);
73
- * break;
74
- * case 'error':
75
- * console.error(event.error);
76
- * break;
77
- * case 'close':
78
- * console.log('connection closed');
79
- * break;
80
- * }
81
- * }
82
- * ```
83
- */
84
- stream() {
85
- return this[Symbol.asyncIterator]();
86
- }
87
- [Symbol.asyncIterator]() {
88
- // Two-queue async iterator: `queue` buffers incoming messages,
89
- // `resolvers` buffers waiting next() calls. A push wakes the
90
- // oldest next(); a next() drains the oldest message.
91
- const queue = [];
92
- const resolvers = [];
93
- let done = false;
94
- const push = (msg) => {
95
- queue.push(msg);
96
- resolvers.shift()?.();
97
- };
98
- const onEvent = (event) => {
99
- if (event.type === 'error')
100
- return; // handled by onEmitterError
101
- push({ type: 'message', message: event });
102
- };
103
- // Catches both API-level and socket-level errors via _onError → _emit('error')
104
- const onEmitterError = (err) => {
105
- push({ type: 'error', error: err });
106
- };
107
- const onOpen = () => {
108
- push({ type: 'open' });
109
- };
110
- const flushResolvers = () => {
111
- for (let resolver = resolvers.shift(); resolver; resolver = resolvers.shift()) {
112
- resolver();
113
- }
114
- };
115
- const onClose = () => {
116
- push({ type: 'close' });
117
- done = true;
118
- flushResolvers();
119
- cleanup();
120
- };
121
- const cleanup = () => {
122
- this.off('event', onEvent);
123
- this.off('error', onEmitterError);
124
- this.socket.off('open', onOpen);
125
- this.socket.off('close', onClose);
126
- };
127
- this.on('event', onEvent);
128
- this.on('error', onEmitterError);
129
- this.socket.on('open', onOpen);
130
- this.socket.on('close', onClose);
131
- switch (this.socket.readyState) {
132
- case WS.WebSocket.CONNECTING:
133
- push({ type: 'connecting' });
134
- break;
135
- case WS.WebSocket.OPEN:
136
- push({ type: 'open' });
137
- break;
138
- case WS.WebSocket.CLOSING:
139
- push({ type: 'closing' });
140
- break;
141
- case WS.WebSocket.CLOSED:
142
- push({ type: 'close' });
143
- done = true;
144
- cleanup();
145
- break;
146
- }
147
- const resolve = (res) => {
148
- if (queue.length > 0) {
149
- res({ value: queue.shift(), done: false });
150
- }
151
- else if (done) {
152
- res({ value: undefined, done: true });
153
- }
154
- else {
155
- return false;
156
- }
157
- return true;
158
- };
159
- const next = () => new Promise((res) => {
160
- if (resolve(res))
161
- return;
162
- resolvers.push(() => {
163
- resolve(res);
164
- });
165
- });
166
- return {
167
- next,
168
- return: () => {
169
- done = true;
170
- cleanup();
171
- flushResolvers();
172
- return Promise.resolve({ value: undefined, done: true });
173
- },
174
- [Symbol.asyncIterator]() {
175
- return this;
19
+ _createSocket(url, authHeaders) {
20
+ const ws = new WS.WebSocket(url, {
21
+ ...this._wsOptions,
22
+ headers: {
23
+ ...authHeaders,
24
+ ...this._wsOptions?.headers,
176
25
  },
177
- };
178
- }
179
- authHeaders() {
180
- return { Authorization: `Bearer ${this.client.apiKey}` };
181
- return {};
26
+ });
27
+ return new ws_adapter_node_1.NodeWebSocket(ws);
182
28
  }
183
29
  }
184
30
  exports.ResponsesWS = ResponsesWS;
@@ -1 +1 @@
1
- {"version":3,"file":"ws.js","sourceRoot":"","sources":["../../src/resources/responses/ws.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ws.js","sourceRoot":"","sources":["../../src/resources/responses/ws.ts"],"names":[],"mappings":";AAAA,sFAAsF;;;;AAEtF,+CAAyB;AACzB,uEAA+D;AAC/D,0CAAyE;AAOzE,MAAa,WAAY,SAAQ,yBAA8B;IAG7D,YAAY,MAAc,EAAE,OAAqD;QAC/E,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,wGAAwG,CACzG,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,SAAS,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;QAChE,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAES,aAAa,CAAC,GAAQ,EAAE,WAAmC;QACnE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE;YAC/B,GAAG,IAAI,CAAC,UAAU;YAClB,OAAO,EAAE;gBACP,GAAG,WAAW;gBACd,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO;aAC5B;SACF,CAAC,CAAC;QACH,OAAO,IAAI,+BAAa,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;CACF;AA1BD,kCA0BC"}
@@ -1,180 +1,26 @@
1
1
  // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
  import * as WS from 'ws';
3
- import { ResponsesEmitter, buildURL } from "./internal-base.mjs";
4
- export class ResponsesWS extends ResponsesEmitter {
3
+ import { NodeWebSocket } from "../../internal/ws-adapter-node.mjs";
4
+ import { ResponsesWSBase } from "./ws-base.mjs";
5
+ export class ResponsesWS extends ResponsesWSBase {
5
6
  constructor(client, options) {
6
- super();
7
- this.client = client;
8
- this.url = buildURL(client, {});
9
- this.socket = new WS.WebSocket(this.url, {
10
- ...options,
11
- headers: {
12
- ...this.authHeaders(),
13
- ...options?.headers,
14
- },
15
- });
16
- this.socket.on('message', (wsEvent) => {
17
- const event = (() => {
18
- try {
19
- return JSON.parse(wsEvent.toString());
20
- }
21
- catch (err) {
22
- this._onError(null, 'could not parse websocket event', err);
23
- return null;
24
- }
25
- })();
26
- if (event) {
27
- this._emit('event', event);
28
- if (event.type === 'error') {
29
- this._onError(event);
30
- }
31
- else {
32
- // @ts-ignore TS isn't smart enough to get the relationship right here
33
- this._emit(event.type, event);
34
- }
35
- }
36
- });
37
- this.socket.on('error', (err) => {
38
- this._onError(null, err.message, err);
39
- });
40
- }
41
- send(event) {
42
- try {
43
- this.socket.send(JSON.stringify(event));
44
- }
45
- catch (err) {
46
- this._onError(null, 'could not send data', err);
7
+ if (!WS?.WebSocket) {
8
+ throw new Error('ResponsesWS from "openai/resources/responses/ws" requires the "ws" package but it could not be loaded.');
47
9
  }
10
+ const { reconnect, maxQueueSize, ...wsOptions } = options ?? {};
11
+ super(client, { reconnect, maxQueueSize });
12
+ this._wsOptions = wsOptions;
13
+ this._connectInitial();
48
14
  }
49
- close(props) {
50
- try {
51
- this.socket.close(props?.code ?? 1000, props?.reason ?? 'OK');
52
- }
53
- catch (err) {
54
- this._onError(null, 'could not close the connection', err);
55
- }
56
- }
57
- /**
58
- * Returns an async iterator over WebSocket lifecycle and message events,
59
- * providing an alternative to the event-based `.on()` API.
60
- * The iterator will exit if the socket closes but breaking out of the iterator
61
- * does not close the socket.
62
- *
63
- * @example
64
- * ```ts
65
- * for await (const event of connection.stream()) {
66
- * switch (event.type) {
67
- * case 'message':
68
- * console.log('received:', event.message);
69
- * break;
70
- * case 'error':
71
- * console.error(event.error);
72
- * break;
73
- * case 'close':
74
- * console.log('connection closed');
75
- * break;
76
- * }
77
- * }
78
- * ```
79
- */
80
- stream() {
81
- return this[Symbol.asyncIterator]();
82
- }
83
- [Symbol.asyncIterator]() {
84
- // Two-queue async iterator: `queue` buffers incoming messages,
85
- // `resolvers` buffers waiting next() calls. A push wakes the
86
- // oldest next(); a next() drains the oldest message.
87
- const queue = [];
88
- const resolvers = [];
89
- let done = false;
90
- const push = (msg) => {
91
- queue.push(msg);
92
- resolvers.shift()?.();
93
- };
94
- const onEvent = (event) => {
95
- if (event.type === 'error')
96
- return; // handled by onEmitterError
97
- push({ type: 'message', message: event });
98
- };
99
- // Catches both API-level and socket-level errors via _onError → _emit('error')
100
- const onEmitterError = (err) => {
101
- push({ type: 'error', error: err });
102
- };
103
- const onOpen = () => {
104
- push({ type: 'open' });
105
- };
106
- const flushResolvers = () => {
107
- for (let resolver = resolvers.shift(); resolver; resolver = resolvers.shift()) {
108
- resolver();
109
- }
110
- };
111
- const onClose = () => {
112
- push({ type: 'close' });
113
- done = true;
114
- flushResolvers();
115
- cleanup();
116
- };
117
- const cleanup = () => {
118
- this.off('event', onEvent);
119
- this.off('error', onEmitterError);
120
- this.socket.off('open', onOpen);
121
- this.socket.off('close', onClose);
122
- };
123
- this.on('event', onEvent);
124
- this.on('error', onEmitterError);
125
- this.socket.on('open', onOpen);
126
- this.socket.on('close', onClose);
127
- switch (this.socket.readyState) {
128
- case WS.WebSocket.CONNECTING:
129
- push({ type: 'connecting' });
130
- break;
131
- case WS.WebSocket.OPEN:
132
- push({ type: 'open' });
133
- break;
134
- case WS.WebSocket.CLOSING:
135
- push({ type: 'closing' });
136
- break;
137
- case WS.WebSocket.CLOSED:
138
- push({ type: 'close' });
139
- done = true;
140
- cleanup();
141
- break;
142
- }
143
- const resolve = (res) => {
144
- if (queue.length > 0) {
145
- res({ value: queue.shift(), done: false });
146
- }
147
- else if (done) {
148
- res({ value: undefined, done: true });
149
- }
150
- else {
151
- return false;
152
- }
153
- return true;
154
- };
155
- const next = () => new Promise((res) => {
156
- if (resolve(res))
157
- return;
158
- resolvers.push(() => {
159
- resolve(res);
160
- });
161
- });
162
- return {
163
- next,
164
- return: () => {
165
- done = true;
166
- cleanup();
167
- flushResolvers();
168
- return Promise.resolve({ value: undefined, done: true });
169
- },
170
- [Symbol.asyncIterator]() {
171
- return this;
15
+ _createSocket(url, authHeaders) {
16
+ const ws = new WS.WebSocket(url, {
17
+ ...this._wsOptions,
18
+ headers: {
19
+ ...authHeaders,
20
+ ...this._wsOptions?.headers,
172
21
  },
173
- };
174
- }
175
- authHeaders() {
176
- return { Authorization: `Bearer ${this.client.apiKey}` };
177
- return {};
22
+ });
23
+ return new NodeWebSocket(ws);
178
24
  }
179
25
  }
180
26
  //# sourceMappingURL=ws.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ws.mjs","sourceRoot":"","sources":["../../src/resources/responses/ws.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ws.mjs","sourceRoot":"","sources":["../../src/resources/responses/ws.ts"],"names":[],"mappings":"AAAA,sFAAsF;OAE/E,KAAK,EAAE,MAAM,IAAI;OACjB,EAAE,aAAa,EAAE;OACjB,EAAE,eAAe,EAA+B;AAOvD,MAAM,OAAO,WAAY,SAAQ,eAA8B;IAG7D,YAAY,MAAc,EAAE,OAAqD;QAC/E,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,wGAAwG,CACzG,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,SAAS,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;QAChE,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAES,aAAa,CAAC,GAAQ,EAAE,WAAmC;QACnE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE;YAC/B,GAAG,IAAI,CAAC,UAAU;YAClB,OAAO,EAAE;gBACP,GAAG,WAAW;gBACd,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO;aAC5B;SACF,CAAC,CAAC;QACH,OAAO,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;CACF"}
@@ -96,3 +96,19 @@ export class EventEmitter<EventTypes extends Record<string, (...args: any) => an
96
96
  return listeners && listeners.length > 0;
97
97
  }
98
98
  }
99
+
100
+ /**
101
+ * An EventEmitter variant that exposes `_emit()` publicly.
102
+ *
103
+ * The base {@link EventEmitter} keeps `_emit` protected so that consumers
104
+ * can only listen, not dispatch. When you need a separate emitter instance
105
+ * that your own code can emit on, without exposing emit on the
106
+ * consumer-facing emitter, use this class.
107
+ */
108
+ export class InternalEventEmitter<
109
+ EventTypes extends Record<string, (...args: any) => any>,
110
+ > extends EventEmitter<EventTypes> {
111
+ override _emit<Event extends keyof EventTypes>(event: Event, ...args: EventParameters<EventTypes, Event>) {
112
+ super._emit(event, ...args);
113
+ }
114
+ }
@@ -40,7 +40,6 @@ type OverloadedParameters<T> =
40
40
  : T extends (...args: infer A) => unknown ? A
41
41
  : never;
42
42
 
43
- /* eslint-disable */
44
43
  /**
45
44
  * These imports attempt to get types from a parent package's dependencies.
46
45
  * Unresolved bare specifiers can trigger [automatic type acquisition][1] in some projects, which
@@ -63,19 +62,18 @@ type OverloadedParameters<T> =
63
62
  *
64
63
  * [1]: https://www.typescriptlang.org/tsconfig/#typeAcquisition
65
64
  */
66
- /** @ts-ignore For users with \@types/node */
65
+ /** @ts-ignore For users with \@types/node */ /* prettier-ignore */
67
66
  type UndiciTypesRequestInit = NotAny<import('../node_modules/undici-types/index.d.ts').RequestInit> | NotAny<import('../../node_modules/undici-types/index.d.ts').RequestInit> | NotAny<import('../../../node_modules/undici-types/index.d.ts').RequestInit> | NotAny<import('../../../../node_modules/undici-types/index.d.ts').RequestInit> | NotAny<import('../../../../../node_modules/undici-types/index.d.ts').RequestInit> | NotAny<import('../../../../../../node_modules/undici-types/index.d.ts').RequestInit> | NotAny<import('../../../../../../../node_modules/undici-types/index.d.ts').RequestInit> | NotAny<import('../../../../../../../../node_modules/undici-types/index.d.ts').RequestInit> | NotAny<import('../../../../../../../../../node_modules/undici-types/index.d.ts').RequestInit> | NotAny<import('../../../../../../../../../../node_modules/undici-types/index.d.ts').RequestInit>;
68
- /** @ts-ignore For users with undici */
67
+ /** @ts-ignore For users with undici */ /* prettier-ignore */
69
68
  type UndiciRequestInit = NotAny<import('../node_modules/undici/index.d.ts').RequestInit> | NotAny<import('../../node_modules/undici/index.d.ts').RequestInit> | NotAny<import('../../../node_modules/undici/index.d.ts').RequestInit> | NotAny<import('../../../../node_modules/undici/index.d.ts').RequestInit> | NotAny<import('../../../../../node_modules/undici/index.d.ts').RequestInit> | NotAny<import('../../../../../../node_modules/undici/index.d.ts').RequestInit> | NotAny<import('../../../../../../../node_modules/undici/index.d.ts').RequestInit> | NotAny<import('../../../../../../../../node_modules/undici/index.d.ts').RequestInit> | NotAny<import('../../../../../../../../../node_modules/undici/index.d.ts').RequestInit> | NotAny<import('../../../../../../../../../../node_modules/undici/index.d.ts').RequestInit>;
70
- /** @ts-ignore For users with \@types/bun */
69
+ /** @ts-ignore For users with \@types/bun */ /* prettier-ignore */
71
70
  type BunRequestInit = globalThis.FetchRequestInit;
72
- /** @ts-ignore For users with node-fetch@2 */
71
+ /** @ts-ignore For users with node-fetch@2 */ /* prettier-ignore */
73
72
  type NodeFetch2RequestInit = NotAny<import('../node_modules/@types/node-fetch/index.d.ts').RequestInit> | NotAny<import('../../node_modules/@types/node-fetch/index.d.ts').RequestInit> | NotAny<import('../../../node_modules/@types/node-fetch/index.d.ts').RequestInit> | NotAny<import('../../../../node_modules/@types/node-fetch/index.d.ts').RequestInit> | NotAny<import('../../../../../node_modules/@types/node-fetch/index.d.ts').RequestInit> | NotAny<import('../../../../../../node_modules/@types/node-fetch/index.d.ts').RequestInit> | NotAny<import('../../../../../../../node_modules/@types/node-fetch/index.d.ts').RequestInit> | NotAny<import('../../../../../../../../node_modules/@types/node-fetch/index.d.ts').RequestInit> | NotAny<import('../../../../../../../../../node_modules/@types/node-fetch/index.d.ts').RequestInit> | NotAny<import('../../../../../../../../../../node_modules/@types/node-fetch/index.d.ts').RequestInit>;
74
- /** @ts-ignore For users with node-fetch@3, doesn't need file extension because types are at ./@types/index.d.ts */
73
+ /** @ts-ignore For users with node-fetch@3, doesn't need file extension because types are at ./@types/index.d.ts */ /* prettier-ignore */
75
74
  type NodeFetch3RequestInit = NotAny<import('../node_modules/node-fetch').RequestInit> | NotAny<import('../../node_modules/node-fetch').RequestInit> | NotAny<import('../../../node_modules/node-fetch').RequestInit> | NotAny<import('../../../../node_modules/node-fetch').RequestInit> | NotAny<import('../../../../../node_modules/node-fetch').RequestInit> | NotAny<import('../../../../../../node_modules/node-fetch').RequestInit> | NotAny<import('../../../../../../../node_modules/node-fetch').RequestInit> | NotAny<import('../../../../../../../../node_modules/node-fetch').RequestInit> | NotAny<import('../../../../../../../../../node_modules/node-fetch').RequestInit> | NotAny<import('../../../../../../../../../../node_modules/node-fetch').RequestInit>;
76
- /** @ts-ignore For users who use Deno */
75
+ /** @ts-ignore For users who use Deno */ /* prettier-ignore */
77
76
  type FetchRequestInit = NonNullable<OverloadedParameters<typeof fetch>[1]>;
78
- /* eslint-enable */
79
77
 
80
78
  type RequestInits =
81
79
  | NotAny<UndiciTypesRequestInit>
@@ -9,10 +9,10 @@
9
9
  */
10
10
  export const readEnv = (env: string): string | undefined => {
11
11
  if (typeof (globalThis as any).process !== 'undefined') {
12
- return (globalThis as any).process.env?.[env]?.trim() ?? undefined;
12
+ return (globalThis as any).process.env?.[env]?.trim() || undefined;
13
13
  }
14
14
  if (typeof (globalThis as any).Deno !== 'undefined') {
15
- return (globalThis as any).Deno.env?.get?.(env)?.trim();
15
+ return (globalThis as any).Deno.env?.get?.(env)?.trim() || undefined;
16
16
  }
17
17
  return undefined;
18
18
  };
@@ -0,0 +1,123 @@
1
+ import type { WebSocketLike } from './ws-adapter';
2
+
3
+ /** A generic event listener callback. */
4
+ type Listener = (...args: any[]) => void;
5
+
6
+ /** A DOM-style event handler passed to addEventListener/removeEventListener. */
7
+ type DOMEventHandler = (ev: any) => void;
8
+
9
+ // Minimal browser API type declarations.
10
+ declare class WebSocket {
11
+ readonly readyState: number;
12
+ binaryType: string;
13
+ send(data: string | ArrayBufferLike | ArrayBufferView): void;
14
+ close(code?: number, reason?: string): void;
15
+ addEventListener(type: string, listener: DOMEventHandler): void;
16
+ removeEventListener(type: string, listener: DOMEventHandler): void;
17
+ }
18
+
19
+ interface MessageEvent {
20
+ data: any;
21
+ }
22
+
23
+ interface CloseEvent {
24
+ code: number;
25
+ reason: string;
26
+ }
27
+
28
+ export class BrowserWebSocket implements WebSocketLike {
29
+ private _ws: WebSocket;
30
+ private _listenerMap = new Map<string, Map<Listener, DOMEventHandler>>();
31
+
32
+ constructor(ws: WebSocket) {
33
+ this._ws = ws;
34
+ this._ws.binaryType = 'arraybuffer';
35
+ }
36
+
37
+ /** The underlying platform-specific socket. Code that accesses this will not be isomorphic across server and browser environments. */
38
+ get platformSocket(): WebSocket {
39
+ return this._ws;
40
+ }
41
+
42
+ get readyState(): number {
43
+ return this._ws.readyState;
44
+ }
45
+
46
+ send(data: string | ArrayBufferLike | ArrayBufferView): void {
47
+ this._ws.send(data);
48
+ }
49
+
50
+ close(code?: number, reason?: string): void {
51
+ this._ws.close(code, reason);
52
+ }
53
+
54
+ on(event: string, listener: Listener): void {
55
+ const wrapped = this._wrapListener(event, listener);
56
+ this._listenersFor(event).set(listener, wrapped);
57
+ this._ws.addEventListener(event, wrapped);
58
+ }
59
+
60
+ off(event: string, listener: Listener): void {
61
+ const byListener = this._listenerMap.get(event);
62
+ if (!byListener) return;
63
+ const wrapped = byListener.get(listener);
64
+ if (wrapped) {
65
+ byListener.delete(listener);
66
+ this._ws.removeEventListener(event, wrapped);
67
+ }
68
+ }
69
+
70
+ once(event: string, listener: Listener): void {
71
+ const onceListener: Listener = (...args) => {
72
+ this.off(event, listener);
73
+ listener(...args);
74
+ };
75
+ const wrapped = this._wrapListener(event, onceListener);
76
+ this._listenersFor(event).set(listener, wrapped);
77
+ this._ws.addEventListener(event, wrapped);
78
+ }
79
+
80
+ private _listenersFor(event: string): Map<Listener, DOMEventHandler> {
81
+ let map = this._listenerMap.get(event);
82
+ if (!map) {
83
+ map = new Map();
84
+ this._listenerMap.set(event, map);
85
+ }
86
+ return map;
87
+ }
88
+
89
+ /**
90
+ * Converts browser event objects to positional arguments matching the
91
+ * {@link WebSocketLike} interface.
92
+ */
93
+ private _wrapListener(event: string, listener: Listener): DOMEventHandler {
94
+ switch (event) {
95
+ case 'message':
96
+ return (ev: MessageEvent) => {
97
+ const isBinary = typeof ev.data !== 'string';
98
+ listener(ev.data, isBinary);
99
+ };
100
+
101
+ case 'close':
102
+ return (ev: CloseEvent) => {
103
+ listener(ev.code, ev.reason);
104
+ };
105
+
106
+ case 'error':
107
+ return (ev: any) => {
108
+ // Some environments provide an ErrorEvent with a `.message`;
109
+ // fall back to a generic message when the event carries nothing.
110
+ const message = ev?.message || ev?.error?.message || 'WebSocket error';
111
+ const err = new Error(message);
112
+ if (ev?.error) {
113
+ (err as any).cause = ev.error;
114
+ }
115
+ listener(err);
116
+ };
117
+
118
+ case 'open':
119
+ default:
120
+ return listener as DOMEventHandler;
121
+ }
122
+ }
123
+ }