qca-sdk 0.3.0 → 0.5.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 (122) hide show
  1. package/README.md +275 -1
  2. package/dist/core/auth.d.ts +12 -0
  3. package/dist/core/auth.d.ts.map +1 -0
  4. package/dist/core/auth.js +34 -0
  5. package/dist/core/auth.js.map +1 -0
  6. package/dist/core/client.d.ts +14 -0
  7. package/dist/core/client.d.ts.map +1 -1
  8. package/dist/core/client.js +36 -11
  9. package/dist/core/client.js.map +1 -1
  10. package/dist/core/credentials.d.ts +3 -0
  11. package/dist/core/credentials.d.ts.map +1 -1
  12. package/dist/core/credentials.js +3 -1
  13. package/dist/core/credentials.js.map +1 -1
  14. package/dist/core/service-account-credential.d.ts +20 -0
  15. package/dist/core/service-account-credential.d.ts.map +1 -0
  16. package/dist/core/service-account-credential.js +139 -0
  17. package/dist/core/service-account-credential.js.map +1 -0
  18. package/dist/esm/core/auth.d.ts +12 -0
  19. package/dist/esm/core/auth.d.ts.map +1 -0
  20. package/dist/esm/core/auth.js +30 -0
  21. package/dist/esm/core/auth.js.map +1 -0
  22. package/dist/esm/core/client.d.ts +14 -0
  23. package/dist/esm/core/client.d.ts.map +1 -1
  24. package/dist/esm/core/client.js +36 -11
  25. package/dist/esm/core/client.js.map +1 -1
  26. package/dist/esm/core/credentials.d.ts +3 -0
  27. package/dist/esm/core/credentials.d.ts.map +1 -1
  28. package/dist/esm/core/credentials.js +1 -0
  29. package/dist/esm/core/credentials.js.map +1 -1
  30. package/dist/esm/core/service-account-credential.d.ts +20 -0
  31. package/dist/esm/core/service-account-credential.d.ts.map +1 -0
  32. package/dist/esm/core/service-account-credential.js +135 -0
  33. package/dist/esm/core/service-account-credential.js.map +1 -0
  34. package/dist/esm/forward/forwardClient.d.ts +4 -0
  35. package/dist/esm/forward/forwardClient.d.ts.map +1 -1
  36. package/dist/esm/forward/forwardClient.js +4 -0
  37. package/dist/esm/forward/forwardClient.js.map +1 -1
  38. package/dist/esm/forward/identity-service-account-token.d.ts +11 -0
  39. package/dist/esm/forward/identity-service-account-token.d.ts.map +1 -0
  40. package/dist/esm/forward/identity-service-account-token.js +18 -0
  41. package/dist/esm/forward/identity-service-account-token.js.map +1 -0
  42. package/dist/esm/forward/identity.d.ts +2 -0
  43. package/dist/esm/forward/identity.d.ts.map +1 -1
  44. package/dist/esm/forward/identity.js +2 -0
  45. package/dist/esm/forward/identity.js.map +1 -1
  46. package/dist/esm/forward/index.d.ts +9 -1
  47. package/dist/esm/forward/index.d.ts.map +1 -1
  48. package/dist/esm/forward/index.js +7 -1
  49. package/dist/esm/forward/index.js.map +1 -1
  50. package/dist/esm/forward/realtime/connection.d.ts +106 -0
  51. package/dist/esm/forward/realtime/connection.d.ts.map +1 -0
  52. package/dist/esm/forward/realtime/connection.js +465 -0
  53. package/dist/esm/forward/realtime/connection.js.map +1 -0
  54. package/dist/esm/forward/realtime/conversation.d.ts +31 -0
  55. package/dist/esm/forward/realtime/conversation.d.ts.map +1 -0
  56. package/dist/esm/forward/realtime/conversation.js +92 -0
  57. package/dist/esm/forward/realtime/conversation.js.map +1 -0
  58. package/dist/esm/forward/realtime/realtime.d.ts +9 -0
  59. package/dist/esm/forward/realtime/realtime.d.ts.map +1 -0
  60. package/dist/esm/forward/realtime/realtime.js +9 -0
  61. package/dist/esm/forward/realtime/realtime.js.map +1 -0
  62. package/dist/esm/forward/realtime/types.d.ts +204 -0
  63. package/dist/esm/forward/realtime/types.d.ts.map +1 -0
  64. package/dist/esm/forward/realtime/types.js +7 -0
  65. package/dist/esm/forward/realtime/types.js.map +1 -0
  66. package/dist/esm/forward/service-account-token.d.ts +15 -0
  67. package/dist/esm/forward/service-account-token.d.ts.map +1 -0
  68. package/dist/esm/forward/service-account-token.js +38 -0
  69. package/dist/esm/forward/service-account-token.js.map +1 -0
  70. package/dist/esm/forward/types.d.ts +35 -0
  71. package/dist/esm/forward/types.d.ts.map +1 -1
  72. package/dist/esm/index.d.ts +5 -0
  73. package/dist/esm/index.d.ts.map +1 -1
  74. package/dist/esm/index.js +4 -0
  75. package/dist/esm/index.js.map +1 -1
  76. package/dist/esm/version.d.ts +1 -1
  77. package/dist/esm/version.js +1 -1
  78. package/dist/forward/forwardClient.d.ts +4 -0
  79. package/dist/forward/forwardClient.d.ts.map +1 -1
  80. package/dist/forward/forwardClient.js +4 -0
  81. package/dist/forward/forwardClient.js.map +1 -1
  82. package/dist/forward/identity-service-account-token.d.ts +11 -0
  83. package/dist/forward/identity-service-account-token.d.ts.map +1 -0
  84. package/dist/forward/identity-service-account-token.js +22 -0
  85. package/dist/forward/identity-service-account-token.js.map +1 -0
  86. package/dist/forward/identity.d.ts +2 -0
  87. package/dist/forward/identity.d.ts.map +1 -1
  88. package/dist/forward/identity.js +2 -0
  89. package/dist/forward/identity.js.map +1 -1
  90. package/dist/forward/index.d.ts +9 -1
  91. package/dist/forward/index.d.ts.map +1 -1
  92. package/dist/forward/index.js +18 -1
  93. package/dist/forward/index.js.map +1 -1
  94. package/dist/forward/realtime/connection.d.ts +106 -0
  95. package/dist/forward/realtime/connection.d.ts.map +1 -0
  96. package/dist/forward/realtime/connection.js +473 -0
  97. package/dist/forward/realtime/connection.js.map +1 -0
  98. package/dist/forward/realtime/conversation.d.ts +31 -0
  99. package/dist/forward/realtime/conversation.d.ts.map +1 -0
  100. package/dist/forward/realtime/conversation.js +97 -0
  101. package/dist/forward/realtime/conversation.js.map +1 -0
  102. package/dist/forward/realtime/realtime.d.ts +9 -0
  103. package/dist/forward/realtime/realtime.d.ts.map +1 -0
  104. package/dist/forward/realtime/realtime.js +13 -0
  105. package/dist/forward/realtime/realtime.js.map +1 -0
  106. package/dist/forward/realtime/types.d.ts +204 -0
  107. package/dist/forward/realtime/types.d.ts.map +1 -0
  108. package/dist/forward/realtime/types.js +11 -0
  109. package/dist/forward/realtime/types.js.map +1 -0
  110. package/dist/forward/service-account-token.d.ts +15 -0
  111. package/dist/forward/service-account-token.d.ts.map +1 -0
  112. package/dist/forward/service-account-token.js +43 -0
  113. package/dist/forward/service-account-token.js.map +1 -0
  114. package/dist/forward/types.d.ts +35 -0
  115. package/dist/forward/types.d.ts.map +1 -1
  116. package/dist/index.d.ts +5 -0
  117. package/dist/index.d.ts.map +1 -1
  118. package/dist/index.js +13 -1
  119. package/dist/index.js.map +1 -1
  120. package/dist/version.d.ts +1 -1
  121. package/dist/version.js +1 -1
  122. package/package.json +12 -3
@@ -0,0 +1,465 @@
1
+ import { APIConnectionError, APIConnectionTimeoutError, APIError, APIUserAbortError, QoderError } from '../../core/error.js';
2
+ import { REALTIME_VERSION } from './types.js';
3
+ export class RealtimeProtocolError extends APIConnectionError {
4
+ conversationId;
5
+ code;
6
+ constructor(message, conversationId, code = 'invalid_event') {
7
+ super(message);
8
+ this.conversationId = conversationId;
9
+ this.code = code;
10
+ }
11
+ }
12
+ export class RealtimeConnectionClosedError extends APIConnectionError {
13
+ conversationId;
14
+ closeCode;
15
+ closeReason;
16
+ constructor(conversationId, closeCode, closeReason) {
17
+ super(`Realtime connection closed (${closeCode})`);
18
+ this.conversationId = conversationId;
19
+ this.closeCode = closeCode;
20
+ this.closeReason = closeReason;
21
+ }
22
+ }
23
+ export class RealtimeServerError extends APIConnectionError {
24
+ event;
25
+ code;
26
+ retryable;
27
+ retry_after_ms;
28
+ constructor(event) {
29
+ const payload = event.payload;
30
+ super(typeof payload.message === 'string' ? payload.message : 'Realtime server error');
31
+ this.event = event;
32
+ this.code = String(payload.code);
33
+ this.retryable = typeof payload.retryable === 'boolean' ? payload.retryable : undefined;
34
+ this.retry_after_ms = typeof payload.retry_after_ms === 'number' ? payload.retry_after_ms : undefined;
35
+ }
36
+ }
37
+ const importWS = () => import('ws');
38
+ const CLIENT_MESSAGE_BYTES = 256 * 1024;
39
+ const terminalErrors = new Set(['provider_initialization_failed', 'context_restore_failed', 'provider_unavailable', 'service_restarting', 'event_persistence_failed']);
40
+ const base64 = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;
41
+ function validTimestamp(value) {
42
+ if (typeof value !== 'string' || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?(?:Z|[+-]\d{2}:\d{2})$/.test(value) || !Number.isFinite(Date.parse(value)))
43
+ return false;
44
+ const year = Number(value.slice(0, 4)), month = Number(value.slice(5, 7)), day = Number(value.slice(8, 10));
45
+ const leap = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
46
+ return day > 0 && day <= [31, leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month - 1];
47
+ }
48
+ const isObject = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
49
+ function positive(value, fallback, name) {
50
+ const result = value ?? fallback;
51
+ if (!Number.isSafeInteger(result) || result <= 0 || result > 2 ** 31 - 1)
52
+ throw new QoderError(`${name} must be a positive integer within the timer/size limit`);
53
+ return result;
54
+ }
55
+ function wait(value, timeout, signal, label) {
56
+ return new Promise((resolve, reject) => {
57
+ const abort = () => finish(new APIUserAbortError(`${label} was aborted`));
58
+ const timer = setTimeout(() => finish(new APIConnectionTimeoutError(`${label} timed out`)), timeout);
59
+ let settled = false;
60
+ function finish(error, result) {
61
+ if (settled)
62
+ return;
63
+ settled = true;
64
+ clearTimeout(timer);
65
+ signal?.removeEventListener('abort', abort);
66
+ if (error)
67
+ reject(error);
68
+ else
69
+ resolve(result);
70
+ }
71
+ if (signal?.aborted)
72
+ abort();
73
+ else
74
+ signal?.addEventListener('abort', abort, { once: true });
75
+ value.then(result => finish(undefined, result), error => finish(error instanceof Error ? error : new APIConnectionError(label)));
76
+ });
77
+ }
78
+ function validateEvent(value, conversationId) {
79
+ const invalid = () => new RealtimeProtocolError('Invalid Realtime event envelope or payload', conversationId);
80
+ if (!isObject(value) || value.version !== REALTIME_VERSION || typeof value.type !== 'string' || !value.type
81
+ || !isObject(value.payload) || typeof value.event_id !== 'string' || !value.event_id
82
+ || !Number.isSafeInteger(value.sequence) || value.sequence < 0 || value.conversation_id !== conversationId
83
+ || !validTimestamp(value.timestamp)
84
+ || (value.work_id !== undefined && typeof value.work_id !== 'string')
85
+ || (value.announcement_id !== undefined && typeof value.announcement_id !== 'string'))
86
+ throw invalid();
87
+ const p = value.payload;
88
+ const required = {
89
+ 'voice.state': ['state'], 'voice.replaced': ['reason'], 'transcript.delta': ['role', 'text'], 'transcript.final': ['role', 'text'],
90
+ 'audio.delta': ['audio'], 'playback.interrupt': ['reason'], 'work.accepted': ['status', 'objective'], 'work.running': ['status'],
91
+ 'work.progress': ['kind', 'detail'], 'work.milestone': ['announcement_id', 'milestone_type', 'summary'],
92
+ 'work.completed': ['status', 'result'], 'work.failed': ['status'], 'connection.closed': ['request_id', 'outcome'], error: ['code', 'message'],
93
+ };
94
+ if ((required[value.type] ?? []).some(key => typeof p[key] !== 'string'))
95
+ throw invalid();
96
+ const optionalStrings = {
97
+ 'transcript.delta': ['item_id', 'response_id'], 'transcript.final': ['item_id', 'response_id'],
98
+ 'work.progress': ['title', 'event_id'], 'work.completed': ['event_id'], 'work.failed': ['event_id'],
99
+ };
100
+ if ((optionalStrings[value.type] ?? []).some(key => p[key] !== undefined && typeof p[key] !== 'string'))
101
+ throw invalid();
102
+ if (value.type === 'work.progress' && p.is_error !== undefined && typeof p.is_error !== 'boolean')
103
+ throw invalid();
104
+ if (value.type === 'error' && ((p.retryable !== undefined && typeof p.retryable !== 'boolean') || (p.retry_after_ms !== undefined && (!Number.isSafeInteger(p.retry_after_ms) || p.retry_after_ms < 0))))
105
+ throw invalid();
106
+ const statuses = { 'work.accepted': 'accepted', 'work.running': 'running', 'work.completed': 'completed', 'work.failed': 'failed' };
107
+ if (statuses[value.type] && p.status !== statuses[value.type])
108
+ throw invalid();
109
+ if (value.type === 'audio.delta' && (typeof p.audio !== 'string' || !p.audio || !base64.test(p.audio) || globalThis.atob(p.audio).length % 2))
110
+ throw invalid();
111
+ if (value.type === 'voice.ready') {
112
+ if (!isObject(p.config) || typeof p.provider !== 'string' || !isObject(p.input_audio) || !isObject(p.output_audio)
113
+ || p.input_audio.format !== 'pcm16' || p.input_audio.sample_rate !== 16000 || p.input_audio.channels !== 1
114
+ || p.output_audio.format !== 'pcm16' || p.output_audio.sample_rate !== 24000 || p.output_audio.channels !== 1
115
+ || !isObject(p.capabilities) || typeof p.capabilities.graceful_close !== 'boolean')
116
+ throw invalid();
117
+ }
118
+ if (value.type === 'work.failed' && (!isObject(p.error) || typeof p.error.code !== 'string'))
119
+ throw invalid();
120
+ if (value.type === 'connection.closed' && !['no_active_response', 'no_content', 'saved', 'saved_interrupted'].includes(p.outcome))
121
+ throw invalid();
122
+ return value;
123
+ }
124
+ /** Decode an audio.delta payload into raw 24 kHz PCM16 bytes; this does not play it. */
125
+ export function decodeRealtimeAudio(event) {
126
+ if (event.type !== 'audio.delta' || typeof event.payload.audio !== 'string' || !event.payload.audio || !base64.test(event.payload.audio))
127
+ throw new QoderError('Expected a valid audio.delta Base64 payload');
128
+ const binary = globalThis.atob(event.payload.audio);
129
+ if (binary.length % 2)
130
+ throw new QoderError('PCM16 output must contain complete samples');
131
+ return Uint8Array.from(binary, char => char.charCodeAt(0));
132
+ }
133
+ /** A Node-only connection with one receiver and bounded input/output queues. No reconnect or replay. */
134
+ export class RealtimeConnection {
135
+ socket;
136
+ options;
137
+ conversationId;
138
+ ready;
139
+ request_id = null;
140
+ queue = [];
141
+ queueBytes = 0;
142
+ lastSequence = -1;
143
+ maxQueuedEvents;
144
+ maxQueueBytes;
145
+ sendTimeout;
146
+ closeTimeout;
147
+ readyPromise;
148
+ readyResolve;
149
+ readyReject;
150
+ receiver;
151
+ terminal;
152
+ ended = false;
153
+ closing = false;
154
+ sendTail = Promise.resolve();
155
+ sendCount = 0;
156
+ sendBytes = 0;
157
+ graceful;
158
+ closeAck;
159
+ handshakeTimer;
160
+ readyTimer;
161
+ abort;
162
+ constructor(socket, options) {
163
+ this.socket = socket;
164
+ this.options = options;
165
+ this.conversationId = options.conversationId;
166
+ this.maxQueuedEvents = positive(options.maxQueuedEvents, 256, 'maxQueuedEvents');
167
+ this.maxQueueBytes = positive(options.maxQueueBytes, 4 * 1024 * 1024, 'maxQueueBytes');
168
+ this.sendTimeout = positive(options.sendTimeout, 30000, 'sendTimeout');
169
+ this.closeTimeout = positive(options.closeTimeout, 10000, 'closeTimeout');
170
+ this.readyPromise = new Promise((resolve, reject) => { this.readyResolve = resolve; this.readyReject = reject; });
171
+ void this.readyPromise.catch(() => { });
172
+ this.abort = () => this.fail(new APIUserAbortError('Realtime connection was aborted'));
173
+ options.signal?.addEventListener('abort', this.abort, { once: true });
174
+ socket.on('upgrade', response => { this.request_id = String(response.headers['x-request-id'] ?? response.headers['request-id'] ?? '') || null; });
175
+ socket.on('open', () => {
176
+ clearTimeout(this.handshakeTimer);
177
+ this.readyTimer = setTimeout(() => this.fail(new APIConnectionTimeoutError('Realtime ready timed out')), positive(options.readyTimeout, 60000, 'readyTimeout'));
178
+ });
179
+ socket.on('message', (data, binary) => this.onMessage(data, binary));
180
+ socket.on('error', error => this.fail(error.message === 'Opening handshake has timed out'
181
+ ? new APIConnectionTimeoutError('Realtime handshake timed out') : new APIConnectionError('Realtime WebSocket transport failed')));
182
+ socket.on('close', (code, reason) => this.finish(code === 1000 || code === 1001 ? undefined : new RealtimeConnectionClosedError(this.conversationId, code, reason.toString())));
183
+ socket.on('unexpected-response', (_request, response) => {
184
+ let raw = '';
185
+ let bytes = 0;
186
+ response.on('data', chunk => {
187
+ bytes += chunk.length;
188
+ if (bytes > 64 * 1024) {
189
+ response.destroy();
190
+ this.fail(new APIConnectionError('Realtime handshake error body exceeded its limit'));
191
+ }
192
+ else
193
+ raw += chunk.toString();
194
+ });
195
+ response.on('error', () => this.fail(new APIConnectionError('Realtime handshake response failed')));
196
+ response.on('end', () => {
197
+ let body = raw;
198
+ try {
199
+ body = JSON.parse(raw);
200
+ }
201
+ catch { /* Retain bounded gateway text. */ }
202
+ const headers = new Headers();
203
+ for (const [key, value] of Object.entries(response.headers))
204
+ if (value !== undefined)
205
+ headers.set(key, Array.isArray(value) ? value.join(', ') : value);
206
+ this.fail(APIError.generate(response.statusCode ?? 502, body, undefined, headers));
207
+ });
208
+ });
209
+ this.handshakeTimer = setTimeout(() => this.fail(new APIConnectionTimeoutError('Realtime handshake timed out')), positive(options.handshakeTimeout, 30000, 'handshakeTimeout'));
210
+ if (options.signal?.aborted)
211
+ this.abort();
212
+ }
213
+ /** @internal */
214
+ static async connect(client, options) {
215
+ if (typeof process === 'undefined' || !process.versions?.node)
216
+ throw new QoderError('Forward Realtime requires Node.js; browsers cannot provide Authorization headers');
217
+ if (typeof options.conversationId !== 'string' || !options.conversationId || options.conversationId.trim() !== options.conversationId || /[\x00-\x1f\x7f]/.test(options.conversationId))
218
+ throw new QoderError('conversationId must be nonempty without surrounding whitespace or control characters');
219
+ for (const [key, fallback] of Object.entries({ handshakeTimeout: 30000, readyTimeout: 60000, sendTimeout: 30000, closeTimeout: 10000, maxQueuedEvents: 256, maxQueueBytes: 4 * 1024 * 1024, maxReceiveBytes: 1024 * 1024 }))
220
+ positive(options[key], fallback, key);
221
+ const handshakeDeadline = Date.now() + (options.handshakeTimeout ?? 30000);
222
+ const preparationController = new AbortController();
223
+ const cancelPreparation = () => preparationController.abort();
224
+ options.signal?.addEventListener('abort', cancelPreparation, { once: true });
225
+ let preparation;
226
+ try {
227
+ preparation = await wait(Promise.all([client._prepareRealtimeRequest({ ...options, signal: preparationController.signal }), importWS()]), options.handshakeTimeout ?? 30000, options.signal, 'Realtime authentication');
228
+ }
229
+ finally {
230
+ options.signal?.removeEventListener('abort', cancelPreparation);
231
+ preparationController.abort();
232
+ }
233
+ if (options.signal?.aborted)
234
+ throw new APIUserAbortError('Realtime connection was aborted');
235
+ const [{ url, headers }, module] = preparation;
236
+ const handshakeRemaining = handshakeDeadline - Date.now();
237
+ if (handshakeRemaining <= 0)
238
+ throw new APIConnectionTimeoutError('Realtime handshake timed out');
239
+ const Socket = module.default;
240
+ const transport = options.transport ?? {};
241
+ const socket = new Socket(url, {
242
+ ...transport,
243
+ headers: Object.fromEntries(headers.entries()),
244
+ followRedirects: false,
245
+ perMessageDeflate: false,
246
+ handshakeTimeout: handshakeRemaining,
247
+ maxPayload: options.maxReceiveBytes ?? 1024 * 1024,
248
+ });
249
+ const connection = new RealtimeConnection(socket, { ...options, handshakeTimeout: handshakeRemaining });
250
+ await connection.readyPromise;
251
+ return connection;
252
+ }
253
+ onMessage(data, binary) {
254
+ if (this.ended)
255
+ return;
256
+ try {
257
+ if (binary)
258
+ throw new RealtimeProtocolError('Realtime expects UTF-8 JSON text frames', this.conversationId);
259
+ const buffer = Array.isArray(data) ? Buffer.concat(data) : data instanceof ArrayBuffer ? Buffer.from(data) : data;
260
+ let value;
261
+ try {
262
+ value = JSON.parse(buffer.toString());
263
+ }
264
+ catch {
265
+ throw new RealtimeProtocolError('Invalid Realtime JSON', this.conversationId);
266
+ }
267
+ const event = validateEvent(value, this.conversationId);
268
+ if (event.sequence <= this.lastSequence)
269
+ throw new RealtimeProtocolError('Realtime sequence did not increase', this.conversationId);
270
+ this.lastSequence = event.sequence;
271
+ const size = buffer.byteLength;
272
+ if (this.receiver) {
273
+ const receiver = this.receiver;
274
+ this.receiver = undefined;
275
+ receiver.resolve({ done: false, value: event });
276
+ }
277
+ else {
278
+ if (this.queue.length >= this.maxQueuedEvents || this.queueBytes + size > this.maxQueueBytes)
279
+ throw new RealtimeProtocolError('Realtime receive queue capacity exceeded', this.conversationId, 'queue_overflow');
280
+ this.queue.push({ event, bytes: size });
281
+ this.queueBytes += size;
282
+ }
283
+ if (event.type === 'voice.ready' && !this.ready) {
284
+ this.ready = event.payload;
285
+ clearTimeout(this.readyTimer);
286
+ this.readyResolve();
287
+ }
288
+ if (event.type === 'connection.closed' && event.payload.request_id === this.closeAck?.requestId)
289
+ this.closeAck?.resolve(event.payload);
290
+ if (event.type === 'voice.replaced')
291
+ this.fail(new RealtimeProtocolError('Realtime connection was replaced', this.conversationId, 'voice.replaced'));
292
+ if (event.type === 'error' && (!this.ready || terminalErrors.has(String(event.payload.code))))
293
+ this.fail(new RealtimeServerError(event));
294
+ }
295
+ catch (error) {
296
+ this.fail(error instanceof Error ? error : new APIConnectionError('Realtime receive failed'));
297
+ }
298
+ }
299
+ finish(error) {
300
+ if (this.ended)
301
+ return;
302
+ this.ended = true;
303
+ this.terminal = error;
304
+ clearTimeout(this.handshakeTimer);
305
+ clearTimeout(this.readyTimer);
306
+ this.options.signal?.removeEventListener('abort', this.abort);
307
+ this.readyReject(error ?? new RealtimeConnectionClosedError(this.conversationId, 1000, 'Closed before ready'));
308
+ this.closeAck?.reject(error ?? new RealtimeConnectionClosedError(this.conversationId, 1000, 'Closed without matching acknowledgement'));
309
+ if (this.receiver) {
310
+ const receiver = this.receiver;
311
+ this.receiver = undefined;
312
+ if (error)
313
+ receiver.reject(error);
314
+ else
315
+ receiver.resolve({ done: true, value: undefined });
316
+ }
317
+ }
318
+ fail(error) { this.finish(error); this.socket.terminate(); }
319
+ /** Read one event. Concurrent consumers are rejected instead of stealing each other's events. */
320
+ async receive(options = {}) {
321
+ if (this.receiver)
322
+ throw new QoderError('Only one Realtime event consumer is allowed');
323
+ if (options.signal?.aborted)
324
+ throw new APIUserAbortError('Realtime receive was aborted');
325
+ const queued = this.queue.shift();
326
+ if (queued) {
327
+ this.queueBytes -= queued.bytes;
328
+ return { done: false, value: queued.event };
329
+ }
330
+ if (this.ended) {
331
+ if (this.terminal)
332
+ throw this.terminal;
333
+ return { done: true, value: undefined };
334
+ }
335
+ let receiver;
336
+ const pending = new Promise((resolve, reject) => { this.receiver = receiver = { resolve, reject }; });
337
+ try {
338
+ return await wait(pending, positive(options.timeout, 2 ** 31 - 1, 'receive timeout'), options.signal, 'Realtime receive');
339
+ }
340
+ finally {
341
+ if (this.receiver === receiver)
342
+ this.receiver = undefined;
343
+ }
344
+ }
345
+ async *[Symbol.asyncIterator]() {
346
+ for (;;) {
347
+ const next = await this.receive();
348
+ if (next.done)
349
+ return;
350
+ yield next.value;
351
+ }
352
+ }
353
+ /** Serialize sends in call order; no input is automatically replayed. */
354
+ sendEvent(event, options = {}) {
355
+ const timeout = positive(options.timeout, this.sendTimeout, 'send timeout');
356
+ if (options.signal?.aborted)
357
+ return Promise.reject(new APIUserAbortError('Realtime send was aborted'));
358
+ if (!event || event.version !== REALTIME_VERSION || typeof event.type !== 'string' || !event.type || !isObject(event.payload))
359
+ throw new QoderError('Client events require version, type and object payload');
360
+ if (this.ended || this.socket.readyState !== 1)
361
+ throw this.terminal ?? new QoderError('Realtime connection is closed');
362
+ if (this.closing && !['connection.close', 'ping'].includes(event.type))
363
+ throw new QoderError('Realtime connection is closing');
364
+ if (event.type === 'text.message' && (typeof event.payload.text !== 'string' || !event.payload.text.trim() || new TextEncoder().encode(event.payload.text.trim()).length > 16 * 1024))
365
+ throw new QoderError('Realtime text must be nonempty and at most 16 KiB UTF-8');
366
+ if (event.type === 'audio.append' && (typeof event.payload.audio !== 'string' || !event.payload.audio || !base64.test(event.payload.audio) || globalThis.atob(event.payload.audio).length % 2))
367
+ throw new QoderError('Audio append requires nonempty Base64 PCM16');
368
+ if (event.type === 'connection.close') {
369
+ const id = event.payload.request_id;
370
+ if (typeof id !== 'string' || !id || id.trim() !== id || Buffer.byteLength(id) > 128 || /[\x00-\x1f\x7f]/.test(id))
371
+ throw new QoderError('Invalid connection.close request_id');
372
+ }
373
+ const json = JSON.stringify(event);
374
+ const bytes = Buffer.byteLength(json);
375
+ if (bytes > CLIENT_MESSAGE_BYTES)
376
+ throw new QoderError('Realtime client JSON message exceeds 256 KiB');
377
+ if (this.sendCount >= this.maxQueuedEvents || this.sendBytes + bytes > this.maxQueueBytes)
378
+ throw new QoderError('Realtime send queue capacity exceeded');
379
+ this.sendCount++;
380
+ this.sendBytes += bytes;
381
+ const result = this.sendTail.then(async () => {
382
+ if (this.ended)
383
+ throw this.terminal ?? new QoderError('Realtime connection is closed');
384
+ if (options.signal?.aborted)
385
+ throw new APIUserAbortError('Realtime send was aborted');
386
+ const written = new Promise((resolve, reject) => this.socket.send(json, { binary: false }, error => error ? reject(new APIConnectionError('Realtime send failed')) : resolve()));
387
+ try {
388
+ await wait(written, timeout, options.signal, 'Realtime send');
389
+ }
390
+ catch (error) {
391
+ this.fail(error);
392
+ throw error;
393
+ }
394
+ }).finally(() => { this.sendCount--; this.sendBytes -= bytes; });
395
+ this.sendTail = result.catch(() => { });
396
+ const deadline = wait(result, timeout, options.signal, 'Realtime send');
397
+ return deadline.catch(error => { this.fail(error); throw error; });
398
+ }
399
+ sendText(text, options) {
400
+ if (typeof text !== 'string' || !text.trim() || new TextEncoder().encode(text.trim()).length > 16 * 1024)
401
+ throw new QoderError('Realtime text must be nonempty and at most 16 KiB UTF-8');
402
+ return this.sendEvent({ version: REALTIME_VERSION, type: 'text.message', payload: { text: text.trim() } }, options);
403
+ }
404
+ appendAudio(pcm, options) {
405
+ if (!(pcm instanceof Uint8Array) || !pcm.byteLength || pcm.byteLength % 2)
406
+ throw new QoderError('Audio must contain nonempty, complete PCM16 samples');
407
+ if (pcm.byteLength > CLIENT_MESSAGE_BYTES * 3 / 4)
408
+ throw new QoderError('Realtime client JSON message exceeds 256 KiB');
409
+ return this.sendEvent({ version: REALTIME_VERSION, type: 'audio.append', payload: { audio: Buffer.from(pcm.buffer, pcm.byteOffset, pcm.byteLength).toString('base64') } }, options);
410
+ }
411
+ interrupt(options) { return this.sendEvent({ version: REALTIME_VERSION, type: 'interrupt', payload: {} }, options); }
412
+ ping(options) { return this.sendEvent({ version: REALTIME_VERSION, type: 'ping', payload: {} }, options); }
413
+ playbackStarted(receipt = {}, options) { return this.playback('playback.started', receipt, options); }
414
+ playbackEnded(receipt = {}, options) { return this.playback('playback.ended', receipt, options); }
415
+ playbackCancelled(receipt = {}, options) { return this.playback('playback.cancelled', receipt, options); }
416
+ playback(type, receipt, options) {
417
+ for (const value of Object.values(receipt))
418
+ if (typeof value !== 'string' || !value)
419
+ throw new QoderError('Playback identifiers must be nonempty strings');
420
+ return this.sendEvent({ version: REALTIME_VERSION, type, payload: { ...receipt } }, options);
421
+ }
422
+ /** Send connection.close, require its matching persistence acknowledgement, then release transport. */
423
+ closeGracefully(options = {}) {
424
+ if (this.graceful)
425
+ return this.graceful;
426
+ if (this.ended)
427
+ return Promise.reject(this.terminal ?? new QoderError('Realtime connection is closed'));
428
+ if (!this.ready.capabilities.graceful_close)
429
+ return Promise.reject(new QoderError('Server does not support graceful close'));
430
+ const requestId = options.requestId ?? globalThis.crypto.randomUUID();
431
+ if (!requestId || requestId.trim() !== requestId || Buffer.byteLength(requestId) > 128 || /[\x00-\x1f\x7f]/.test(requestId))
432
+ throw new QoderError('Close requestId must be 1–128 UTF-8 bytes without surrounding whitespace or control characters');
433
+ const timeout = positive(options.timeout, this.closeTimeout, 'close timeout');
434
+ if (options.signal?.aborted)
435
+ return Promise.reject(new APIUserAbortError('Realtime graceful close was aborted'));
436
+ this.closing = true;
437
+ const acknowledgement = new Promise((resolve, reject) => { this.closeAck = { requestId, resolve, reject }; });
438
+ void acknowledgement.catch(() => { });
439
+ this.graceful = (async () => {
440
+ try {
441
+ const confirmed = wait(acknowledgement, timeout, options.signal, 'Realtime graceful close');
442
+ void confirmed.catch(() => { });
443
+ await this.sendEvent({ version: REALTIME_VERSION, type: 'connection.close', payload: { request_id: requestId } }, options);
444
+ return await confirmed;
445
+ }
446
+ finally {
447
+ this.close();
448
+ }
449
+ })();
450
+ return this.graceful;
451
+ }
452
+ /** Transport close does not promise history persistence or cancel background Work. */
453
+ close() {
454
+ this.finish();
455
+ if (this.socket.readyState === 1) {
456
+ this.socket.close(1000);
457
+ const timer = setTimeout(() => this.socket.terminate(), 1000);
458
+ timer.unref();
459
+ this.socket.once('close', () => clearTimeout(timer));
460
+ }
461
+ else
462
+ this.socket.terminate();
463
+ }
464
+ }
465
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../../src/forward/realtime/connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { APIResource } from '../../core/resource.js';
2
+ import { APIPromise } from '../../core/api-promise.js';
3
+ import type { APIClient, RequestOptions } from '../../core/client.js';
4
+ import type { RealtimeConversation, RealtimeConversationCreateParams, RealtimeHistoryEvent, RealtimeHistoryParams, RealtimeHistoryResponse } from './types.js';
5
+ /** History uses before cursors and events, independently of ordinary list pages. */
6
+ export declare class RealtimeHistoryPage implements RealtimeHistoryResponse, AsyncIterable<RealtimeHistoryEvent> {
7
+ private readonly client;
8
+ private readonly conversationID;
9
+ private readonly params;
10
+ private readonly options;
11
+ private readonly data;
12
+ readonly response: Response;
13
+ readonly conversation: RealtimeHistoryResponse['conversation'];
14
+ readonly events: RealtimeHistoryEvent[];
15
+ readonly page: RealtimeHistoryResponse['page'];
16
+ readonly _request_id: string | null;
17
+ [key: string]: unknown;
18
+ constructor(client: APIClient, conversationID: string, params: RealtimeHistoryParams, options: RequestOptions, data: RealtimeHistoryResponse, response: Response);
19
+ hasNextPage(): boolean;
20
+ getNextPage(): APIPromise<RealtimeHistoryPage>;
21
+ iterPages(): AsyncGenerator<RealtimeHistoryPage>;
22
+ [Symbol.asyncIterator](): AsyncGenerator<RealtimeHistoryEvent>;
23
+ toJSON(): RealtimeHistoryResponse;
24
+ }
25
+ export declare class RealtimeConversations extends APIResource {
26
+ /** Create a Beta Realtime Conversation; use a stable key for this operation. */
27
+ create(params: RealtimeConversationCreateParams, options?: RequestOptions): APIPromise<RealtimeConversation>;
28
+ /** Query persisted history, newest first; next_before retrieves older records. */
29
+ history(conversationID: string, params?: RealtimeHistoryParams, options?: RequestOptions): APIPromise<RealtimeHistoryPage>;
30
+ }
31
+ //# sourceMappingURL=conversation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../../../src/forward/realtime/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtE,OAAO,KAAK,EAAE,oBAAoB,EAAE,gCAAgC,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE/J,oFAAoF;AACpF,qBAAa,mBAAoB,YAAW,uBAAuB,EAAE,aAAa,CAAC,oBAAoB,CAAC;IAM1F,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAa,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC7E,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAyB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxE,OAAO,CAAC,QAAQ,CAAC,IAAI;IAA2B,QAAQ,CAAC,QAAQ,EAAE,QAAQ;IAP7E,QAAQ,CAAC,YAAY,EAAE,uBAAuB,CAAC,cAAc,CAAC,CAAC;IAC/D,QAAQ,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;gBACM,MAAM,EAAE,SAAS,EAAmB,cAAc,EAAE,MAAM,EACpE,MAAM,EAAE,qBAAqB,EAAmB,OAAO,EAAE,cAAc,EACvE,IAAI,EAAE,uBAAuB,EAAW,QAAQ,EAAE,QAAQ;IAO7E,WAAW,IAAI,OAAO;IACtB,WAAW,IAAI,UAAU,CAAC,mBAAmB,CAAC;IAKvC,SAAS,IAAI,cAAc,CAAC,mBAAmB,CAAC;IAahD,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,oBAAoB,CAAC;IAGrE,MAAM,IAAI,uBAAuB;CAClC;AAED,qBAAa,qBAAsB,SAAQ,WAAW;IACpD,gFAAgF;IAChF,MAAM,CAAC,MAAM,EAAE,gCAAgC,EAAE,OAAO,GAAE,cAAmB,GAAG,UAAU,CAAC,oBAAoB,CAAC;IAShH,kFAAkF;IAClF,OAAO,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,GAAE,qBAA0B,EAAE,OAAO,GAAE,cAAmB,GAAG,UAAU,CAAC,mBAAmB,CAAC;CAanI"}
@@ -0,0 +1,92 @@
1
+ import { APIResource } from '../../core/resource.js';
2
+ import { APIPromise } from '../../core/api-promise.js';
3
+ import { QoderError } from '../../core/error.js';
4
+ import { pathParam, requestHeaders } from '../_utils.js';
5
+ /** History uses before cursors and events, independently of ordinary list pages. */
6
+ export class RealtimeHistoryPage {
7
+ client;
8
+ conversationID;
9
+ params;
10
+ options;
11
+ data;
12
+ response;
13
+ conversation;
14
+ events;
15
+ page;
16
+ _request_id;
17
+ constructor(client, conversationID, params, options, data, response) {
18
+ this.client = client;
19
+ this.conversationID = conversationID;
20
+ this.params = params;
21
+ this.options = options;
22
+ this.data = data;
23
+ this.response = response;
24
+ for (const [key, value] of Object.entries(data))
25
+ if (!(key in this))
26
+ Object.defineProperty(this, key, { value, enumerable: true });
27
+ this.conversation = data.conversation;
28
+ this.events = data.events;
29
+ this.page = data.page;
30
+ this._request_id = response.headers.get('x-request-id') ?? response.headers.get('request-id');
31
+ }
32
+ hasNextPage() { return this.page.has_more && !!this.page.next_before; }
33
+ getNextPage() {
34
+ if (!this.hasNextPage())
35
+ throw new QoderError('No next history page; check hasNextPage() first');
36
+ if (this.page.next_before === this.params.before)
37
+ throw new QoderError('History cursor did not advance');
38
+ return new RealtimeConversations(this.client).history(this.conversationID, { ...this.params, before: this.page.next_before }, this.options);
39
+ }
40
+ async *iterPages() {
41
+ let current = this;
42
+ const seen = new Set();
43
+ if (this.params.before)
44
+ seen.add(this.params.before);
45
+ for (;;) {
46
+ yield current;
47
+ if (!current.hasNextPage())
48
+ return;
49
+ const cursor = current.page.next_before;
50
+ if (seen.has(cursor))
51
+ throw new QoderError('History cursor did not advance');
52
+ seen.add(cursor);
53
+ current = await current.getNextPage();
54
+ }
55
+ }
56
+ async *[Symbol.asyncIterator]() {
57
+ for await (const page of this.iterPages())
58
+ yield* page.events;
59
+ }
60
+ toJSON() { return this.data; }
61
+ }
62
+ export class RealtimeConversations extends APIResource {
63
+ /** Create a Beta Realtime Conversation; use a stable key for this operation. */
64
+ create(params, options = {}) {
65
+ const { idempotency_key, ...body } = params;
66
+ const headers = requestHeaders({ 'Idempotency-Key': idempotency_key }, options.headers);
67
+ const key = options.idempotencyKey ?? headers['idempotency-key'];
68
+ if (typeof key !== 'string' || !key || key.trim() !== key || new TextEncoder().encode(key).length > 256 || /[\x00-\x1f\x7f]/.test(key)) {
69
+ throw new QoderError('Idempotency-Key must be 1–256 UTF-8 bytes without surrounding whitespace or control characters');
70
+ }
71
+ return this._client.request({ method: 'POST', path: 'realtime/conversations', body, ...options, headers });
72
+ }
73
+ /** Query persisted history, newest first; next_before retrieves older records. */
74
+ history(conversationID, params = {}, options = {}) {
75
+ const query = { ...params, ...options.query };
76
+ if (query.limit !== undefined && (!Number.isInteger(query.limit) || query.limit < 1 || query.limit > 100))
77
+ throw new QoderError('History limit must be an integer from 1 to 100');
78
+ if (query.before !== undefined && (typeof query.before !== 'string' || !query.before))
79
+ throw new QoderError('History before must be nonempty');
80
+ if (query.types !== undefined && !['message', 'work', 'message,work'].includes(query.types))
81
+ throw new QoderError('History types must be message, work, or message,work');
82
+ const request = this._client.request({ method: 'GET', path: `realtime/conversations/${pathParam(conversationID, 'conversation_id')}/history`, ...options, query });
83
+ return new APIPromise(request.asResponse(), async (response) => {
84
+ const data = (await request.withResponse()).data;
85
+ if (!data || !Array.isArray(data.events) || !data.conversation || !data.page || typeof data.page.has_more !== 'boolean'
86
+ || !(data.page.next_before === null || typeof data.page.next_before === 'string') || (data.page.has_more && !data.page.next_before))
87
+ throw new QoderError('Invalid Realtime history response');
88
+ return new RealtimeHistoryPage(this._client, conversationID, query, { ...options, query: undefined }, data, response);
89
+ });
90
+ }
91
+ }
92
+ //# sourceMappingURL=conversation.js.map