@signalwire/js 4.0.0-beta.1 → 4.0.0-beta.11

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.
@@ -1,4 +1,4 @@
1
- const require_operators = require('../operators-DT4UB24-.cjs');
1
+ const require_operators = require('../operators-BT3jl--r.cjs');
2
2
 
3
3
  exports.filterAs = require_operators.filterAs;
4
4
  exports.filterNull = require_operators.filterNull;
@@ -1,4 +1,4 @@
1
- import { r as JSONRPCResponse } from "../base-A5AZTrAd.cjs";
1
+ import { i as JSONRPCResponse } from "../base-Cif20s3C.cjs";
2
2
  import { OperatorFunction } from "rxjs";
3
3
 
4
4
  //#region src/operators/filterNull.d.ts
@@ -1,4 +1,4 @@
1
- import { r as JSONRPCResponse } from "../base-aVtoG8Wk.mjs";
1
+ import { i as JSONRPCResponse } from "../base-CQPEW1lJ.mjs";
2
2
  import { OperatorFunction } from "rxjs";
3
3
 
4
4
  //#region src/operators/filterNull.d.ts
@@ -1,3 +1,3 @@
1
- import { a as filterNull, n as filterAs, r as ifIsMap, t as throwOnRPCError } from "../operators-BHQMSEzq.mjs";
1
+ import { a as filterNull, n as filterAs, r as ifIsMap, t as throwOnRPCError } from "../operators-B1xH6k06.mjs";
2
2
 
3
3
  export { filterAs, filterNull, ifIsMap, throwOnRPCError };
@@ -119,21 +119,23 @@ var DependencyError = class extends Error {
119
119
  }
120
120
  };
121
121
  var CallCreateError = class extends Error {
122
- constructor(message, error = null, options) {
122
+ constructor(message, error = null, direction = "outbound", options) {
123
123
  super(message, {
124
124
  ...options,
125
125
  cause: options?.cause ?? (error instanceof Error ? error : void 0)
126
126
  });
127
127
  this.message = message;
128
128
  this.error = error;
129
+ this.direction = direction;
129
130
  this.name = "CallCreateError";
130
131
  }
131
132
  };
132
133
  var JSONRPCError = class extends Error {
133
- constructor(code, message, data, options) {
134
+ constructor(code, message, data, options, requestId) {
134
135
  super(message, options);
135
136
  this.code = code;
136
137
  this.data = data;
138
+ this.requestId = requestId;
137
139
  this.name = "JSONRPCError";
138
140
  }
139
141
  };
@@ -161,6 +163,16 @@ var VertoInviteHandlerError = class extends Error {
161
163
  this.name = "VertoInviteHandlerError";
162
164
  }
163
165
  };
166
+ var VertoAttachHandlerError = class extends Error {
167
+ constructor(error = null, options) {
168
+ super("Error handling Verto attach", {
169
+ ...options,
170
+ cause: options?.cause ?? (error instanceof Error ? error : void 0)
171
+ });
172
+ this.error = error;
173
+ this.name = "VertoAttachHandlerError";
174
+ }
175
+ };
164
176
  var ValidationError = class extends Error {
165
177
  constructor(message, options) {
166
178
  super(message, options);
@@ -198,6 +210,64 @@ var MediaTrackError = class extends Error {
198
210
  this.name = "MediaTrackError";
199
211
  }
200
212
  };
213
+ var DPoPInitError = class extends Error {
214
+ constructor(originalError, message = "Failed to initialize DPoP key pair") {
215
+ super(message, { cause: originalError instanceof Error ? originalError : void 0 });
216
+ this.originalError = originalError;
217
+ this.name = "DPoPInitError";
218
+ }
219
+ };
220
+ /**
221
+ * Error thrown when a recovery attempt fails.
222
+ *
223
+ * Carries the recovery action and attempt number for diagnostic purposes.
224
+ */
225
+ var RecoveryError = class extends Error {
226
+ constructor(action, attempt, originalError) {
227
+ super(`Recovery failed: ${action} (attempt ${attempt})`, { cause: originalError instanceof Error ? originalError : void 0 });
228
+ this.action = action;
229
+ this.attempt = attempt;
230
+ this.originalError = originalError;
231
+ this.name = "RecoveryError";
232
+ }
233
+ };
234
+ /**
235
+ * Error thrown when getUserMedia fails with OverconstrainedError
236
+ * and all fallback levels have been exhausted.
237
+ */
238
+ var OverconstrainedFallbackError = class extends Error {
239
+ constructor(deviceKind, originalError) {
240
+ super(`All constraint fallback levels exhausted for ${deviceKind}`, { cause: originalError instanceof Error ? originalError : void 0 });
241
+ this.deviceKind = deviceKind;
242
+ this.originalError = originalError;
243
+ this.name = "OverconstrainedFallbackError";
244
+ }
245
+ };
246
+ /**
247
+ * Error thrown when the preflight connectivity test fails.
248
+ */
249
+ var PreflightError = class extends Error {
250
+ constructor(phase, originalError) {
251
+ super(`Preflight test failed during ${phase}`, { cause: originalError instanceof Error ? originalError : void 0 });
252
+ this.phase = phase;
253
+ this.originalError = originalError;
254
+ this.name = "PreflightError";
255
+ }
256
+ };
257
+ var DeviceTokenError = class extends Error {
258
+ constructor(message, originalError) {
259
+ super(message, { cause: originalError instanceof Error ? originalError : void 0 });
260
+ this.originalError = originalError;
261
+ this.name = "DeviceTokenError";
262
+ }
263
+ };
264
+ var TokenRefreshError = class extends Error {
265
+ constructor(message, originalError) {
266
+ super(message, { cause: originalError instanceof Error ? originalError : void 0 });
267
+ this.originalError = originalError;
268
+ this.name = "TokenRefreshError";
269
+ }
270
+ };
201
271
 
202
272
  //#endregion
203
273
  //#region src/utils/logger.ts
@@ -207,33 +277,70 @@ const originalFactory = defaultLogger.methodFactory;
207
277
  defaultLogger.methodFactory = (methodName, logLevel, loggerName) => {
208
278
  const rawMethod = originalFactory(methodName, logLevel, loggerName);
209
279
  return function(...args) {
210
- args.unshift(datetime(), "-");
211
- rawMethod.apply(void 0, args);
280
+ const prefixed = [
281
+ datetime(),
282
+ "-",
283
+ ...args
284
+ ];
285
+ rawMethod.apply(void 0, prefixed);
212
286
  };
213
287
  };
214
- const defaultLoggerLevel = defaultLogger.levels.DEBUG;
288
+ const defaultLoggerLevel = defaultLogger.levels.WARN;
215
289
  defaultLogger.setLevel(defaultLoggerLevel);
216
- let userLogger;
290
+ let userLogger = null;
291
+ /** Replace the built-in logger with a custom implementation. Pass `null` to restore defaults. */
292
+ const setLogger = (logger$1) => {
293
+ userLogger = logger$1;
294
+ };
217
295
  let debugOptions = {};
296
+ /** Configure debug options (e.g., `{ logWsTraffic: true }`). */
297
+ const setDebugOptions = (options) => {
298
+ if (options == null) {
299
+ debugOptions = {};
300
+ return;
301
+ }
302
+ debugOptions = {
303
+ ...debugOptions,
304
+ ...options
305
+ };
306
+ };
307
+ /**
308
+ * Set the log level for the built-in logger.
309
+ * Has no effect when a custom logger is set via `setLogger()`.
310
+ */
311
+ const setLogLevel = (level) => {
312
+ defaultLogger.setLevel(level);
313
+ };
218
314
  const getLoggerInstance = () => {
219
315
  return userLogger ?? defaultLogger;
220
316
  };
221
317
  const shouldStringify = (payload) => {
222
- if ("method" in payload && payload.method === "signalwire.ping") return false;
318
+ if (payload != null && typeof payload === "object" && "method" in payload) return payload.method !== "signalwire.ping";
223
319
  return true;
224
320
  };
225
- const wsTraffic = ({ type, payload }) => {
226
- const logger$1 = getLoggerInstance();
227
- const { logWsTraffic } = debugOptions ?? {};
321
+ const wsTraffic = (options) => {
322
+ const { logWsTraffic } = debugOptions;
228
323
  if (!logWsTraffic) return;
324
+ const loggerInstance = getLoggerInstance();
325
+ let payload;
326
+ if ("raw" in options) try {
327
+ payload = JSON.parse(options.raw);
328
+ } catch {
329
+ loggerInstance.debug(`[WebSocket] ${options.type.toUpperCase()}: non-JSON message`);
330
+ return;
331
+ }
332
+ else payload = options.payload;
229
333
  const msg = shouldStringify(payload) ? JSON.stringify(payload, null, 2) : payload;
230
- return logger$1.debug(`${type.toUpperCase()}: \n`, msg, "\n");
334
+ loggerInstance.debug(`${options.type.toUpperCase()}: \n`, msg, "\n");
231
335
  };
232
336
  const getLogger = () => {
233
337
  const logger$1 = getLoggerInstance();
234
- return new Proxy(logger$1, { get(target, prop, receiver) {
338
+ return new Proxy(logger$1, { get(_target, prop, _receiver) {
235
339
  if (prop === "wsTraffic") return wsTraffic;
236
- return Reflect.get(target, prop, receiver);
340
+ const instance = getLoggerInstance();
341
+ const value = Reflect.get(instance, prop);
342
+ if (typeof value === "function") return value.bind(instance);
343
+ return value;
237
344
  } });
238
345
  };
239
346
 
@@ -367,5 +474,5 @@ function throwOnRPCError() {
367
474
  }
368
475
 
369
476
  //#endregion
370
- export { VertoPongError as A, StorageReadError as C, UnimplementedError as D, UnexpectedError as E, WebSocketTimeoutError as M, ValidationError as O, StorageNotAvailableError as S, TransportConnectionError as T, MessageParseError as _, filterNull as a, RequestTimeoutError as b, CallCreateError as c, DependencyError as d, DeserializationError as f, MediaTrackError as g, JSONRPCError as h, getValueFrom as i, WebSocketConnectionError as j, VertoInviteHandlerError as k, CollectionFetchError as l, InvalidParams as m, filterAs as n, getLogger as o, InvalidCredentialsError as p, ifIsMap as r, AuthStateHandlerError as s, throwOnRPCError as t, ConversationError as u, RPCTimeoutError as v, StorageWriteError as w, SerializationError as x, RequestError as y };
371
- //# sourceMappingURL=operators-BHQMSEzq.mjs.map
477
+ export { StorageNotAvailableError as A, VertoPongError as B, OverconstrainedFallbackError as C, RequestError as D, RecoveryError as E, UnexpectedError as F, WebSocketTimeoutError as H, UnimplementedError as I, ValidationError as L, StorageWriteError as M, TokenRefreshError as N, RequestTimeoutError as O, TransportConnectionError as P, VertoAttachHandlerError as R, MessageParseError as S, RPCTimeoutError as T, WebSocketConnectionError as V, DeviceTokenError as _, filterNull as a, JSONRPCError as b, setLogLevel as c, CallCreateError as d, CollectionFetchError as f, DeserializationError as g, DependencyError as h, getValueFrom as i, StorageReadError as j, SerializationError as k, setLogger as l, DPoPInitError as m, filterAs as n, getLogger as o, ConversationError as p, ifIsMap as r, setDebugOptions as s, throwOnRPCError as t, AuthStateHandlerError as u, InvalidCredentialsError as v, PreflightError as w, MediaTrackError as x, InvalidParams as y, VertoInviteHandlerError as z };
478
+ //# sourceMappingURL=operators-B1xH6k06.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operators-B1xH6k06.mjs","names":["at?: string","requestId: string","timeoutMs: number","error: unknown","storageType: string","key: string","originalError: Error","description: string","message: string","direction: 'inbound' | 'outbound'","code: number | string","data?: unknown","requestId?: string","originalError: unknown","operation: string","kind: string","action: string","attempt: number","originalError?: unknown","deviceKind: string","phase: string","userLogger: SDKLogger | null","logger","debugOptions: DebugOptions","wsTraffic: InternalSDKLogger['wsTraffic']","payload: unknown","value: unknown","filter","map"],"sources":["../src/core/errors.ts","../src/utils/logger.ts","../src/operators/filterNull.ts","../src/utils/getValueFrom.ts","../src/operators/filterEventAs.ts","../src/operators/throwOnRPCError.ts"],"sourcesContent":["export class UnexpectedError extends Error {\n constructor(\n public at?: string,\n options?: ErrorOptions\n ) {\n super(`Unexpected Error${at ? ` at ${at}` : ''}`, options);\n this.name = 'UnexpectedError';\n }\n}\n\nexport class UnimplementedError extends Error {\n constructor(\n public reason = 'Not Implemented',\n options?: ErrorOptions\n ) {\n super(reason, options);\n this.name = 'UnimplementedError';\n }\n}\n\nexport class NotConnectedError extends Error {\n constructor(\n public reason = 'Not Connected',\n options?: ErrorOptions\n ) {\n super(reason, options);\n this.name = 'NotConnectedError';\n }\n}\n\nexport class InvalidCredentialsError extends Error {\n constructor(\n public reason = 'Invalid Credentials',\n options?: ErrorOptions\n ) {\n super(reason, options);\n this.name = 'InvalidCredentialsError';\n }\n}\n\nexport class WebSocketConnectionError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'WebSocketConnectionError';\n }\n}\n\nexport class TransportConnectionError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'TransportConnectionError';\n }\n}\n\nexport class WebSocketTimeoutError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'WebSocketTimeoutError';\n }\n}\n\nexport class RequestTimeoutError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'RequestTimeoutError';\n }\n}\n\nexport class RequestError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'RequestError';\n }\n}\n\nexport class InvalidListenerError extends Error {\n constructor(options?: ErrorOptions) {\n super('listener is not a function', options);\n this.name = 'InvalidListenerError';\n }\n}\n\nexport class RPCTimeoutError extends Error {\n constructor(\n public requestId: string,\n public timeoutMs: number,\n options?: ErrorOptions\n ) {\n super(`RPC request ${requestId} timed out after ${timeoutMs}ms`, options);\n this.name = 'RPCTimeoutError';\n }\n}\n\nexport class AuthStateHandlerError extends Error {\n constructor(\n public error: unknown = null,\n options?: ErrorOptions\n ) {\n super('Error handling authorization state update', {\n ...options,\n cause: options?.cause ?? (error instanceof Error ? error : undefined)\n });\n this.name = 'AuthStateHandlerError';\n }\n}\n\nexport class InvalidStateTransitionError extends Error {\n constructor(\n public currentState: string,\n public targetState: string,\n options?: ErrorOptions\n ) {\n super(\n `Invalid transition: cannot transition from \"${currentState}\" to \"${targetState}\"`,\n options\n );\n this.name = 'InvalidStateTransitionError';\n }\n}\n\nexport class InvalidOptionError extends Error {\n constructor(\n public value: string,\n public availableOptions: string[],\n options?: ErrorOptions\n ) {\n super(\n `Invalid option: \"${value}\" must be one of the available options: ${availableOptions.join(', ')}`,\n options\n );\n this.name = 'InvalidOptionError';\n }\n}\n\nexport class StorageNotAvailableError extends Error {\n constructor(\n public storageType: string = 'localStorage',\n options?: ErrorOptions\n ) {\n super(`${storageType} is not available in this environment`, options);\n this.name = 'StorageNotAvailableError';\n }\n}\n\nexport class SerializationError extends Error {\n constructor(\n public key: string,\n public originalError: Error\n ) {\n super(`Failed to serialize value for key \"${key}\": ${originalError.message}`, {\n cause: originalError\n });\n this.name = 'SerializationError';\n }\n}\n\nexport class DeserializationError extends Error {\n constructor(\n public key: string,\n public originalError: Error\n ) {\n super(`Failed to deserialize value for key \"${key}\": ${originalError.message}`, {\n cause: originalError\n });\n this.name = 'DeserializationError';\n }\n}\n\nexport class StorageWriteError extends Error {\n constructor(\n public key: string,\n public originalError: Error\n ) {\n super(`Failed to write to storage for key \"${key}\": ${originalError.message}`, {\n cause: originalError\n });\n this.name = 'StorageWriteError';\n }\n}\n\nexport class StorageReadError extends Error {\n constructor(\n public key: string,\n public originalError: Error\n ) {\n super(`Failed to read from storage \"${key}\": ${originalError.message}`, {\n cause: originalError\n });\n this.name = 'StorageReadError';\n }\n}\n\nexport class InvalidStorageValueError extends Error {\n constructor(\n public key: string,\n public valueType: string,\n options?: ErrorOptions\n ) {\n super(\n `Cannot serialize value of type \"${valueType}\" for key \"${key}\": This type cannot be serialized to JSON`,\n options\n );\n this.name = 'InvalidStorageValueError';\n }\n}\n\nexport class DependencyError extends Error {\n constructor(\n public description: string,\n options?: ErrorOptions\n ) {\n super(`Dependency ${description} is not set or available.`, options);\n this.name = 'DependencyError';\n }\n}\n\nexport class DeviceNotFoundError extends Error {\n constructor(\n public message: string,\n options?: ErrorOptions\n ) {\n super(message, options);\n this.name = 'DeviceNotFoundError';\n }\n}\n\n// =============================================================================\n// CALL ERROR TYPES\n// =============================================================================\n\n/**\n * Semantic category of a call-lifecycle error.\n *\n * - `'media'` – RTCPeerConnection / media device failure\n * - `'signaling'` – Verto / JSON-RPC protocol error\n * - `'timeout'` – Call setup timed out waiting for a response\n * - `'rejected'` – Remote side rejected the call\n * - `'network'` – Transport lost during an active call\n * - `'internal'` – Unexpected / unknown error\n */\nexport type CallErrorKind = 'media' | 'signaling' | 'timeout' | 'rejected' | 'network' | 'internal';\n\n/**\n * Structured error emitted on `call.errors$`.\n *\n * Provides actionable metadata so consumers can react without\n * resorting to `instanceof` checks on raw `Error` objects.\n */\nexport interface CallError {\n /** Semantic category of the error. */\n readonly kind: CallErrorKind;\n /**\n * Whether the error terminates the call.\n * When `true`, the call will automatically transition to `'failed'`\n * and be destroyed — no further action is needed from the consumer.\n */\n readonly fatal: boolean;\n /** The underlying error. */\n readonly error: Error;\n /** ID of the call that produced this error. */\n readonly callId: string;\n}\n\nexport class CallCreateError extends Error {\n constructor(\n public message: string,\n public error: unknown = null,\n public direction: 'inbound' | 'outbound' = 'outbound',\n options?: ErrorOptions\n ) {\n super(message, {\n ...options,\n cause: options?.cause ?? (error instanceof Error ? error : undefined)\n });\n this.name = 'CallCreateError';\n }\n}\n\nexport class JSONRPCError extends Error {\n constructor(\n public code: number | string,\n message: string,\n public data?: unknown,\n options?: ErrorOptions,\n public requestId?: string\n ) {\n super(message, options);\n this.name = 'JSONRPCError';\n }\n}\n\nexport class InvalidParams extends Error {\n constructor(\n public message: string,\n options?: ErrorOptions\n ) {\n super(message, options);\n this.name = 'InvalidParams';\n }\n}\n\nexport class ConversationError extends Error {\n constructor(\n public message: string,\n options?: ErrorOptions\n ) {\n super(message, options);\n this.name = 'ConversationError';\n }\n}\n\nexport class VertoInviteHandlerError extends Error {\n constructor(\n public error: unknown = null,\n options?: ErrorOptions\n ) {\n super('Error handling Verto invite', {\n ...options,\n cause: options?.cause ?? (error instanceof Error ? error : undefined)\n });\n this.name = 'VertoInviteHandlerError';\n }\n}\n\nexport class VertoAttachHandlerError extends Error {\n constructor(\n public error: unknown = null,\n options?: ErrorOptions\n ) {\n super('Error handling Verto attach', {\n ...options,\n cause: options?.cause ?? (error instanceof Error ? error : undefined)\n });\n this.name = 'VertoAttachHandlerError';\n }\n}\n\nexport class HttpRequestError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'HttpRequestError';\n }\n}\n\nexport class ValidationError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = 'ValidationError';\n }\n}\n\nexport class VertoPongError extends Error {\n constructor(public originalError: unknown) {\n super('Failed to send Verto pong - call may disconnect', {\n cause: originalError instanceof Error ? originalError : undefined\n });\n this.name = 'VertoPongError';\n }\n}\n\nexport class MessageParseError extends Error {\n constructor(public originalError: unknown) {\n super('Failed to parse incoming WebSocket message', {\n cause: originalError instanceof Error ? originalError : undefined\n });\n this.name = 'MessageParseError';\n }\n}\n\nexport class CollectionFetchError extends Error {\n constructor(\n public operation: string,\n public originalError: unknown\n ) {\n super(`Collection fetch failed during ${operation}`, {\n cause: originalError instanceof Error ? originalError : undefined\n });\n this.name = 'CollectionFetchError';\n }\n}\n\nexport class MediaTrackError extends Error {\n constructor(\n public operation: string,\n public kind: string,\n public originalError: unknown\n ) {\n super(`Media track ${operation} failed for ${kind}`, {\n cause: originalError instanceof Error ? originalError : undefined\n });\n this.name = 'MediaTrackError';\n }\n}\n\n// =============================================================================\n// DPOP / CLIENT BOUND SAT ERROR TYPES\n// =============================================================================\n\nexport class DPoPInitError extends Error {\n constructor(\n public originalError: unknown,\n message = 'Failed to initialize DPoP key pair'\n ) {\n super(message, {\n cause: originalError instanceof Error ? originalError : undefined\n });\n this.name = 'DPoPInitError';\n }\n}\n\n// =============================================================================\n// RESILIENCE ERROR TYPES\n// =============================================================================\n\n/**\n * Error thrown when a recovery attempt fails.\n *\n * Carries the recovery action and attempt number for diagnostic purposes.\n */\nexport class RecoveryError extends Error {\n constructor(\n public action: string,\n public attempt: number,\n public originalError?: unknown\n ) {\n super(`Recovery failed: ${action} (attempt ${attempt})`, {\n cause: originalError instanceof Error ? originalError : undefined\n });\n this.name = 'RecoveryError';\n }\n}\n\n/**\n * Error thrown when getUserMedia fails with OverconstrainedError\n * and all fallback levels have been exhausted.\n */\nexport class OverconstrainedFallbackError extends Error {\n constructor(\n public deviceKind: string,\n public originalError?: unknown\n ) {\n super(`All constraint fallback levels exhausted for ${deviceKind}`, {\n cause: originalError instanceof Error ? originalError : undefined\n });\n this.name = 'OverconstrainedFallbackError';\n }\n}\n\n/**\n * Error thrown when the preflight connectivity test fails.\n */\nexport class PreflightError extends Error {\n constructor(\n public phase: string,\n public originalError?: unknown\n ) {\n super(`Preflight test failed during ${phase}`, {\n cause: originalError instanceof Error ? originalError : undefined\n });\n this.name = 'PreflightError';\n }\n}\n\n// =============================================================================\n// DPOP / CLIENT BOUND SAT ERROR TYPES\n// =============================================================================\n\nexport class DeviceTokenError extends Error {\n constructor(\n message: string,\n public originalError?: unknown\n ) {\n super(message, {\n cause: originalError instanceof Error ? originalError : undefined\n });\n this.name = 'DeviceTokenError';\n }\n}\n\nexport class TokenRefreshError extends Error {\n constructor(\n message: string,\n public originalError?: unknown\n ) {\n super(message, {\n cause: originalError instanceof Error ? originalError : undefined\n });\n this.name = 'TokenRefreshError';\n }\n}\n","import log from 'loglevel';\n\n// =============================================================================\n// Public Interfaces\n// =============================================================================\n\n/** Log level names supported by the SDK. */\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent';\n\n/**\n * Logger interface that consumers can implement to replace the built-in logger.\n * All methods accept variadic arguments matching the browser console API.\n */\nexport interface SDKLogger {\n error(...args: unknown[]): void;\n warn(...args: unknown[]): void;\n info(...args: unknown[]): void;\n debug(...args: unknown[]): void;\n trace(...args: unknown[]): void;\n}\n\n/** Options for WebSocket traffic logging. */\nexport interface WsTrafficOptions {\n type: 'send' | 'recv' | 'http';\n /** Parsed object or raw string — will be JSON.stringify'd for display if an object. */\n payload: unknown;\n}\n\n/**\n * Options for WebSocket traffic logging using raw strings.\n * The string is only parsed when logging is enabled, avoiding\n * unnecessary JSON.parse on every message.\n */\nexport interface WsTrafficRawOptions {\n type: 'send' | 'recv';\n raw: string;\n}\n\n/** Debug options that control verbose SDK logging. */\nexport interface DebugOptions {\n /** Log all WebSocket send/recv traffic to the console. */\n logWsTraffic?: boolean;\n}\n\n/** Extended logger with SDK-internal helpers (wsTraffic). */\nexport interface InternalSDKLogger extends SDKLogger {\n wsTraffic: (options: WsTrafficOptions | WsTrafficRawOptions) => void;\n}\n\n// =============================================================================\n// Default Logger (loglevel)\n// =============================================================================\n\nconst datetime = () => new Date().toISOString();\nconst defaultLogger = log.getLogger('signalwire');\n\nconst originalFactory = defaultLogger.methodFactory;\ndefaultLogger.methodFactory = (methodName, logLevel, loggerName) => {\n const rawMethod = originalFactory(methodName, logLevel, loggerName);\n\n return function (...args: unknown[]) {\n const prefixed = [datetime(), '-', ...args];\n // eslint-disable-next-line prefer-spread\n rawMethod.apply(undefined, prefixed);\n };\n};\n\n// Default to WARN in production; consumers opt in to verbose logging\nconst defaultLoggerLevel = defaultLogger.levels.WARN;\ndefaultLogger.setLevel(defaultLoggerLevel);\n\n// =============================================================================\n// Logger State\n// =============================================================================\n\nlet userLogger: SDKLogger | null = null;\n\n/** Replace the built-in logger with a custom implementation. Pass `null` to restore defaults. */\nconst setLogger = (logger: SDKLogger | null): void => {\n userLogger = logger;\n};\n\nlet debugOptions: DebugOptions = {};\n\n/** Configure debug options (e.g., `{ logWsTraffic: true }`). */\nconst setDebugOptions = (options: DebugOptions | null): void => {\n if (options == null) {\n debugOptions = {};\n return;\n }\n debugOptions = { ...debugOptions, ...options };\n};\n\n/**\n * Set the log level for the built-in logger.\n * Has no effect when a custom logger is set via `setLogger()`.\n */\nconst setLogLevel = (level: LogLevel): void => {\n defaultLogger.setLevel(level);\n};\n\n// =============================================================================\n// Logger Instance\n// =============================================================================\n\nconst getLoggerInstance = (): SDKLogger => {\n // loglevel's Logger matches SDKLogger (error, warn, info, debug, trace)\n return userLogger ?? (defaultLogger as SDKLogger);\n};\n\nconst shouldStringify = (payload: unknown): boolean => {\n if (payload != null && typeof payload === 'object' && 'method' in payload) {\n return (payload as Record<string, unknown>).method !== 'signalwire.ping';\n }\n return true;\n};\n\nconst wsTraffic: InternalSDKLogger['wsTraffic'] = (options) => {\n const { logWsTraffic } = debugOptions;\n\n if (!logWsTraffic) {\n return;\n }\n\n const loggerInstance = getLoggerInstance();\n\n // Support raw string payloads — parse only when logging is enabled\n let payload: unknown;\n if ('raw' in options) {\n try {\n payload = JSON.parse(options.raw);\n } catch {\n loggerInstance.debug(`[WebSocket] ${options.type.toUpperCase()}: non-JSON message`);\n return;\n }\n } else {\n payload = options.payload;\n }\n\n const msg = shouldStringify(payload) ? JSON.stringify(payload, null, 2) : payload;\n loggerInstance.debug(`${options.type.toUpperCase()}: \\n`, msg, '\\n');\n};\n\nconst getLogger = (): InternalSDKLogger => {\n const logger = getLoggerInstance();\n\n return new Proxy(logger, {\n get(_target, prop: string | symbol, _receiver) {\n if (prop === 'wsTraffic') {\n return wsTraffic;\n }\n // Always resolve from the current logger instance so that\n // setLogger() takes effect for all existing references.\n const instance = getLoggerInstance();\n const value: unknown = Reflect.get(instance, prop);\n if (typeof value === 'function') {\n return (value as (...args: unknown[]) => unknown).bind(instance);\n }\n return value;\n }\n }) as InternalSDKLogger;\n};\n\nexport { setLogger, getLogger, setDebugOptions, setLogLevel };\n","import { filter } from 'rxjs';\n\nimport type { OperatorFunction } from 'rxjs';\n\n/**\n * RxJS operator that filters out `null` and `undefined` values with type narrowing.\n *\n * @example\n * ```ts\n * source$.pipe(filterNull()).subscribe(value => {\n * // value is guaranteed non-null\n * });\n * ```\n */\nexport function filterNull<T>(): OperatorFunction<T | null | undefined, T> {\n return filter((value): value is T => value != null);\n}\n","export const getValueFrom = <T = unknown>(\n obj: unknown,\n path: string,\n defaultValue?: T\n): T | undefined => {\n const keys = path.split('.');\n let result = obj;\n for (const key of keys) {\n if (result && typeof result === 'object' && key in result) {\n result = (result as Record<string, unknown>)[key];\n } else {\n return defaultValue;\n }\n }\n return (result === undefined ? defaultValue : result) as T;\n};\n","import { pipe } from 'rxjs';\nimport { filter, map } from 'rxjs/operators';\n\nimport { getValueFrom } from '../utils/getValueFrom';\n\nimport type { OperatorFunction } from 'rxjs';\n\n/**\n * Type helper to extract nested property types using dot notation.\n * Supports up to 4 levels of nesting.\n *\n * @example\n * type Example = { a: { b: { c: string } } }\n * type Result = PathValue<Example, 'a.b.c'> // string\n */\ntype PathValue<T, P extends string> = P extends `${infer Key}.${infer Rest}`\n ? Key extends keyof T\n ? PathValue<T[Key], Rest>\n : never\n : P extends keyof T\n ? T[P]\n : never;\n\n// Usage:\n// source$.pipe(\n// isEvent(\n// (event) => event.type === 'call.started',\n// (event) => ({ id: event.id, timestamp: event.timestamp })\n// )\n// );\n\n/**\n * RxJS operator that filters events based on a predicate and maps matching events.\n *\n * This operator combines filter and map operations:\n * 1. Only events that match the predicate are emitted\n * 2. Matching events are transformed using the map function\n *\n * @template TInput - The type of input events\n * @template TOutput - The type of output after mapping\n * @param predicate - Function to test each event. Returns true to include the event.\n * @param mapFn - Function to transform matching events\n * @returns An operator function that filters and maps events\n *\n * @example\n * ```typescript\n * interface CallEvent {\n * type: 'call.started' | 'call.ended';\n * id: string;\n * timestamp: number;\n * }\n *\n * events$.pipe(\n * isEvent(\n * (event: CallEvent) => event.type === 'call.started',\n * (event: CallEvent) => ({ id: event.id, timestamp: event.timestamp })\n * )\n * ).subscribe(startEvent => {\n * console.log('Call started:', startEvent);\n * });\n * ```\n */\nexport function ifIsMap<TInput, TOutput>(\n predicate: (event: unknown) => event is TInput,\n mapFn: (event: TInput) => TOutput\n): OperatorFunction<unknown, TOutput> {\n return pipe(filter(predicate), map(mapFn));\n}\n\n/**\n * Generic RxJS operator that filters events using a type guard and extracts a property.\n *\n * This is the generic version that works with any type, not just JSONRPCRequest.\n * Use this when you need to filter and extract properties from already-narrowed types.\n *\n * **Type inference**: The output type is automatically inferred from the input type and path!\n *\n * @template TInput - The type to narrow to (via type guard)\n * @template TPath - The dot-notation path to extract (inferred from parameter)\n * @param predicate - Type guard function to filter events\n * @param resultPath - Dot-notation path to extract (e.g., 'params', 'params.data')\n * @returns An operator function that filters and extracts\n *\n * @example\n * ```typescript\n * interface EventParams {\n * event_type: string;\n * data: { value: number };\n * }\n *\n * const isAuthEvent = (e: unknown): e is EventParams =>\n * typeof e === 'object' && e !== null && 'event_type' in e;\n *\n * // Type of 'data' is automatically inferred as { value: number }\n * params$.pipe(\n * filterAs(isAuthEvent, 'data')\n * ).subscribe(data => {\n * console.log('Event data:', data.value); // TypeScript knows about .value!\n * });\n *\n * // Deeply nested properties are also inferred\n * params$.pipe(\n * filterAs(isAuthEvent, 'data.value')\n * ).subscribe(value => {\n * console.log(value); // Type is 'number'\n * });\n * ```\n */\nexport function filterAs<TInput, TPath extends string>(\n predicate: (event: unknown) => event is TInput,\n resultPath: TPath\n): OperatorFunction<unknown, PathValue<TInput, TPath>> {\n return pipe(\n ifIsMap(predicate, (event) => {\n const result = getValueFrom<PathValue<TInput, TPath>>(event, resultPath);\n return result;\n }),\n filter((value): value is PathValue<TInput, TPath> => value !== undefined)\n );\n}\n","import { map, type OperatorFunction } from 'rxjs';\n\nimport { JSONRPCError } from '../core/errors';\nimport { getLogger } from '../utils/logger';\n\nimport type { JSONRPCResponse } from '../core/RPCMessages/types/base';\n\nconst logger = getLogger();\n\n/**\n * RxJS operator that throws a {@link JSONRPCError} when the RPC response contains an error.\n * Passes successful responses through unchanged.\n */\nexport function throwOnRPCError<T extends JSONRPCResponse>(): OperatorFunction<T, T> {\n return map((response: T) => {\n if (response.error) {\n logger.error('[throwOnRPCError] RPC error response:', {\n code: response.error.code,\n message: response.error.message,\n data: response.error.data\n });\n\n throw new JSONRPCError(response.error.code, response.error.message, response.error.data);\n }\n logger.debug('[throwOnRPCError] RPC successful response:', response);\n return response;\n });\n}\n"],"mappings":"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"}
@@ -147,21 +147,23 @@ var DependencyError = class extends Error {
147
147
  }
148
148
  };
149
149
  var CallCreateError = class extends Error {
150
- constructor(message, error = null, options) {
150
+ constructor(message, error = null, direction = "outbound", options) {
151
151
  super(message, {
152
152
  ...options,
153
153
  cause: options?.cause ?? (error instanceof Error ? error : void 0)
154
154
  });
155
155
  this.message = message;
156
156
  this.error = error;
157
+ this.direction = direction;
157
158
  this.name = "CallCreateError";
158
159
  }
159
160
  };
160
161
  var JSONRPCError = class extends Error {
161
- constructor(code, message, data, options) {
162
+ constructor(code, message, data, options, requestId) {
162
163
  super(message, options);
163
164
  this.code = code;
164
165
  this.data = data;
166
+ this.requestId = requestId;
165
167
  this.name = "JSONRPCError";
166
168
  }
167
169
  };
@@ -189,6 +191,16 @@ var VertoInviteHandlerError = class extends Error {
189
191
  this.name = "VertoInviteHandlerError";
190
192
  }
191
193
  };
194
+ var VertoAttachHandlerError = class extends Error {
195
+ constructor(error = null, options) {
196
+ super("Error handling Verto attach", {
197
+ ...options,
198
+ cause: options?.cause ?? (error instanceof Error ? error : void 0)
199
+ });
200
+ this.error = error;
201
+ this.name = "VertoAttachHandlerError";
202
+ }
203
+ };
192
204
  var ValidationError = class extends Error {
193
205
  constructor(message, options) {
194
206
  super(message, options);
@@ -226,6 +238,64 @@ var MediaTrackError = class extends Error {
226
238
  this.name = "MediaTrackError";
227
239
  }
228
240
  };
241
+ var DPoPInitError = class extends Error {
242
+ constructor(originalError, message = "Failed to initialize DPoP key pair") {
243
+ super(message, { cause: originalError instanceof Error ? originalError : void 0 });
244
+ this.originalError = originalError;
245
+ this.name = "DPoPInitError";
246
+ }
247
+ };
248
+ /**
249
+ * Error thrown when a recovery attempt fails.
250
+ *
251
+ * Carries the recovery action and attempt number for diagnostic purposes.
252
+ */
253
+ var RecoveryError = class extends Error {
254
+ constructor(action, attempt, originalError) {
255
+ super(`Recovery failed: ${action} (attempt ${attempt})`, { cause: originalError instanceof Error ? originalError : void 0 });
256
+ this.action = action;
257
+ this.attempt = attempt;
258
+ this.originalError = originalError;
259
+ this.name = "RecoveryError";
260
+ }
261
+ };
262
+ /**
263
+ * Error thrown when getUserMedia fails with OverconstrainedError
264
+ * and all fallback levels have been exhausted.
265
+ */
266
+ var OverconstrainedFallbackError = class extends Error {
267
+ constructor(deviceKind, originalError) {
268
+ super(`All constraint fallback levels exhausted for ${deviceKind}`, { cause: originalError instanceof Error ? originalError : void 0 });
269
+ this.deviceKind = deviceKind;
270
+ this.originalError = originalError;
271
+ this.name = "OverconstrainedFallbackError";
272
+ }
273
+ };
274
+ /**
275
+ * Error thrown when the preflight connectivity test fails.
276
+ */
277
+ var PreflightError = class extends Error {
278
+ constructor(phase, originalError) {
279
+ super(`Preflight test failed during ${phase}`, { cause: originalError instanceof Error ? originalError : void 0 });
280
+ this.phase = phase;
281
+ this.originalError = originalError;
282
+ this.name = "PreflightError";
283
+ }
284
+ };
285
+ var DeviceTokenError = class extends Error {
286
+ constructor(message, originalError) {
287
+ super(message, { cause: originalError instanceof Error ? originalError : void 0 });
288
+ this.originalError = originalError;
289
+ this.name = "DeviceTokenError";
290
+ }
291
+ };
292
+ var TokenRefreshError = class extends Error {
293
+ constructor(message, originalError) {
294
+ super(message, { cause: originalError instanceof Error ? originalError : void 0 });
295
+ this.originalError = originalError;
296
+ this.name = "TokenRefreshError";
297
+ }
298
+ };
229
299
 
230
300
  //#endregion
231
301
  //#region src/utils/logger.ts
@@ -235,33 +305,70 @@ const originalFactory = defaultLogger.methodFactory;
235
305
  defaultLogger.methodFactory = (methodName, logLevel, loggerName) => {
236
306
  const rawMethod = originalFactory(methodName, logLevel, loggerName);
237
307
  return function(...args) {
238
- args.unshift(datetime(), "-");
239
- rawMethod.apply(void 0, args);
308
+ const prefixed = [
309
+ datetime(),
310
+ "-",
311
+ ...args
312
+ ];
313
+ rawMethod.apply(void 0, prefixed);
240
314
  };
241
315
  };
242
- const defaultLoggerLevel = defaultLogger.levels.DEBUG;
316
+ const defaultLoggerLevel = defaultLogger.levels.WARN;
243
317
  defaultLogger.setLevel(defaultLoggerLevel);
244
- let userLogger;
318
+ let userLogger = null;
319
+ /** Replace the built-in logger with a custom implementation. Pass `null` to restore defaults. */
320
+ const setLogger = (logger$1) => {
321
+ userLogger = logger$1;
322
+ };
245
323
  let debugOptions = {};
324
+ /** Configure debug options (e.g., `{ logWsTraffic: true }`). */
325
+ const setDebugOptions = (options) => {
326
+ if (options == null) {
327
+ debugOptions = {};
328
+ return;
329
+ }
330
+ debugOptions = {
331
+ ...debugOptions,
332
+ ...options
333
+ };
334
+ };
335
+ /**
336
+ * Set the log level for the built-in logger.
337
+ * Has no effect when a custom logger is set via `setLogger()`.
338
+ */
339
+ const setLogLevel = (level) => {
340
+ defaultLogger.setLevel(level);
341
+ };
246
342
  const getLoggerInstance = () => {
247
343
  return userLogger ?? defaultLogger;
248
344
  };
249
345
  const shouldStringify = (payload) => {
250
- if ("method" in payload && payload.method === "signalwire.ping") return false;
346
+ if (payload != null && typeof payload === "object" && "method" in payload) return payload.method !== "signalwire.ping";
251
347
  return true;
252
348
  };
253
- const wsTraffic = ({ type, payload }) => {
254
- const logger$1 = getLoggerInstance();
255
- const { logWsTraffic } = debugOptions ?? {};
349
+ const wsTraffic = (options) => {
350
+ const { logWsTraffic } = debugOptions;
256
351
  if (!logWsTraffic) return;
352
+ const loggerInstance = getLoggerInstance();
353
+ let payload;
354
+ if ("raw" in options) try {
355
+ payload = JSON.parse(options.raw);
356
+ } catch {
357
+ loggerInstance.debug(`[WebSocket] ${options.type.toUpperCase()}: non-JSON message`);
358
+ return;
359
+ }
360
+ else payload = options.payload;
257
361
  const msg = shouldStringify(payload) ? JSON.stringify(payload, null, 2) : payload;
258
- return logger$1.debug(`${type.toUpperCase()}: \n`, msg, "\n");
362
+ loggerInstance.debug(`${options.type.toUpperCase()}: \n`, msg, "\n");
259
363
  };
260
364
  const getLogger = () => {
261
365
  const logger$1 = getLoggerInstance();
262
- return new Proxy(logger$1, { get(target, prop, receiver) {
366
+ return new Proxy(logger$1, { get(_target, prop, _receiver) {
263
367
  if (prop === "wsTraffic") return wsTraffic;
264
- return Reflect.get(target, prop, receiver);
368
+ const instance = getLoggerInstance();
369
+ const value = Reflect.get(instance, prop);
370
+ if (typeof value === "function") return value.bind(instance);
371
+ return value;
265
372
  } });
266
373
  };
267
374
 
@@ -419,6 +526,12 @@ Object.defineProperty(exports, 'ConversationError', {
419
526
  return ConversationError;
420
527
  }
421
528
  });
529
+ Object.defineProperty(exports, 'DPoPInitError', {
530
+ enumerable: true,
531
+ get: function () {
532
+ return DPoPInitError;
533
+ }
534
+ });
422
535
  Object.defineProperty(exports, 'DependencyError', {
423
536
  enumerable: true,
424
537
  get: function () {
@@ -431,6 +544,12 @@ Object.defineProperty(exports, 'DeserializationError', {
431
544
  return DeserializationError;
432
545
  }
433
546
  });
547
+ Object.defineProperty(exports, 'DeviceTokenError', {
548
+ enumerable: true,
549
+ get: function () {
550
+ return DeviceTokenError;
551
+ }
552
+ });
434
553
  Object.defineProperty(exports, 'InvalidCredentialsError', {
435
554
  enumerable: true,
436
555
  get: function () {
@@ -461,12 +580,30 @@ Object.defineProperty(exports, 'MessageParseError', {
461
580
  return MessageParseError;
462
581
  }
463
582
  });
583
+ Object.defineProperty(exports, 'OverconstrainedFallbackError', {
584
+ enumerable: true,
585
+ get: function () {
586
+ return OverconstrainedFallbackError;
587
+ }
588
+ });
589
+ Object.defineProperty(exports, 'PreflightError', {
590
+ enumerable: true,
591
+ get: function () {
592
+ return PreflightError;
593
+ }
594
+ });
464
595
  Object.defineProperty(exports, 'RPCTimeoutError', {
465
596
  enumerable: true,
466
597
  get: function () {
467
598
  return RPCTimeoutError;
468
599
  }
469
600
  });
601
+ Object.defineProperty(exports, 'RecoveryError', {
602
+ enumerable: true,
603
+ get: function () {
604
+ return RecoveryError;
605
+ }
606
+ });
470
607
  Object.defineProperty(exports, 'RequestError', {
471
608
  enumerable: true,
472
609
  get: function () {
@@ -503,6 +640,12 @@ Object.defineProperty(exports, 'StorageWriteError', {
503
640
  return StorageWriteError;
504
641
  }
505
642
  });
643
+ Object.defineProperty(exports, 'TokenRefreshError', {
644
+ enumerable: true,
645
+ get: function () {
646
+ return TokenRefreshError;
647
+ }
648
+ });
506
649
  Object.defineProperty(exports, 'TransportConnectionError', {
507
650
  enumerable: true,
508
651
  get: function () {
@@ -527,6 +670,12 @@ Object.defineProperty(exports, 'ValidationError', {
527
670
  return ValidationError;
528
671
  }
529
672
  });
673
+ Object.defineProperty(exports, 'VertoAttachHandlerError', {
674
+ enumerable: true,
675
+ get: function () {
676
+ return VertoAttachHandlerError;
677
+ }
678
+ });
530
679
  Object.defineProperty(exports, 'VertoInviteHandlerError', {
531
680
  enumerable: true,
532
681
  get: function () {
@@ -587,10 +736,28 @@ Object.defineProperty(exports, 'ifIsMap', {
587
736
  return ifIsMap;
588
737
  }
589
738
  });
739
+ Object.defineProperty(exports, 'setDebugOptions', {
740
+ enumerable: true,
741
+ get: function () {
742
+ return setDebugOptions;
743
+ }
744
+ });
745
+ Object.defineProperty(exports, 'setLogLevel', {
746
+ enumerable: true,
747
+ get: function () {
748
+ return setLogLevel;
749
+ }
750
+ });
751
+ Object.defineProperty(exports, 'setLogger', {
752
+ enumerable: true,
753
+ get: function () {
754
+ return setLogger;
755
+ }
756
+ });
590
757
  Object.defineProperty(exports, 'throwOnRPCError', {
591
758
  enumerable: true,
592
759
  get: function () {
593
760
  return throwOnRPCError;
594
761
  }
595
762
  });
596
- //# sourceMappingURL=operators-DT4UB24-.cjs.map
763
+ //# sourceMappingURL=operators-BT3jl--r.cjs.map