@signalwire/js 4.0.0-beta.10 → 4.0.0-beta.12
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.
- package/dist/browser.mjs +6004 -1063
- package/dist/browser.mjs.map +1 -1
- package/dist/browser.umd.js +6015 -1063
- package/dist/browser.umd.js.map +1 -1
- package/dist/index.cjs +5588 -743
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2024 -256
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +2023 -255
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +5568 -734
- package/dist/index.mjs.map +1 -1
- package/dist/operators/index.cjs +1 -1
- package/dist/operators/index.mjs +1 -1
- package/dist/{operators-uT_fb8ba.mjs → operators-CX_lCCJm.mjs} +118 -13
- package/dist/operators-CX_lCCJm.mjs.map +1 -0
- package/dist/{operators-mm21prWr.cjs → operators-D6a2J1KA.cjs} +177 -12
- package/dist/operators-D6a2J1KA.cjs.map +1 -0
- package/package.json +1 -1
- package/dist/operators-mm21prWr.cjs.map +0 -1
- package/dist/operators-uT_fb8ba.mjs.map +0 -1
package/dist/operators/index.cjs
CHANGED
package/dist/operators/index.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { a as filterNull, n as filterAs, r as ifIsMap, t as throwOnRPCError } from "../operators-
|
|
1
|
+
import { a as filterNull, n as filterAs, r as ifIsMap, t as throwOnRPCError } from "../operators-CX_lCCJm.mjs";
|
|
2
2
|
|
|
3
3
|
export { filterAs, filterNull, ifIsMap, throwOnRPCError };
|
|
@@ -163,6 +163,16 @@ var VertoInviteHandlerError = class extends Error {
|
|
|
163
163
|
this.name = "VertoInviteHandlerError";
|
|
164
164
|
}
|
|
165
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
|
+
};
|
|
166
176
|
var ValidationError = class extends Error {
|
|
167
177
|
constructor(message, options) {
|
|
168
178
|
super(message, options);
|
|
@@ -200,6 +210,64 @@ var MediaTrackError = class extends Error {
|
|
|
200
210
|
this.name = "MediaTrackError";
|
|
201
211
|
}
|
|
202
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
|
+
};
|
|
203
271
|
|
|
204
272
|
//#endregion
|
|
205
273
|
//#region src/utils/logger.ts
|
|
@@ -209,33 +277,70 @@ const originalFactory = defaultLogger.methodFactory;
|
|
|
209
277
|
defaultLogger.methodFactory = (methodName, logLevel, loggerName) => {
|
|
210
278
|
const rawMethod = originalFactory(methodName, logLevel, loggerName);
|
|
211
279
|
return function(...args) {
|
|
212
|
-
|
|
213
|
-
|
|
280
|
+
const prefixed = [
|
|
281
|
+
datetime(),
|
|
282
|
+
"-",
|
|
283
|
+
...args
|
|
284
|
+
];
|
|
285
|
+
rawMethod.apply(void 0, prefixed);
|
|
214
286
|
};
|
|
215
287
|
};
|
|
216
|
-
const defaultLoggerLevel = defaultLogger.levels.
|
|
288
|
+
const defaultLoggerLevel = defaultLogger.levels.WARN;
|
|
217
289
|
defaultLogger.setLevel(defaultLoggerLevel);
|
|
218
|
-
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
|
+
};
|
|
219
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
|
+
};
|
|
220
314
|
const getLoggerInstance = () => {
|
|
221
315
|
return userLogger ?? defaultLogger;
|
|
222
316
|
};
|
|
223
317
|
const shouldStringify = (payload) => {
|
|
224
|
-
if ("method" in payload
|
|
318
|
+
if (payload != null && typeof payload === "object" && "method" in payload) return payload.method !== "signalwire.ping";
|
|
225
319
|
return true;
|
|
226
320
|
};
|
|
227
|
-
const wsTraffic = (
|
|
228
|
-
const
|
|
229
|
-
const { logWsTraffic } = debugOptions ?? {};
|
|
321
|
+
const wsTraffic = (options) => {
|
|
322
|
+
const { logWsTraffic } = debugOptions;
|
|
230
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);
|
|
231
333
|
const msg = shouldStringify(payload) ? JSON.stringify(payload, null, 2) : payload;
|
|
232
|
-
|
|
334
|
+
loggerInstance.debug(`${options.type.toUpperCase()}: \n`, msg, "\n");
|
|
233
335
|
};
|
|
234
336
|
const getLogger = () => {
|
|
235
337
|
const logger$1 = getLoggerInstance();
|
|
236
|
-
return new Proxy(logger$1, { get(
|
|
338
|
+
return new Proxy(logger$1, { get(_target, prop, _receiver) {
|
|
237
339
|
if (prop === "wsTraffic") return wsTraffic;
|
|
238
|
-
|
|
340
|
+
const instance = getLoggerInstance();
|
|
341
|
+
const value = Reflect.get(instance, prop);
|
|
342
|
+
if (typeof value === "function") return value.bind(instance);
|
|
343
|
+
return value;
|
|
239
344
|
} });
|
|
240
345
|
};
|
|
241
346
|
|
|
@@ -369,5 +474,5 @@ function throwOnRPCError() {
|
|
|
369
474
|
}
|
|
370
475
|
|
|
371
476
|
//#endregion
|
|
372
|
-
export {
|
|
373
|
-
//# sourceMappingURL=operators-
|
|
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-CX_lCCJm.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operators-CX_lCCJm.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);\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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"}
|
|
@@ -191,6 +191,16 @@ var VertoInviteHandlerError = class extends Error {
|
|
|
191
191
|
this.name = "VertoInviteHandlerError";
|
|
192
192
|
}
|
|
193
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
|
+
};
|
|
194
204
|
var ValidationError = class extends Error {
|
|
195
205
|
constructor(message, options) {
|
|
196
206
|
super(message, options);
|
|
@@ -228,6 +238,64 @@ var MediaTrackError = class extends Error {
|
|
|
228
238
|
this.name = "MediaTrackError";
|
|
229
239
|
}
|
|
230
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
|
+
};
|
|
231
299
|
|
|
232
300
|
//#endregion
|
|
233
301
|
//#region src/utils/logger.ts
|
|
@@ -237,33 +305,70 @@ const originalFactory = defaultLogger.methodFactory;
|
|
|
237
305
|
defaultLogger.methodFactory = (methodName, logLevel, loggerName) => {
|
|
238
306
|
const rawMethod = originalFactory(methodName, logLevel, loggerName);
|
|
239
307
|
return function(...args) {
|
|
240
|
-
|
|
241
|
-
|
|
308
|
+
const prefixed = [
|
|
309
|
+
datetime(),
|
|
310
|
+
"-",
|
|
311
|
+
...args
|
|
312
|
+
];
|
|
313
|
+
rawMethod.apply(void 0, prefixed);
|
|
242
314
|
};
|
|
243
315
|
};
|
|
244
|
-
const defaultLoggerLevel = defaultLogger.levels.
|
|
316
|
+
const defaultLoggerLevel = defaultLogger.levels.WARN;
|
|
245
317
|
defaultLogger.setLevel(defaultLoggerLevel);
|
|
246
|
-
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
|
+
};
|
|
247
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
|
+
};
|
|
248
342
|
const getLoggerInstance = () => {
|
|
249
343
|
return userLogger ?? defaultLogger;
|
|
250
344
|
};
|
|
251
345
|
const shouldStringify = (payload) => {
|
|
252
|
-
if ("method" in payload
|
|
346
|
+
if (payload != null && typeof payload === "object" && "method" in payload) return payload.method !== "signalwire.ping";
|
|
253
347
|
return true;
|
|
254
348
|
};
|
|
255
|
-
const wsTraffic = (
|
|
256
|
-
const
|
|
257
|
-
const { logWsTraffic } = debugOptions ?? {};
|
|
349
|
+
const wsTraffic = (options) => {
|
|
350
|
+
const { logWsTraffic } = debugOptions;
|
|
258
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);
|
|
259
361
|
const msg = shouldStringify(payload) ? JSON.stringify(payload, null, 2) : payload;
|
|
260
|
-
|
|
362
|
+
loggerInstance.debug(`${options.type.toUpperCase()}: \n`, msg, "\n");
|
|
261
363
|
};
|
|
262
364
|
const getLogger = () => {
|
|
263
365
|
const logger$1 = getLoggerInstance();
|
|
264
|
-
return new Proxy(logger$1, { get(
|
|
366
|
+
return new Proxy(logger$1, { get(_target, prop, _receiver) {
|
|
265
367
|
if (prop === "wsTraffic") return wsTraffic;
|
|
266
|
-
|
|
368
|
+
const instance = getLoggerInstance();
|
|
369
|
+
const value = Reflect.get(instance, prop);
|
|
370
|
+
if (typeof value === "function") return value.bind(instance);
|
|
371
|
+
return value;
|
|
267
372
|
} });
|
|
268
373
|
};
|
|
269
374
|
|
|
@@ -421,6 +526,12 @@ Object.defineProperty(exports, 'ConversationError', {
|
|
|
421
526
|
return ConversationError;
|
|
422
527
|
}
|
|
423
528
|
});
|
|
529
|
+
Object.defineProperty(exports, 'DPoPInitError', {
|
|
530
|
+
enumerable: true,
|
|
531
|
+
get: function () {
|
|
532
|
+
return DPoPInitError;
|
|
533
|
+
}
|
|
534
|
+
});
|
|
424
535
|
Object.defineProperty(exports, 'DependencyError', {
|
|
425
536
|
enumerable: true,
|
|
426
537
|
get: function () {
|
|
@@ -433,6 +544,12 @@ Object.defineProperty(exports, 'DeserializationError', {
|
|
|
433
544
|
return DeserializationError;
|
|
434
545
|
}
|
|
435
546
|
});
|
|
547
|
+
Object.defineProperty(exports, 'DeviceTokenError', {
|
|
548
|
+
enumerable: true,
|
|
549
|
+
get: function () {
|
|
550
|
+
return DeviceTokenError;
|
|
551
|
+
}
|
|
552
|
+
});
|
|
436
553
|
Object.defineProperty(exports, 'InvalidCredentialsError', {
|
|
437
554
|
enumerable: true,
|
|
438
555
|
get: function () {
|
|
@@ -463,12 +580,30 @@ Object.defineProperty(exports, 'MessageParseError', {
|
|
|
463
580
|
return MessageParseError;
|
|
464
581
|
}
|
|
465
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
|
+
});
|
|
466
595
|
Object.defineProperty(exports, 'RPCTimeoutError', {
|
|
467
596
|
enumerable: true,
|
|
468
597
|
get: function () {
|
|
469
598
|
return RPCTimeoutError;
|
|
470
599
|
}
|
|
471
600
|
});
|
|
601
|
+
Object.defineProperty(exports, 'RecoveryError', {
|
|
602
|
+
enumerable: true,
|
|
603
|
+
get: function () {
|
|
604
|
+
return RecoveryError;
|
|
605
|
+
}
|
|
606
|
+
});
|
|
472
607
|
Object.defineProperty(exports, 'RequestError', {
|
|
473
608
|
enumerable: true,
|
|
474
609
|
get: function () {
|
|
@@ -505,6 +640,12 @@ Object.defineProperty(exports, 'StorageWriteError', {
|
|
|
505
640
|
return StorageWriteError;
|
|
506
641
|
}
|
|
507
642
|
});
|
|
643
|
+
Object.defineProperty(exports, 'TokenRefreshError', {
|
|
644
|
+
enumerable: true,
|
|
645
|
+
get: function () {
|
|
646
|
+
return TokenRefreshError;
|
|
647
|
+
}
|
|
648
|
+
});
|
|
508
649
|
Object.defineProperty(exports, 'TransportConnectionError', {
|
|
509
650
|
enumerable: true,
|
|
510
651
|
get: function () {
|
|
@@ -529,6 +670,12 @@ Object.defineProperty(exports, 'ValidationError', {
|
|
|
529
670
|
return ValidationError;
|
|
530
671
|
}
|
|
531
672
|
});
|
|
673
|
+
Object.defineProperty(exports, 'VertoAttachHandlerError', {
|
|
674
|
+
enumerable: true,
|
|
675
|
+
get: function () {
|
|
676
|
+
return VertoAttachHandlerError;
|
|
677
|
+
}
|
|
678
|
+
});
|
|
532
679
|
Object.defineProperty(exports, 'VertoInviteHandlerError', {
|
|
533
680
|
enumerable: true,
|
|
534
681
|
get: function () {
|
|
@@ -589,10 +736,28 @@ Object.defineProperty(exports, 'ifIsMap', {
|
|
|
589
736
|
return ifIsMap;
|
|
590
737
|
}
|
|
591
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
|
+
});
|
|
592
757
|
Object.defineProperty(exports, 'throwOnRPCError', {
|
|
593
758
|
enumerable: true,
|
|
594
759
|
get: function () {
|
|
595
760
|
return throwOnRPCError;
|
|
596
761
|
}
|
|
597
762
|
});
|
|
598
|
-
//# sourceMappingURL=operators-
|
|
763
|
+
//# sourceMappingURL=operators-D6a2J1KA.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operators-D6a2J1KA.cjs","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","log","userLogger: SDKLogger | null","logger","debugOptions: DebugOptions","wsTraffic: InternalSDKLogger['wsTraffic']","payload: unknown","value: unknown"],"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);\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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"}
|