react-jssip-kit 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/LICENSE +21 -0
- package/README.md +75 -0
- package/dist/index.cjs +1377 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +318 -0
- package/dist/index.d.ts +318 -0
- package/dist/index.js +1355 -0
- package/dist/index.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/jssip-lib/sip/userAgent.ts","../src/jssip-lib/core/types.ts","../src/jssip-lib/core/eventEmitter.ts","../src/jssip-lib/core/sipErrorHandler.ts","../src/jssip-lib/core/sipState.ts","../src/jssip-lib/core/sipStateStore.ts","../src/jssip-lib/sip/handlers/uaHandlers.ts","../src/jssip-lib/sip/handlers/sessionHandlers.ts","../src/jssip-lib/sip/sessionController.ts","../src/jssip-lib/sip/sessionManager.ts","../src/jssip-lib/sip/sessionState.ts","../src/jssip-lib/sip/sessionLifecycle.ts","../src/jssip-lib/sip/client.ts","../src/jssip-lib/index.ts","../src/context/index.tsx","../src/hooks/useSipState.ts","../src/hooks/useSip.ts","../src/hooks/useSipActions.ts","../src/hooks/useSipSessions.ts","../src/hooks/useSipEvent.ts","../src/components/call-player.tsx","../src/jssip-lib/adapters/dom/createCallPlayer.ts","../src/provider/index.tsx"],"names":["message","useEffect","useMemo","jsx"],"mappings":"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","sourcesContent":["import JsSIP, { UA } from \"jssip\";\r\nimport type { UAConfiguration } from \"jssip/lib/UA\";\r\nimport type { SipConfiguration } from \"./types\";\r\n\r\ntype StartOpts = { debug?: boolean | string };\r\n\r\nexport class SipUserAgent {\r\n private _ua: UA | null = null;\r\n\r\n public get ua(): UA | null {\r\n return this._ua;\r\n }\r\n public get isStarted(): boolean {\r\n return !!this._ua;\r\n }\r\n public get isRegistered(): boolean {\r\n return !!this._ua?.isRegistered();\r\n }\r\n\r\n public start(\r\n uri: string,\r\n password: string,\r\n config: Omit<SipConfiguration, \"debug\">,\r\n opts?: StartOpts\r\n ): UA {\r\n this.stop();\r\n const uaCfg = this.buildUAConfig(config, uri, password);\r\n this.ensureValid(uaCfg);\r\n this.applyDebug(opts?.debug);\r\n const ua = this.createUA(uaCfg);\r\n ua.start();\r\n this._ua = ua;\r\n return ua;\r\n }\r\n\r\n public register(): void {\r\n const ua = this.getUA();\r\n if (!ua?.isRegistered()) ua?.register();\r\n }\r\n\r\n public stop(): void {\r\n const ua = this._ua;\r\n if (!ua) return;\r\n try {\r\n if (ua.isRegistered()) ua.unregister();\r\n ua.stop();\r\n } finally {\r\n this._ua = null;\r\n }\r\n }\r\n\r\n public getUA(): UA | null {\r\n return this._ua;\r\n }\r\n\r\n public setDebug(debug?: boolean | string): void {\r\n this.applyDebug(debug);\r\n }\r\n\r\n protected buildUAConfig(\r\n config: Omit<SipConfiguration, \"debug\">,\r\n uri: string,\r\n password: string\r\n ): UAConfiguration {\r\n return { ...(config as UAConfiguration), uri, password };\r\n }\r\n\r\n protected ensureValid(cfg: UAConfiguration): void {\r\n const sockets = cfg.sockets as UAConfiguration[\"sockets\"];\r\n if (\r\n !cfg.uri ||\r\n !cfg.password ||\r\n !sockets ||\r\n (Array.isArray(sockets) && sockets.length === 0)\r\n ) {\r\n throw new Error(\r\n \"Invalid SIP connect args: require uri, password, and at least one socket\"\r\n );\r\n }\r\n }\r\n\r\n protected applyDebug(debug?: boolean | string): void {\r\n const enabled = debug === undefined ? this.readSessionFlag() : !!debug;\r\n const pattern = typeof debug === \"string\" ? debug : \"JsSIP:*\";\r\n\r\n if (enabled) {\r\n JsSIP.debug.enable(pattern);\r\n const dbg: any = (JsSIP as any).debug;\r\n if (dbg?.setLogger) dbg.setLogger(console);\r\n else if (dbg) dbg.logger = console;\r\n this.persistSessionFlag();\r\n } else {\r\n (JsSIP.debug as any)?.disable?.();\r\n this.clearSessionFlag();\r\n }\r\n }\r\n\r\n protected createUA(cfg: UAConfiguration): UA {\r\n return new JsSIP.UA(cfg);\r\n }\r\n\r\n private readSessionFlag(): boolean {\r\n try {\r\n if (typeof window === \"undefined\") return false;\r\n return window.sessionStorage.getItem(\"sip-debug-enabled\") === \"true\";\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private persistSessionFlag(): void {\r\n try {\r\n if (typeof window !== \"undefined\") {\r\n window.sessionStorage.setItem(\"sip-debug-enabled\", \"true\");\r\n }\r\n } catch {\r\n /* ignore */\r\n }\r\n }\r\n\r\n private clearSessionFlag(): void {\r\n try {\r\n if (typeof window !== \"undefined\") {\r\n window.sessionStorage.removeItem(\"sip-debug-enabled\");\r\n }\r\n } catch {\r\n /* ignore */\r\n }\r\n }\r\n}\r\n","export const SipStatus = {\r\n Disconnected: \"disconnected\",\r\n Connecting: \"connecting\",\r\n Connected: \"connected\",\r\n Registered: \"registered\",\r\n Unregistered: \"unregistered\",\r\n RegistrationFailed: \"registrationFailed\",\r\n} as const;\r\nexport type SipStatus = typeof SipStatus[keyof typeof SipStatus];\r\n\r\nexport const CallStatus = {\r\n Idle: \"idle\",\r\n Dialing: \"dialing\",\r\n Ringing: \"ringing\",\r\n Active: \"active\",\r\n Hold: \"hold\",\r\n} as const;\r\nexport type CallStatus = typeof CallStatus[keyof typeof CallStatus];\r\n\r\nexport const CallDirection = {\r\n Incoming: \"incoming\",\r\n Outgoing: \"outgoing\",\r\n None: \"none\",\r\n} as const;\r\nexport type CallDirection = typeof CallDirection[keyof typeof CallDirection];\r\n\r\nexport type SipSessionState = {\r\n id: string;\r\n status: CallStatus;\r\n direction: CallDirection;\r\n from: string | null;\r\n to: string | null;\r\n muted: boolean;\r\n acceptedAt: number | null;\r\n mediaKind: \"audio\" | \"video\";\r\n remoteVideoEnabled: boolean;\r\n};\r\n\r\nexport interface SipState {\r\n sipStatus: SipStatus;\r\n error: string | null;\r\n sessions: SipSessionState[];\r\n}\r\n\r\nexport const SipStatusList = Object.values(SipStatus);\r\nexport const CallStatusList = Object.values(CallStatus);\r\nexport const CallDirectionList = Object.values(CallDirection);\r\n\r\nexport function isSipStatus(v: unknown): v is SipStatus {\r\n return typeof v === \"string\" && (SipStatusList as readonly string[]).includes(v);\r\n}\r\nexport function isCallStatus(v: unknown): v is CallStatus {\r\n return typeof v === \"string\" && (CallStatusList as readonly string[]).includes(v);\r\n}\r\nexport function isCallDirection(v: unknown): v is CallDirection {\r\n return typeof v === \"string\" && (CallDirectionList as readonly string[]).includes(v);\r\n}\r\n\r\nexport type Unsubscribe = () => void;\r\nexport type Listener<T> = (value: T) => void;\r\n","export type Listener<T = any> = (payload: T) => void;\r\n\r\nexport class EventTargetEmitter<Events extends Record<string, any> = any> {\r\n private target = new EventTarget();\r\n\r\n on<K extends keyof Events>(event: K, fn: Listener<Events[K]>): () => void {\r\n const wrapper = (e: Event) => fn((e as CustomEvent<Events[K]>).detail);\r\n this.target.addEventListener(event as string, wrapper);\r\n return () => this.target.removeEventListener(event as string, wrapper);\r\n }\r\n\r\n emit<K extends keyof Events>(event: K, payload?: Events[K]): void {\r\n this.target.dispatchEvent(\r\n new CustomEvent(event as string, { detail: payload })\r\n );\r\n }\r\n}\r\n","export interface SipErrorPayload {\r\n cause: string;\r\n code?: string;\r\n raw?: any;\r\n message?: string;\r\n}\r\n\r\nexport interface SipErrorFormatInput {\r\n raw: any;\r\n code?: string;\r\n fallback?: string;\r\n}\r\n\r\nexport type SipErrorFormatter = (\r\n input: SipErrorFormatInput\r\n) => SipErrorPayload | undefined;\r\n\r\ntype SipErrorHandlerOptions = {\r\n formatter?: SipErrorFormatter;\r\n messages?: Record<string, string>;\r\n};\r\n\r\nexport class SipErrorHandler {\r\n private readonly formatter?: SipErrorFormatter;\r\n private readonly messages?: Record<string, string>;\r\n\r\n constructor(options: SipErrorHandlerOptions = {}) {\r\n this.formatter = options.formatter;\r\n this.messages = options.messages;\r\n }\r\n\r\n format(input: SipErrorFormatInput): SipErrorPayload {\r\n const { code, raw, fallback } = input;\r\n const mappedMessage =\r\n code && this.messages ? this.messages[code] : undefined;\r\n\r\n // Allow consumer to fully customize formatting.\r\n if (this.formatter) {\r\n const custom = this.formatter({\r\n raw,\r\n code,\r\n fallback: mappedMessage ?? fallback,\r\n });\r\n const message =\r\n custom?.message ??\r\n custom?.cause ??\r\n mappedMessage ??\r\n fallback ??\r\n this.readRawMessage(raw) ??\r\n \"unknown error\";\r\n\r\n return {\r\n cause: custom?.cause ?? message,\r\n code: custom?.code ?? code,\r\n raw: custom?.raw ?? raw,\r\n message,\r\n };\r\n }\r\n\r\n const message =\r\n mappedMessage ?? this.readRawMessage(raw) ?? fallback ?? \"unknown error\";\r\n\r\n return {\r\n cause: message,\r\n code,\r\n raw,\r\n message,\r\n };\r\n }\r\n\r\n private readRawMessage(raw: any): string | undefined {\r\n if (raw == null) return undefined;\r\n if (typeof raw === \"string\") return raw;\r\n if (typeof raw?.cause === \"string\") return raw.cause;\r\n if (typeof raw?.message === \"string\") return raw.message;\r\n return undefined;\r\n }\r\n}\r\n","import { SipState, SipStatus } from \"./types\";\r\n\r\nexport function getInitialSipState(): SipState {\r\n return {\r\n sipStatus: SipStatus.Disconnected,\r\n error: null,\r\n sessions: [],\r\n };\r\n}\r\n\r\nexport function shallowEqual(objA: any, objB: any): boolean {\r\n if (objA === objB) return true;\r\n if (!objA || !objB) return false;\r\n const keysA = Object.keys(objA);\r\n const keysB = Object.keys(objB);\r\n if (keysA.length !== keysB.length) return false;\r\n for (const key of keysA) {\r\n if (objA[key] !== objB[key]) return false;\r\n }\r\n return true;\r\n}\r\n","import { SipState } from \"./types\";\r\nimport { getInitialSipState, shallowEqual } from \"./sipState\";\r\n\r\nexport type SipStateListener = (state: SipState) => void;\r\n\r\nexport class SipStateStore {\r\n private state: SipState = getInitialSipState();\r\n private lastState: SipState = getInitialSipState();\r\n private listeners = new Set<SipStateListener>();\r\n private pendingState: Partial<SipState> | null = null;\r\n private updateScheduled = false;\r\n\r\n getState(): SipState {\r\n return this.state;\r\n }\r\n\r\n onChange(fn: SipStateListener): () => void {\r\n this.listeners.add(fn);\r\n fn(this.state);\r\n return () => this.listeners.delete(fn);\r\n }\r\n\r\n subscribe(fn: SipStateListener): () => void {\r\n return this.onChange(fn);\r\n }\r\n\r\n setState(partial: Partial<SipState>) {\r\n if (!partial || Object.keys(partial).length === 0) return;\r\n const next = { ...this.state, ...partial };\r\n // Fast-path: if sessions reference unchanged and shallow contents equal, skip emit.\r\n if (next.sessions === this.lastState.sessions && shallowEqual(this.lastState, next)) {\r\n return;\r\n }\r\n this.state = next;\r\n this.lastState = next;\r\n this.emit();\r\n }\r\n\r\n batchSet(partial: Partial<SipState>) {\r\n this.pendingState = { ...this.pendingState, ...partial };\r\n if (!this.updateScheduled) {\r\n this.updateScheduled = true;\r\n queueMicrotask(() => {\r\n if (this.pendingState) this.setState(this.pendingState);\r\n this.pendingState = null;\r\n this.updateScheduled = false;\r\n });\r\n }\r\n }\r\n\r\n reset(overrides: Partial<SipState> = {}) {\r\n this.setState({ ...getInitialSipState(), ...overrides });\r\n }\r\n\r\n private emit() {\r\n for (const fn of this.listeners) fn(this.state);\r\n }\r\n}\r\n","import { UAEventMap } from \"../types\";\r\nimport { SipStatus } from \"../../core/types\";\r\nimport { SipStateStore } from \"../../core/sipStateStore\";\r\nimport { JsSIPEventMap } from \"../types\";\r\nimport { EventTargetEmitter } from \"../../core/eventEmitter\";\r\nimport { SipErrorPayload } from \"../../core/sipErrorHandler\";\r\n\r\ntype Deps = {\r\n emitter: EventTargetEmitter<JsSIPEventMap>;\r\n state: SipStateStore;\r\n cleanupAllSessions: () => void;\r\n emitError: (\r\n raw: any,\r\n code?: string,\r\n fallback?: string\r\n ) => SipErrorPayload;\r\n onNewRTCSession: UAEventMap[\"newRTCSession\"];\r\n};\r\n\r\nexport function createUAHandlers(deps: Deps): Partial<UAEventMap> {\r\n const { emitter, state, cleanupAllSessions, emitError, onNewRTCSession } =\r\n deps;\r\n\r\n return {\r\n connecting: (e: any) => {\r\n emitter.emit(\"connecting\", e);\r\n state.batchSet({ sipStatus: SipStatus.Connecting });\r\n },\r\n connected: (e: any) => {\r\n emitter.emit(\"connected\", e);\r\n state.batchSet({ sipStatus: SipStatus.Connected });\r\n },\r\n disconnected: (e: any) => {\r\n emitter.emit(\"disconnected\", e);\r\n cleanupAllSessions();\r\n state.reset();\r\n },\r\n\r\n registered: (e: any) => {\r\n emitter.emit(\"registered\", e);\r\n state.batchSet({ sipStatus: SipStatus.Registered, error: null });\r\n },\r\n unregistered: (e: any) => {\r\n emitter.emit(\"unregistered\", e);\r\n state.batchSet({ sipStatus: SipStatus.Unregistered });\r\n },\r\n registrationFailed: (e: any) => {\r\n emitter.emit(\"registrationFailed\", e);\r\n cleanupAllSessions();\r\n emitError(\r\n {\r\n raw: e,\r\n cause: e?.cause,\r\n statusCode: e?.response?.status_code,\r\n statusText: e?.response?.reason_phrase,\r\n },\r\n \"REGISTRATION_FAILED\",\r\n \"registration failed\"\r\n );\r\n state.batchSet({\r\n sipStatus: SipStatus.RegistrationFailed,\r\n error: e?.cause || \"registration failed\",\r\n });\r\n },\r\n newRTCSession: onNewRTCSession,\r\n newMessage: (e: any) => emitter.emit(\"newMessage\", e),\r\n sipEvent: (e: any) => emitter.emit(\"sipEvent\", e),\r\n newOptions: (e: any) => emitter.emit(\"newOptions\", e),\r\n };\r\n}\r\n","import { EndEvent, RTCSessionEventMap } from \"../types\";\r\nimport { CallStatus } from \"../../core/types\";\r\nimport { SipStateStore } from \"../../core/sipStateStore\";\r\nimport { WebRTCSessionController } from \"../sessionController\";\r\nimport { JsSIPEventMap } from \"../types\";\r\nimport { EventTargetEmitter } from \"../../core/eventEmitter\";\r\nimport { SipErrorPayload } from \"../../core/sipErrorHandler\";\r\n\r\ntype Deps = {\r\n emitter: EventTargetEmitter<JsSIPEventMap>;\r\n state: SipStateStore;\r\n rtc: WebRTCSessionController;\r\n detachSessionHandlers: () => void;\r\n emitError: (\r\n raw: any,\r\n code?: string,\r\n fallback?: string\r\n ) => SipErrorPayload;\r\n onSessionFailed: (error?: string, event?: any) => void;\r\n sessionId: string;\r\n};\r\n\r\nexport function createSessionHandlers(deps: Deps): Partial<RTCSessionEventMap> {\r\n const {\r\n emitter,\r\n state,\r\n rtc,\r\n detachSessionHandlers,\r\n onSessionFailed,\r\n sessionId,\r\n } = deps;\r\n\r\n return {\r\n progress: (e: any) => {\r\n emitter.emit(\"progress\", { sessionId, data: e });\r\n state.batchSet({\r\n sessions: state.getState().sessions.map((s) =>\r\n s.id === sessionId ? { ...s, status: CallStatus.Ringing } : s\r\n ),\r\n });\r\n },\r\n accepted: (e: any) => {\r\n emitter.emit(\"accepted\", { sessionId, data: e });\r\n state.batchSet({\r\n sessions: state.getState().sessions.map((s) =>\r\n s.id === sessionId\r\n ? {\r\n ...s,\r\n status: CallStatus.Active,\r\n acceptedAt: s.acceptedAt ?? Date.now(),\r\n }\r\n : s\r\n ),\r\n });\r\n },\r\n confirmed: (e: any) => emitter.emit(\"confirmed\", { sessionId, data: e }),\r\n\r\n ended: (e: any) => {\r\n emitter.emit(\"ended\", { sessionId, data: e });\r\n detachSessionHandlers();\r\n rtc.cleanup();\r\n const nextSessions = state\r\n .getState()\r\n .sessions.filter((s) => s.id !== sessionId);\r\n state.batchSet({\r\n sessions: nextSessions,\r\n });\r\n },\r\n failed: (e: EndEvent) => {\r\n emitter.emit(\"failed\", { sessionId, data: e });\r\n detachSessionHandlers();\r\n rtc.cleanup();\r\n const cause = e?.cause || \"call failed\";\r\n onSessionFailed(cause, e);\r\n const nextSessions = state\r\n .getState()\r\n .sessions.filter((s) => s.id !== sessionId);\r\n state.batchSet({\r\n sessions: nextSessions,\r\n });\r\n },\r\n\r\n muted: () => {\r\n emitter.emit(\"muted\", { sessionId, data: undefined });\r\n state.batchSet({\r\n sessions: state.getState().sessions.map((s) =>\r\n s.id === sessionId ? { ...s, muted: true } : s\r\n ),\r\n });\r\n },\r\n unmuted: () => {\r\n emitter.emit(\"unmuted\", { sessionId, data: undefined });\r\n state.batchSet({\r\n sessions: state.getState().sessions.map((s) =>\r\n s.id === sessionId ? { ...s, muted: false } : s\r\n ),\r\n });\r\n },\r\n hold: () => {\r\n emitter.emit(\"hold\", { sessionId, data: undefined as any });\r\n state.batchSet({\r\n sessions: state.getState().sessions.map((s) =>\r\n s.id === sessionId ? { ...s, status: CallStatus.Hold } : s\r\n ),\r\n });\r\n },\r\n unhold: () => {\r\n emitter.emit(\"unhold\", { sessionId, data: undefined as any });\r\n state.batchSet({\r\n sessions: state.getState().sessions.map((s) =>\r\n s.id === sessionId ? { ...s, status: CallStatus.Active } : s\r\n ),\r\n });\r\n },\r\n\r\n reinvite: (e: any) => emitter.emit(\"reinvite\", { sessionId, data: e }),\r\n update: (e: any) => emitter.emit(\"update\", { sessionId, data: e }),\r\n sdp: (e: any) => emitter.emit(\"sdp\", { sessionId, data: e }),\r\n icecandidate: (e: any) => emitter.emit(\"icecandidate\", { sessionId, data: e }),\r\n refer: (e: any) => emitter.emit(\"refer\", { sessionId, data: e }),\r\n replaces: (e: any) => emitter.emit(\"replaces\", { sessionId, data: e }),\r\n newDTMF: (e: any) => emitter.emit(\"newDTMF\", { sessionId, data: e }),\r\n newInfo: (e: any) => emitter.emit(\"newInfo\", { sessionId, data: e }),\r\n\r\n getusermediafailed: (e: any) => {\r\n emitter.emit(\"getusermediafailed\", { sessionId, data: e });\r\n detachSessionHandlers();\r\n rtc.cleanup();\r\n onSessionFailed(\"getUserMedia failed\", e);\r\n state.batchSet({\r\n sessions: state\r\n .getState()\r\n .sessions.filter((s) => s.id !== sessionId),\r\n });\r\n },\r\n \"peerconnection:createofferfailed\": (e: any) => {\r\n emitter.emit(\"peerconnection:createofferfailed\", { sessionId, data: e });\r\n detachSessionHandlers();\r\n rtc.cleanup();\r\n onSessionFailed(\"peer connection createOffer failed\", e);\r\n state.batchSet({\r\n sessions: state\r\n .getState()\r\n .sessions.filter((s) => s.id !== sessionId),\r\n });\r\n },\r\n \"peerconnection:createanswerfailed\": (e: any) => {\r\n emitter.emit(\"peerconnection:createanswerfailed\", { sessionId, data: e });\r\n detachSessionHandlers();\r\n rtc.cleanup();\r\n onSessionFailed(\"peer connection createAnswer failed\", e);\r\n state.batchSet({\r\n sessions: state\r\n .getState()\r\n .sessions.filter((s) => s.id !== sessionId),\r\n });\r\n },\r\n \"peerconnection:setlocaldescriptionfailed\": (e: any) => {\r\n emitter.emit(\"peerconnection:setlocaldescriptionfailed\", { sessionId, data: e });\r\n detachSessionHandlers();\r\n rtc.cleanup();\r\n onSessionFailed(\"peer connection setLocalDescription failed\", e);\r\n state.batchSet({\r\n sessions: state\r\n .getState()\r\n .sessions.filter((s) => s.id !== sessionId),\r\n });\r\n },\r\n \"peerconnection:setremotedescriptionfailed\": (e: any) => {\r\n emitter.emit(\"peerconnection:setremotedescriptionfailed\", { sessionId, data: e });\r\n detachSessionHandlers();\r\n rtc.cleanup();\r\n onSessionFailed(\"peer connection setRemoteDescription failed\", e);\r\n state.batchSet({\r\n sessions: state\r\n .getState()\r\n .sessions.filter((s) => s.id !== sessionId),\r\n });\r\n },\r\n peerconnection: (e: any) => emitter.emit(\"peerconnection\", { sessionId, data: e }),\r\n };\r\n}\r\n","import type {\r\n RTCSession,\r\n TerminateOptions,\r\n AnswerOptions,\r\n DTFMOptions,\r\n ReferOptions,\r\n} from \"jssip/lib/RTCSession\";\r\n\r\nexport class WebRTCSessionController {\r\n currentSession: RTCSession | null = null;\r\n mediaStream: MediaStream | null = null;\r\n\r\n public setSession(session: RTCSession | null) {\r\n this.currentSession = session;\r\n }\r\n\r\n public setMediaStream(stream: MediaStream) {\r\n this.mediaStream = stream;\r\n }\r\n\r\n private getPC(): RTCPeerConnection | null {\r\n return (this.currentSession as any)?.connection ?? null;\r\n }\r\n\r\n public cleanup(stopTracks: boolean = true): void {\r\n const pc = this.getPC();\r\n\r\n if (pc && typeof pc.getSenders === \"function\") {\r\n const isClosed =\r\n pc.connectionState === \"closed\" || pc.signalingState === \"closed\";\r\n if (!isClosed) {\r\n for (const s of pc.getSenders()) {\r\n try {\r\n s.replaceTrack(null);\r\n } catch {\r\n // ignore if sender/pc already closed\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (stopTracks && this.mediaStream) {\r\n for (const t of this.mediaStream.getTracks()) t.stop();\r\n }\r\n\r\n this.mediaStream = null;\r\n this.currentSession = null;\r\n }\r\n\r\n public answer(options: AnswerOptions = {}): boolean {\r\n return this.currentSession\r\n ? (this.currentSession.answer(options), true)\r\n : false;\r\n }\r\n\r\n public hangup(options?: TerminateOptions): boolean {\r\n return this.currentSession\r\n ? (this.currentSession.terminate(\r\n options ?? ({ status_code: 486, reason_phrase: \"Busy Here\" } as any)\r\n ),\r\n true)\r\n : false;\r\n }\r\n\r\n public mute(): boolean {\r\n this.mediaStream?.getAudioTracks().forEach((t) => (t.enabled = false));\r\n return this.currentSession\r\n ? (this.currentSession.mute({ audio: true }), true)\r\n : false;\r\n }\r\n\r\n public unmute(): boolean {\r\n this.mediaStream?.getAudioTracks().forEach((t) => (t.enabled = true));\r\n return this.currentSession\r\n ? (this.currentSession.unmute({ audio: true }), true)\r\n : false;\r\n }\r\n\r\n public hold(): boolean {\r\n return this.currentSession ? (this.currentSession.hold(), true) : false;\r\n }\r\n\r\n public unhold(): boolean {\r\n return this.currentSession ? (this.currentSession.unhold(), true) : false;\r\n }\r\n\r\n public sendDTMF(tones: string | number, options?: DTFMOptions): boolean {\r\n return this.currentSession\r\n ? (this.currentSession.sendDTMF(tones, options), true)\r\n : false;\r\n }\r\n\r\n public transfer(\r\n target: string | RTCSession,\r\n options?: ReferOptions\r\n ): boolean {\r\n return this.currentSession\r\n ? (this.currentSession.refer(target as any, options), true)\r\n : false;\r\n }\r\n\r\n public attendedTransfer(otherSession: RTCSession): boolean {\r\n return this.currentSession\r\n ? (this.currentSession.refer(otherSession as any), true)\r\n : false;\r\n }\r\n\r\n public enableVideo(): void {\r\n this.mediaStream?.getVideoTracks().forEach((t) => (t.enabled = true));\r\n }\r\n\r\n public disableVideo(): void {\r\n this.mediaStream?.getVideoTracks().forEach((t) => (t.enabled = false));\r\n }\r\n\r\n public async switchCamera(\r\n nextVideoTrack: MediaStreamTrack\r\n ): Promise<boolean> {\r\n const pc = this.getPC();\r\n if (!pc) return false;\r\n\r\n if (!this.mediaStream) this.mediaStream = new MediaStream();\r\n\r\n const old = this.mediaStream.getVideoTracks()[0];\r\n this.mediaStream.addTrack(nextVideoTrack);\r\n if (old) this.mediaStream.removeTrack(old);\r\n\r\n const sender = pc.getSenders?.().find((s) => s.track?.kind === \"video\");\r\n if (sender) await sender.replaceTrack(nextVideoTrack);\r\n\r\n if (old && old !== nextVideoTrack) old.stop();\r\n\r\n return true;\r\n }\r\n\r\n public async startScreenShare(\r\n getDisplayMedia: () => Promise<MediaStream>\r\n ): Promise<boolean> {\r\n const display = await getDisplayMedia();\r\n const screen = display.getVideoTracks()[0];\r\n return screen ? this.switchCamera(screen) : false;\r\n }\r\n}\r\n","import { WebRTCSessionController } from \"./sessionController\";\r\nimport type { RTCSession } from \"./types\";\r\n\r\ntype SessionEntry = {\r\n rtc: WebRTCSessionController;\r\n session?: RTCSession | null;\r\n media?: MediaStream | null;\r\n};\r\n\r\nexport class SessionManager {\r\n private entries = new Map<string, SessionEntry>();\r\n private pendingMediaQueue: Array<{ stream: MediaStream; addedAt: number }> = [];\r\n private pendingMediaTtlMs = 30000;\r\n\r\n setPendingMediaTtl(ms: number | undefined) {\r\n if (typeof ms === \"number\" && ms > 0) this.pendingMediaTtlMs = ms;\r\n }\r\n\r\n enqueueOutgoingMedia(stream: MediaStream) {\r\n this.pendingMediaQueue.push({ stream, addedAt: Date.now() });\r\n }\r\n\r\n dequeueOutgoingMedia(): MediaStream | null {\r\n const now = Date.now();\r\n while (this.pendingMediaQueue.length) {\r\n const next = this.pendingMediaQueue.shift();\r\n if (!next) break;\r\n if (now - next.addedAt <= this.pendingMediaTtlMs) {\r\n return next.stream;\r\n } else {\r\n // drop stale stream\r\n next.stream.getTracks().forEach((t) => t.stop());\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n getOrCreateRtc(sessionId: string, session?: RTCSession) {\r\n let entry = this.entries.get(sessionId);\r\n if (!entry) {\r\n entry = { rtc: new WebRTCSessionController(), session: null, media: null };\r\n this.entries.set(sessionId, entry);\r\n }\r\n if (session) {\r\n entry.session = session;\r\n entry.rtc.setSession(session);\r\n }\r\n if (entry.media) entry.rtc.setMediaStream(entry.media);\r\n return entry.rtc;\r\n }\r\n\r\n getRtc(sessionId: string) {\r\n return this.entries.get(sessionId)?.rtc ?? null;\r\n }\r\n\r\n setSession(sessionId: string, session: RTCSession) {\r\n const entry = this.entries.get(sessionId);\r\n if (entry) {\r\n entry.session = session;\r\n entry.rtc.setSession(session);\r\n } else {\r\n this.entries.set(sessionId, {\r\n rtc: new WebRTCSessionController(),\r\n session,\r\n media: null,\r\n });\r\n }\r\n }\r\n\r\n setSessionMedia(sessionId: string, stream: MediaStream) {\r\n const entry = this.entries.get(sessionId) ?? {\r\n rtc: new WebRTCSessionController(),\r\n session: null,\r\n media: null,\r\n };\r\n entry.media = stream;\r\n entry.rtc.setMediaStream(stream);\r\n this.entries.set(sessionId, entry);\r\n }\r\n\r\n getSession(sessionId: string) {\r\n return this.entries.get(sessionId)?.session ?? null;\r\n }\r\n\r\n getSessionIds() {\r\n return Array.from(this.entries.keys());\r\n }\r\n\r\n getSessions() {\r\n return Array.from(this.entries.entries()).map(([id, entry]) => ({\r\n id,\r\n session: entry.session as RTCSession,\r\n }));\r\n }\r\n\r\n getActiveSessionId(activeStatuses: string[] = [\"active\"]): string | null {\r\n for (const [id, entry] of Array.from(this.entries.entries()).reverse()) {\r\n const status = (entry.session as any)?.status;\r\n if (status && activeStatuses.includes(String(status).toLowerCase())) {\r\n return id;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n cleanupSession(sessionId: string) {\r\n const entry = this.entries.get(sessionId);\r\n if (entry) {\r\n entry.rtc.cleanup();\r\n this.entries.delete(sessionId);\r\n }\r\n }\r\n\r\n cleanupAllSessions() {\r\n for (const [, entry] of this.entries.entries()) {\r\n entry.rtc.cleanup();\r\n }\r\n this.entries.clear();\r\n this.pendingMediaQueue = [];\r\n }\r\n\r\n answer(sessionId: string, options: any) {\r\n const rtc = this.getRtc(sessionId);\r\n return rtc ? rtc.answer(options) : false;\r\n }\r\n\r\n hangup(sessionId: string, options?: any) {\r\n const rtc = this.getRtc(sessionId);\r\n return rtc ? rtc.hangup(options) : false;\r\n }\r\n\r\n mute(sessionId: string) {\r\n const rtc = this.getRtc(sessionId);\r\n return rtc ? rtc.mute() : false;\r\n }\r\n\r\n unmute(sessionId: string) {\r\n const rtc = this.getRtc(sessionId);\r\n return rtc ? rtc.unmute() : false;\r\n }\r\n\r\n hold(sessionId: string) {\r\n const rtc = this.getRtc(sessionId);\r\n return rtc ? rtc.hold() : false;\r\n }\r\n\r\n unhold(sessionId: string) {\r\n const rtc = this.getRtc(sessionId);\r\n return rtc ? rtc.unhold() : false;\r\n }\r\n\r\n sendDTMF(sessionId: string, tones: string | number, options?: any) {\r\n const rtc = this.getRtc(sessionId);\r\n return rtc ? rtc.sendDTMF(tones, options) : false;\r\n }\r\n\r\n transfer(sessionId: string, target: string | RTCSession, options?: any) {\n const rtc = this.getRtc(sessionId);\n return rtc ? rtc.transfer(target, options) : false;\n }\n\n attendedTransfer(sessionId: string, otherSession: RTCSession) {\n const rtc = this.getRtc(sessionId);\n return rtc ? rtc.attendedTransfer(otherSession) : false;\n }\n\n startScreenShare(sessionId: string, getDisplayMedia: () => Promise<MediaStream>) {\n const rtc = this.getRtc(sessionId);\n return rtc ? rtc.startScreenShare(getDisplayMedia) : false;\n }\n}\n","import { CallDirection, CallStatus, SipSessionState } from \"../core/types\";\r\nimport { SipStateStore } from \"../core/sipStateStore\";\r\n\r\nexport function holdOtherSessions(\r\n state: SipStateStore,\r\n sessionId: string,\r\n holdFn: (id: string) => void,\r\n updateSession: (id: string, partial: Partial<SipSessionState>) => void\r\n) {\r\n const current = state.getState();\r\n current.sessions.forEach((s) => {\r\n if (s.id === sessionId) return;\r\n if (s.status === CallStatus.Active) {\r\n holdFn(s.id);\r\n updateSession(s.id, { status: CallStatus.Hold });\r\n }\r\n });\r\n}\r\n\r\nexport function upsertSessionState(\r\n state: SipStateStore,\r\n sessionId: string,\r\n partial: Partial<SipSessionState>\r\n) {\r\n const current = state.getState();\r\n const existing = current.sessions.find((s) => s.id === sessionId);\r\n const base: SipSessionState = existing ?? {\r\n id: sessionId,\r\n status: CallStatus.Idle,\r\n direction: CallDirection.None,\r\n from: null,\r\n to: null,\r\n muted: false,\r\n acceptedAt: null,\r\n mediaKind: \"audio\",\r\n remoteVideoEnabled: false,\r\n };\r\n\r\n const nextSession = { ...base, ...partial };\r\n const sessions = existing\r\n ? current.sessions.map((s) => (s.id === sessionId ? nextSession : s))\r\n : [...current.sessions, nextSession];\r\n\r\n state.setState({ sessions });\r\n}\r\n\r\nexport function removeSessionState(state: SipStateStore, sessionId: string) {\r\n const current = state.getState();\r\n const sessions = current.sessions.filter((s) => s.id !== sessionId);\r\n state.setState({\r\n sessions,\r\n error: null,\r\n });\r\n}\r\n","import { SipStateStore } from \"../core/sipStateStore\";\r\nimport { CallDirection, CallStatus } from \"../core/types\";\r\nimport type { RTCSession, RTCSessionEvent } from \"./types\";\r\nimport { SessionManager } from \"./sessionManager\";\r\nimport { holdOtherSessions, upsertSessionState } from \"./sessionState\";\r\nimport type { JsSIPEventName } from \"./types\";\r\nimport type { SipErrorPayload } from \"../core/sipErrorHandler\";\r\n\r\ntype Deps = {\r\n state: SipStateStore;\r\n sessionManager: SessionManager;\r\n emit: <K extends JsSIPEventName>(event: K, payload: any) => void;\r\n emitError: (raw: any, code?: string, fallback?: string) => SipErrorPayload;\r\n attachSessionHandlers: (sessionId: string, session: RTCSession) => void;\r\n getMaxSessionCount: () => number;\r\n};\r\n\r\nexport class SessionLifecycle {\r\n private readonly state: SipStateStore;\r\n private readonly sessionManager: SessionManager;\r\n private readonly emit: Deps[\"emit\"];\r\n private readonly emitError: Deps[\"emitError\"];\r\n private readonly attachSessionHandlers: Deps[\"attachSessionHandlers\"];\r\n private readonly getMaxSessionCount: Deps[\"getMaxSessionCount\"];\r\n\r\n constructor(deps: Deps) {\r\n this.state = deps.state;\r\n this.sessionManager = deps.sessionManager;\r\n this.emit = deps.emit;\r\n this.emitError = deps.emitError;\r\n this.attachSessionHandlers = deps.attachSessionHandlers;\r\n this.getMaxSessionCount = deps.getMaxSessionCount;\r\n }\r\n\r\n handleNewRTCSession(e: RTCSessionEvent) {\r\n const session = e.session;\r\n const sessionId = String((session as any)?.id ?? crypto.randomUUID?.() ?? Date.now());\r\n\r\n const currentSessions = this.state.getState().sessions;\r\n if (currentSessions.length >= this.getMaxSessionCount()) {\r\n try {\r\n session.terminate?.({ status_code: 486, reason_phrase: \"Busy Here\" } as any);\r\n } catch {\r\n /* ignore termination errors */\r\n }\r\n if (e.originator === \"remote\") {\r\n this.emit(\"missed\", { sessionId, data: e });\r\n }\r\n this.emitError(\"max session count reached\", \"MAX_SESSIONS_REACHED\", \"max session count reached\");\r\n return;\r\n }\r\n\r\n const outgoingMedia = e.originator === \"local\" ? this.sessionManager.dequeueOutgoingMedia() : null;\r\n\r\n if (outgoingMedia) this.sessionManager.setSessionMedia(sessionId, outgoingMedia);\r\n\r\n const rtc = this.sessionManager.getOrCreateRtc(sessionId, session);\r\n if (outgoingMedia) rtc.setMediaStream(outgoingMedia);\r\n\r\n this.sessionManager.setSession(sessionId, session);\r\n this.attachSessionHandlers(sessionId, session);\r\n\r\n holdOtherSessions(\r\n this.state,\r\n sessionId,\r\n (id) => {\r\n const otherRtc = this.sessionManager.getRtc(id);\r\n otherRtc?.hold();\r\n },\r\n (id, partial) => upsertSessionState(this.state, id, partial)\r\n );\r\n\r\n const sdpHasVideo =\r\n (e.request?.body && e.request.body.toString().includes(\"m=video\")) ||\r\n (session as RTCSession & { connection?: RTCPeerConnection })?.connection\r\n ?.getReceivers?.()\r\n ?.some((r: RTCRtpReceiver) => r.track?.kind === \"video\");\r\n\r\n upsertSessionState(this.state, sessionId, {\r\n direction: e.originator === \"remote\" ? CallDirection.Incoming : CallDirection.Outgoing,\r\n from: e.originator === \"remote\" ? e.request.from.uri.user : null,\r\n to: e.request.to.uri.user,\r\n status: e.originator === \"remote\" ? CallStatus.Ringing : CallStatus.Dialing,\r\n mediaKind: sdpHasVideo ? \"video\" : \"audio\",\r\n remoteVideoEnabled: sdpHasVideo,\r\n });\r\n\r\n this.emit(\"newRTCSession\", { sessionId, data: e });\r\n }\r\n}\r\n","import { SipUserAgent } from \"./userAgent\";\r\nimport {\r\n AnswerOptions,\r\n CallOptions,\r\n DTFMOptions,\r\n JsSIPEventMap,\r\n JsSIPEventName,\r\n ReferOptions,\r\n RTCSession,\r\n RTCSessionEvent,\r\n RTCSessionEventMap,\r\n SipConfiguration,\r\n SipEventHandlers,\r\n SipEventManager,\r\n TerminateOptions,\r\n UAEventMap,\r\n} from \"./types\";\r\n\r\nimport {\r\n SipState,\r\n SipStatus,\r\n CallStatus,\r\n} from \"../core/types\";\r\nimport { EventTargetEmitter } from \"../core/eventEmitter\";\r\nimport {\r\n SipErrorHandler,\r\n SipErrorFormatter,\r\n SipErrorPayload,\r\n} from \"../core/sipErrorHandler\";\r\nimport { SipStateStore } from \"../core/sipStateStore\";\r\nimport { createUAHandlers } from \"./handlers/uaHandlers\";\r\nimport { createSessionHandlers } from \"./handlers/sessionHandlers\";\r\nimport { SessionManager } from \"./sessionManager\";\r\nimport { holdOtherSessions, upsertSessionState, removeSessionState } from \"./sessionState\";\r\nimport { SessionLifecycle } from \"./sessionLifecycle\";\r\n\r\ntype SipClientOptions = {\r\n errorMessages?: Record<string, string>;\r\n formatError?: SipErrorFormatter;\r\n errorHandler?: SipErrorHandler;\r\n debug?: boolean | string;\r\n};\r\n\r\nexport class SipClient extends EventTargetEmitter<JsSIPEventMap> {\r\n public readonly userAgent = new SipUserAgent();\r\n public readonly stateStore = new SipStateStore();\r\n\r\n private readonly uaHandlers: Partial<UAEventMap>;\r\n private readonly uaHandlerKeys: (keyof UAEventMap)[];\r\n private sessionHandlers = new Map<string, Partial<RTCSessionEventMap>>();\r\n private readonly errorHandler: SipErrorHandler;\r\n private debugPattern?: boolean | string;\r\n private maxSessionCount = Infinity;\r\n private sessionManager = new SessionManager();\r\n private lifecycle: SessionLifecycle;\r\n\r\n public get state(): SipState {\r\n return this.stateStore.getState();\r\n }\r\n\r\n constructor(options: SipClientOptions = {}) {\r\n super();\r\n\r\n this.errorHandler =\r\n options.errorHandler ??\r\n new SipErrorHandler({\r\n formatter: options.formatError,\r\n messages: options.errorMessages,\r\n });\r\n this.debugPattern = options.debug;\r\n\r\n this.uaHandlers = createUAHandlers({\r\n emitter: this,\r\n state: this.stateStore,\r\n cleanupAllSessions: () => this.cleanupAllSessions(),\r\n emitError: (raw, code, fallback) => this.emitError(raw, code, fallback),\r\n onNewRTCSession: (e: RTCSessionEvent) => this.onNewRTCSession(e),\r\n });\r\n this.uaHandlerKeys = Object.keys(this.uaHandlers) as (keyof UAEventMap)[];\r\n this.lifecycle = new SessionLifecycle({\r\n state: this.stateStore,\r\n sessionManager: this.sessionManager,\r\n emit: (event, payload) => this.emit(event as any, payload as any),\r\n emitError: (raw, code, fallback) => this.emitError(raw, code, fallback),\r\n attachSessionHandlers: (sessionId, session) => this.attachSessionHandlers(sessionId, session),\r\n getMaxSessionCount: () => this.maxSessionCount,\r\n });\r\n }\r\n\r\n public connect(uri: string, password: string, config: SipConfiguration) {\r\n this.disconnect();\r\n this.stateStore.setState({ sipStatus: SipStatus.Connecting });\r\n const { debug: cfgDebug, maxSessionCount, pendingMediaTtlMs, ...uaCfg } = config;\r\n this.maxSessionCount =\r\n typeof maxSessionCount === \"number\" ? maxSessionCount : Infinity;\r\n this.sessionManager.setPendingMediaTtl(pendingMediaTtlMs);\r\n const debug = this.debugPattern ?? cfgDebug;\r\n this.userAgent.start(uri, password, uaCfg, { debug });\r\n this.attachUAHandlers();\r\n }\r\n\r\n public registerUA() {\r\n this.userAgent.register();\r\n }\r\n\r\n public disconnect() {\r\n this.detachUAHandlers();\r\n this.userAgent.stop();\r\n this.cleanupAllSessions();\r\n this.stateStore.reset();\r\n }\r\n\r\n public call(target: string, callOptions: CallOptions = {}) {\r\n try {\r\n if (callOptions.mediaStream)\r\n this.sessionManager.enqueueOutgoingMedia(callOptions.mediaStream);\r\n\r\n const ua = this.userAgent.getUA();\r\n ua?.call(target, callOptions);\r\n } catch (e: unknown) {\r\n const err = this.emitError(e, \"CALL_FAILED\", \"call failed\");\r\n this.cleanupAllSessions();\r\n this.stateStore.batchSet({\r\n error: err.cause,\r\n });\r\n }\r\n }\r\n\r\n public answer(options: AnswerOptions = {}) {\r\n return this.answerSession(undefined, options);\r\n }\r\n public hangup(options?: TerminateOptions) {\r\n return this.hangupSession(undefined, options);\r\n }\r\n public mute() {\r\n return this.muteSession();\r\n }\r\n public unmute() {\r\n return this.unmuteSession();\r\n }\r\n public hold() {\r\n return this.holdSession();\r\n }\r\n public unhold() {\r\n return this.unholdSession();\r\n }\r\n public sendDTMF(tones: string | number, options?: DTFMOptions) {\r\n const sessionId = this.resolveSessionId();\r\n return this.sendDTMFSession(tones, options, sessionId ?? undefined);\r\n }\r\n public transfer(target: string | RTCSession, options?: ReferOptions) {\r\n return this.transferSession(target, options);\r\n }\r\n public attendedTransfer(otherSession: RTCSession) {\r\n return this.attendedTransferSession(otherSession);\r\n }\r\n\r\n public onChange(fn: (s: SipState) => void) {\r\n return this.stateStore.onChange(fn);\r\n }\r\n\r\n private attachUAHandlers() {\r\n const ua = this.userAgent.ua;\r\n if (!ua) return;\r\n\r\n this.detachUAHandlers();\r\n this.uaHandlerKeys.forEach((ev) => {\r\n const h = this.uaHandlers[ev];\r\n if (h) ua.on(ev, h as any);\r\n });\r\n }\r\n\r\n public setDebug(debug?: boolean | string) {\r\n this.debugPattern = debug;\r\n this.userAgent.setDebug(debug);\r\n }\r\n\r\n private attachSessionHandlers(sessionId: string, session: RTCSession) {\r\n const handlers = this.createSessionHandlersFor(sessionId, session);\r\n this.sessionHandlers.set(sessionId, handlers);\r\n\r\n (Object.keys(handlers) as (keyof RTCSessionEventMap)[]).forEach((ev) => {\r\n const h = handlers[ev];\r\n if (h) session.on(ev, h as any);\r\n });\r\n }\r\n\r\n private detachSessionHandlers(sessionId: string, session: RTCSession) {\r\n const handlers = this.sessionHandlers.get(sessionId);\r\n if (!handlers || !session) return;\r\n (Object.keys(handlers) as (keyof RTCSessionEventMap)[]).forEach((ev) => {\r\n const h = handlers[ev];\r\n if (h) session.off(ev, h as any);\r\n });\r\n this.sessionHandlers.delete(sessionId);\r\n }\r\n\r\n private detachUAHandlers() {\r\n const ua = this.userAgent.ua;\r\n if (!ua) return;\r\n this.uaHandlerKeys.forEach((ev) => {\r\n const h = this.uaHandlers[ev];\r\n if (h) ua.off(ev, h as any);\r\n });\r\n }\r\n\r\n private cleanupSession(sessionId: string, session?: RTCSession) {\r\n const existingSession = this.sessionManager.getSession(sessionId);\r\n this.emit(\"sessionCleanup\", { sessionId, session: existingSession });\r\n const targetSession =\r\n session ??\r\n this.sessionManager.getSession(sessionId) ??\r\n this.sessionManager.getRtc(sessionId)?.currentSession;\r\n this.detachSessionHandlers(sessionId, targetSession as any);\r\n this.sessionManager.cleanupSession(sessionId);\r\n removeSessionState(this.stateStore, sessionId);\r\n }\r\n\r\n private cleanupAllSessions() {\r\n const ids = this.sessionManager.getSessionIds();\r\n ids.forEach((id) => {\r\n const s = this.sessionManager.getSession(id);\r\n this.emit(\"sessionCleanup\", { sessionId: id, session: s });\r\n });\r\n this.sessionManager.cleanupAllSessions();\r\n this.sessionHandlers.clear();\r\n this.stateStore.setState({\r\n sessions: [],\r\n error: null,\r\n });\r\n }\r\n\r\n private createSessionHandlersFor(\r\n sessionId: string,\r\n session: RTCSession\r\n ): Partial<RTCSessionEventMap> {\r\n const rtc = this.sessionManager.getOrCreateRtc(sessionId, session);\r\n return createSessionHandlers({\r\n emitter: this,\r\n state: this.stateStore,\r\n rtc,\r\n detachSessionHandlers: () => this.cleanupSession(sessionId, session),\r\n emitError: (raw, code, fallback) => this.emitError(raw, code, fallback),\r\n onSessionFailed: (err?: string, event?: RTCSessionEvent) => this.onSessionFailed(err, event),\r\n sessionId,\r\n });\r\n }\r\n\r\n protected onNewRTCSession(e: RTCSessionEvent) {\r\n this.lifecycle.handleNewRTCSession(e);\r\n }\r\n\r\n protected onSessionFailed(error?: string, event?: RTCSessionEvent) {\r\n const rawCause = (event as any)?.cause ?? error;\r\n const statusCode = (event as any)?.message?.status_code;\r\n const statusText = (event as any)?.message?.reason_phrase;\r\n const causeText =\r\n rawCause ||\r\n (statusCode ? `${statusCode}${statusText ? \" \" + statusText : \"\"}` : \"call failed\");\r\n this.emitError(\r\n { raw: event, cause: rawCause, statusCode, statusText },\r\n \"SESSION_FAILED\",\r\n causeText\r\n );\r\n }\r\n\r\n private emitError(\r\n raw: unknown,\r\n code?: string,\r\n fallback?: string\r\n ): SipErrorPayload {\r\n const payload = this.errorHandler.format({ raw, code, fallback });\r\n this.emit(\"error\", payload);\r\n return payload;\r\n }\r\n\r\n private resolveSessionId(sessionId?: string) {\r\n if (sessionId) return sessionId;\r\n const sessions = this.stateStore.getState().sessions;\r\n const active = sessions.find((s) => s.status === CallStatus.Active);\r\n return active?.id ?? sessions[0]?.id ?? null;\r\n }\r\n\r\n public answerSession(\r\n sessionIdOrOptions?: string | AnswerOptions,\r\n options?: AnswerOptions\r\n ) {\r\n const sessionId =\r\n typeof sessionIdOrOptions === \"string\"\r\n ? sessionIdOrOptions\r\n : this.resolveSessionId();\r\n const opts =\r\n typeof sessionIdOrOptions === \"string\"\r\n ? options ?? {}\r\n : (sessionIdOrOptions as AnswerOptions) ?? {};\r\n if (!sessionId) return false;\r\n holdOtherSessions(\r\n this.stateStore,\r\n sessionId,\r\n (id) => {\r\n const rtc = this.sessionManager.getRtc(id);\r\n rtc?.hold();\r\n },\r\n (id, partial) => upsertSessionState(this.stateStore, id, partial)\r\n );\r\n return this.sessionManager.answer(sessionId, opts);\r\n }\r\n\r\n public hangupSession(\r\n sessionIdOrOptions?: string | TerminateOptions,\r\n options?: TerminateOptions\r\n ) {\r\n const sessionId =\r\n typeof sessionIdOrOptions === \"string\"\r\n ? sessionIdOrOptions\r\n : this.resolveSessionId();\r\n const opts =\r\n typeof sessionIdOrOptions === \"string\"\r\n ? options\r\n : (sessionIdOrOptions as TerminateOptions | undefined);\r\n if (!sessionId) return false;\r\n return this.sessionManager.hangup(sessionId, opts);\r\n }\r\n\r\n public muteSession(sessionId?: string) {\r\n const resolved = this.resolveSessionId(sessionId);\r\n if (!resolved) return false;\r\n const sessionState = this.stateStore\r\n .getState()\r\n .sessions.find((s) => s.id === resolved);\r\n if (sessionState?.muted) return true;\r\n this.sessionManager.mute(resolved);\r\n upsertSessionState(this.stateStore, resolved, { muted: true });\r\n return true;\r\n }\r\n\r\n public unmuteSession(sessionId?: string) {\r\n const resolved = this.resolveSessionId(sessionId);\r\n if (!resolved) return false;\r\n const sessionState = this.stateStore\r\n .getState()\r\n .sessions.find((s) => s.id === resolved);\r\n if (!sessionState?.muted) return true;\r\n this.sessionManager.unmute(resolved);\r\n upsertSessionState(this.stateStore, resolved, { muted: false });\r\n return true;\r\n }\r\n\r\n public holdSession(sessionId?: string) {\r\n const resolved = this.resolveSessionId(sessionId);\r\n if (!resolved) return false;\r\n const sessionState = this.stateStore\r\n .getState()\r\n .sessions.find((s) => s.id === resolved);\r\n if (sessionState?.status === CallStatus.Active) {\r\n this.sessionManager.hold(resolved);\r\n upsertSessionState(this.stateStore, resolved, { status: CallStatus.Hold });\r\n }\r\n return true;\r\n }\r\n\r\n public unholdSession(sessionId?: string) {\r\n const resolved = this.resolveSessionId(sessionId);\r\n if (!resolved) return false;\r\n const sessionState = this.stateStore\r\n .getState()\r\n .sessions.find((s) => s.id === resolved);\r\n if (sessionState?.status === CallStatus.Hold) {\r\n this.sessionManager.unhold(resolved);\r\n upsertSessionState(this.stateStore, resolved, {\r\n status: CallStatus.Active,\r\n });\r\n }\r\n return true;\r\n }\r\n\r\n public sendDTMFSession(\r\n tones: string | number,\r\n options?: DTFMOptions,\r\n sessionId?: string\r\n ) {\r\n const resolved = this.resolveSessionId(sessionId);\r\n if (!resolved) return false;\r\n const sessionState = this.stateStore\r\n .getState()\r\n .sessions.find((s) => s.id === resolved);\r\n if (sessionState?.status === CallStatus.Active)\r\n this.sessionManager.sendDTMF(resolved, tones, options);\r\n return true;\r\n }\r\n\r\n public transferSession(\r\n target: string | RTCSession,\r\n options?: ReferOptions,\r\n sessionId?: string\r\n ) {\r\n const resolved = this.resolveSessionId(sessionId);\r\n if (!resolved) return false;\r\n const sessionState = this.stateStore\r\n .getState()\r\n .sessions.find((s) => s.id === resolved);\r\n if (sessionState?.status === CallStatus.Active)\r\n this.sessionManager.transfer(resolved, target, options);\r\n return true;\r\n }\r\n\r\n public attendedTransferSession(otherSession: RTCSession, sessionId?: string) {\r\n const resolved = this.resolveSessionId(sessionId);\r\n if (!resolved) return false;\r\n const sessionState = this.stateStore\r\n .getState()\r\n .sessions.find((s) => s.id === resolved);\r\n if (sessionState?.status === CallStatus.Active)\r\n this.sessionManager.attendedTransfer(resolved, otherSession);\r\n return true;\r\n }\r\n\r\n public setSessionMedia(sessionId: string, stream: MediaStream) {\r\n this.sessionManager.setSessionMedia(sessionId, stream);\r\n }\r\n\r\n public switchCameraSession(sessionId: string, track: MediaStreamTrack) {\n const rtc = this.sessionManager.getRtc(sessionId);\n return rtc ? rtc.switchCamera(track) : false;\n }\n\n public startScreenShareSession(\n sessionId: string,\n getDisplayMedia: () => Promise<MediaStream>\n ) {\n return this.sessionManager.startScreenShare(sessionId, getDisplayMedia);\n }\n\n\n public enableVideoSession(sessionId: string) {\n const rtc = this.sessionManager.getRtc(sessionId);\n rtc?.enableVideo();\n return !!rtc;\n }\r\n\r\n public disableVideoSession(sessionId: string) {\r\n const rtc = this.sessionManager.getRtc(sessionId);\r\n rtc?.disableVideo();\r\n return !!rtc;\r\n }\r\n\r\n public getSession(sessionId: string) {\r\n return this.sessionManager.getSession(sessionId);\r\n }\r\n\r\n public getSessionIds() {\r\n return this.sessionManager.getSessionIds();\r\n }\r\n\r\n public getSessions() {\r\n return this.sessionManager.getSessions();\r\n }\r\n}\r\n\r\nexport function createSipClientInstance(options?: SipClientOptions): SipClient {\r\n return new SipClient(options);\r\n}\r\n\r\nexport function createSipEventManager(client: SipClient): SipEventManager {\r\n return {\r\n on(event, handler) {\r\n return client.on(event, handler as any);\r\n },\r\n onSession(sessionId, event, handler) {\r\n return client.on(event, (payload: any) => {\r\n if (\r\n payload &&\r\n \"sessionId\" in payload &&\r\n payload.sessionId === sessionId\r\n ) {\r\n handler(payload);\r\n }\r\n });\r\n },\r\n bind(handlers: Partial<SipEventHandlers>) {\r\n const offs: Array<() => void> = [];\r\n\r\n (Object.keys(handlers) as JsSIPEventName[]).forEach((event) => {\r\n const handler = handlers[event];\r\n if (handler) {\r\n offs.push(client.on(event, handler as any));\r\n }\r\n });\r\n\r\n return () => offs.forEach((off) => off());\r\n },\r\n bindSession(sessionId, handlers: Partial<SipEventHandlers>) {\r\n const offs: Array<() => void> = [];\r\n\r\n (Object.keys(handlers) as JsSIPEventName[]).forEach((event) => {\r\n const handler = handlers[event];\r\n if (handler) {\r\n offs.push(\r\n client.on(event, (payload: any) => {\r\n if (\r\n payload &&\r\n \"sessionId\" in payload &&\r\n payload.sessionId === sessionId\r\n ) {\r\n handler(payload);\r\n }\r\n })\r\n );\r\n }\r\n });\r\n\r\n return () => offs.forEach((off) => off());\r\n },\r\n };\r\n}\r\n","export * from \"./sip/types\";\r\n\r\nexport {\r\n SipClient,\r\n createSipClientInstance,\r\n createSipEventManager,\r\n} from \"./sip/client\";\r\nexport {\r\n SipDebugger,\r\n sipDebugger,\r\n type SipDebugToggleResult,\r\n} from \"./sip/debugger\";\r\n\r\nexport { WebRTCSessionController } from \"./sip/sessionController\";\r\nexport { SessionManager } from \"./sip/sessionManager\";\r\n\r\nexport {\r\n SipErrorHandler,\r\n type SipErrorPayload,\r\n type SipErrorFormatter,\r\n} from \"./core/sipErrorHandler\";\r\n\r\nexport { WebSocketInterface } from \"jssip\";\r\n\r\nexport {\r\n SipStatus,\r\n CallStatus,\r\n CallDirection,\r\n SipStatusList,\r\n CallStatusList,\r\n CallDirectionList,\r\n isSipStatus,\r\n isCallStatus,\r\n isCallDirection,\r\n} from \"./core/types\";\r\n\r\nexport type {\r\n SipStatus as SipStatusType,\r\n CallStatus as CallStatusType,\r\n CallDirection as CallDirectionType,\r\n SipState,\r\n SipSessionState,\r\n} from \"./core/types\";\r\n","import { createContext } from \"react\";\r\nimport type { SipClient } from \"jssip-lib\";\r\nimport type { SipEventManager } from \"jssip-lib\";\r\n\r\nexport type SipContextType = { client: SipClient, sipEventManager: SipEventManager };\r\nexport const SipContext = createContext<SipContextType | null>(null);\r\n","import { useCallback, useSyncExternalStore } from \"react\";\r\nimport type { SipState } from \"jssip-lib\";\r\nimport { useSip } from \"./useSip\";\r\n\r\nexport function useSipState(): SipState {\r\n const { client } = useSip();\r\n const subscribe = useCallback(\r\n (onStoreChange: () => void) => client.onChange(onStoreChange),\r\n [client]\r\n );\r\n\r\n const getSnapshot = useCallback(() => client.state, [client]);\r\n\r\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\r\n}\r\n","import { useContext } from \"react\";\r\nimport { SipContext } from \"../context\";\r\n\r\nexport function useSip() {\r\n const ctx = useContext(SipContext);\r\n if (!ctx) throw new Error(\"Must be used within SipProvider\");\r\n return ctx;\r\n}\r\n","import { useMemo } from \"react\";\r\nimport { useSip } from \"./useSip\";\r\n\r\nexport function useSipActions() {\r\n const { client } = useSip();\r\n return useMemo(\r\n () => ({\r\n call: (...args: Parameters<typeof client.call>) => client.call(...args),\r\n answer: (...args: Parameters<typeof client.answerSession>) =>\r\n client.answerSession(...args),\r\n hangup: (...args: Parameters<typeof client.hangupSession>) =>\r\n client.hangupSession(...args),\r\n mute: (...args: Parameters<typeof client.muteSession>) =>\r\n client.muteSession(...args),\r\n unmute: (...args: Parameters<typeof client.unmuteSession>) =>\r\n client.unmuteSession(...args),\r\n hold: (...args: Parameters<typeof client.holdSession>) =>\r\n client.holdSession(...args),\r\n unhold: (...args: Parameters<typeof client.unholdSession>) =>\r\n client.unholdSession(...args),\r\n sendDTMF: (...args: Parameters<typeof client.sendDTMFSession>) =>\r\n client.sendDTMFSession(...args),\r\n transfer: (...args: Parameters<typeof client.transferSession>) =>\r\n client.transferSession(...args),\r\n attendedTransfer: (\r\n ...args: Parameters<typeof client.attendedTransferSession>\r\n ) => client.attendedTransferSession(...args),\r\n getSession: (...args: Parameters<typeof client.getSession>) =>\r\n client.getSession(...args),\r\n getSessionIds: () => client.getSessionIds(),\r\n getSessions: () => client.getSessions(),\r\n setSessionMedia: (...args: Parameters<typeof client.setSessionMedia>) =>\r\n client.setSessionMedia(...args),\r\n switchCamera: (\r\n ...args: Parameters<typeof client.switchCameraSession>\r\n ) => client.switchCameraSession(...args),\r\n startScreenShare: (\r\n ...args: Parameters<typeof client.startScreenShareSession>\r\n ) => client.startScreenShareSession(...args),\r\n enableVideo: (...args: Parameters<typeof client.enableVideoSession>) =>\r\n client.enableVideoSession(...args),\r\n disableVideo: (...args: Parameters<typeof client.disableVideoSession>) =>\r\n client.disableVideoSession(...args),\r\n }),\r\n [client]\r\n );\r\n}\r\n","import type { SipState } from \"jssip-lib\";\nimport { useSipState } from \"./useSipState\";\n\nexport function useSipSessions(): Pick<SipState, \"sessions\"> {\n const { sessions } = useSipState();\n return { sessions };\n}\n","import { useEffect } from \"react\";\r\nimport type { JsSIPEventHandler, JsSIPEventName } from \"jssip-lib\";\r\nimport { useSip } from \"./useSip\";\r\n\r\ntype EventName = JsSIPEventName | \"sessionCleanup\";\r\n\r\nexport function useSipEvent<K extends EventName>(\r\n event: K,\r\n handler?: JsSIPEventHandler<K>\r\n) {\r\n const { sipEventManager } = useSip();\r\n\r\n useEffect(() => {\r\n if (!handler) return;\r\n return sipEventManager.on(event as JsSIPEventName, handler as any);\r\n }, [event, handler, sipEventManager]);\r\n}\r\n\r\nexport function useSipSessionEvent<K extends EventName>(\r\n sessionId: string | null | undefined,\r\n event: K,\r\n handler?: JsSIPEventHandler<K>\r\n) {\r\n const { sipEventManager } = useSip();\r\n\r\n useEffect(() => {\r\n if (!handler || !sessionId) return;\r\n return sipEventManager.onSession(sessionId, event as JsSIPEventName, handler as any);\r\n }, [event, handler, sessionId, sipEventManager]);\r\n}\r\n","import { useEffect, useRef } from \"react\";\r\nimport { useSip } from \"../hooks/useSip\";\r\nimport { createCallPlayer } from \"jssip-lib/dom\";\r\n\r\nexport function CallPlayer({ sessionId }: { sessionId?: string }) {\r\n const { client } = useSip();\r\n const audioRef = useRef<HTMLAudioElement | null>(null);\r\n\r\n useEffect(() => {\r\n if (!audioRef.current) return;\r\n\r\n const player = createCallPlayer(audioRef.current);\r\n const session = sessionId ? client.getSession(sessionId) : null;\r\n const off = session\r\n ? player.bindToSession(session)\r\n : player.bindToClient(client);\r\n\r\n return () => {\r\n off?.();\r\n player.detach();\r\n };\r\n }, [client, sessionId]);\r\n\r\n return <audio ref={audioRef} autoPlay playsInline />;\r\n}\r\n","import { SipClient } from \"../../sip/client\";\r\nimport type { RTCSession, RTCSessionEvent } from \"../../sip/types\";\r\n\r\nexport function createCallPlayer(audioEl: HTMLAudioElement) {\r\n let cleanupTrackListener: (() => void) | null = null;\r\n let cleanupSessionPeerListener: (() => void) | null = null;\r\n let cleanupClientListeners: (() => void) | null = null;\r\n\r\n const dispose = (fn: (() => void) | null) => {\r\n if (fn) fn();\r\n return null as null;\r\n };\r\n\r\n /** Stop all tracks and clear audio element */\r\n function clearAudioStream(stream?: MediaStream | null) {\r\n if (stream) {\r\n for (const t of stream.getTracks()) {\r\n t.stop();\r\n }\r\n }\r\n audioEl.srcObject = null;\r\n }\r\n\r\n const attachTracks = (pc: RTCPeerConnection) => {\r\n const onTrack = (e: RTCTrackEvent) => {\r\n if (e.track.kind !== \"audio\") return;\r\n\r\n const nextStream = e.streams?.[0] ?? new MediaStream([e.track]);\r\n const prev = audioEl.srcObject as MediaStream | null;\r\n\r\n if (prev && prev !== nextStream) {\r\n clearAudioStream(prev);\r\n }\r\n\r\n audioEl.srcObject = nextStream;\r\n audioEl.play?.().catch(() => {});\r\n };\r\n\r\n pc.addEventListener(\"track\", onTrack);\r\n return () => pc.removeEventListener(\"track\", onTrack);\r\n };\r\n\r\n const listenSessionPeerconnection = (session: RTCSession) => {\r\n const onPeer = (data: { peerconnection: RTCPeerConnection }) => {\r\n cleanupTrackListener = dispose(cleanupTrackListener);\r\n cleanupTrackListener = attachTracks(data.peerconnection);\r\n };\r\n session.on(\"peerconnection\", onPeer);\r\n return () => session.off(\"peerconnection\", onPeer);\r\n };\r\n\r\n function bindToSession(session: RTCSession) {\r\n if (\r\n session?.direction === \"outgoing\" &&\r\n session.connection instanceof RTCPeerConnection\r\n ) {\r\n cleanupTrackListener = dispose(cleanupTrackListener);\r\n cleanupTrackListener = attachTracks(session.connection);\r\n }\r\n\r\n cleanupSessionPeerListener = dispose(cleanupSessionPeerListener);\r\n cleanupSessionPeerListener = listenSessionPeerconnection(session);\r\n\r\n return () => {\r\n cleanupSessionPeerListener = dispose(cleanupSessionPeerListener);\r\n cleanupTrackListener = dispose(cleanupTrackListener);\r\n };\r\n }\r\n\r\n function bindToClient(client: SipClient) {\r\n const offNew = client.on(\"newRTCSession\", (payload) => {\r\n const e = (payload as any)?.data as RTCSessionEvent | undefined;\r\n cleanupSessionPeerListener = dispose(cleanupSessionPeerListener);\r\n cleanupTrackListener = dispose(cleanupTrackListener);\r\n\r\n if (!e?.session) return;\r\n\r\n cleanupSessionPeerListener = listenSessionPeerconnection(e.session);\r\n if (\r\n e.session.direction === \"outgoing\" &&\r\n e.session.connection instanceof RTCPeerConnection\r\n ) {\r\n cleanupTrackListener = attachTracks(e.session.connection);\r\n }\r\n });\r\n\r\n const offEnded = client.on(\"ended\", () => detach());\r\n const offFailed = client.on(\"failed\", () => detach());\r\n const offDisconnected = client.on(\"disconnected\", () => detach());\r\n\r\n cleanupClientListeners = () => {\r\n offNew();\r\n offEnded();\r\n offFailed();\r\n offDisconnected();\r\n };\r\n return cleanupClientListeners;\r\n }\r\n\r\n function detach() {\r\n cleanupClientListeners = dispose(cleanupClientListeners);\r\n cleanupSessionPeerListener = dispose(cleanupSessionPeerListener);\r\n cleanupTrackListener = dispose(cleanupTrackListener);\r\n clearAudioStream(audioEl.srcObject as MediaStream | null);\r\n }\r\n\r\n return {\r\n bindToSession,\r\n bindToClient,\r\n detach,\r\n };\r\n}\r\n","import React, { useMemo } from \"react\";\r\nimport { SipContext } from \"../context\";\r\nimport { createSipEventManager, type SipClient, type SipEventManager } from \"jssip-lib\";\r\n\r\nexport function SipProvider({\r\n client,\r\n children,\r\n sipEventManager,\r\n}: {\r\n sipEventManager?: SipEventManager;\r\n client: SipClient;\r\n children: React.ReactNode;\r\n}) {\r\n const manager = useMemo(\r\n () => sipEventManager ?? createSipEventManager(client),\r\n [client, sipEventManager]\r\n );\r\n\r\n const contextValue = useMemo(() => ({ client, sipEventManager: manager }), [client, manager]);\r\n\r\n return (\r\n <SipContext.Provider value={contextValue}>\r\n {children}\r\n </SipContext.Provider>\r\n );\r\n}\r\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "react-jssip-kit",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "React hooks and provider around JsSIP client",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"main": "./dist/index.cjs",
|
|
10
|
+
"module": "./dist/index.js",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"require": "./dist/index.cjs",
|
|
15
|
+
"types": "./dist/index.d.ts"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": ["dist", "README.md", "LICENSE", "CHANGELOG.md"],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsup"
|
|
21
|
+
},
|
|
22
|
+
"keywords": ["react", "webrtc", "sip", "jssip", "hooks", "provider"],
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"publishConfig": {
|
|
25
|
+
"access": "public"
|
|
26
|
+
},
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "git+https://github.com/vyacheslavshtyrlin/react-jssip.git"
|
|
30
|
+
},
|
|
31
|
+
"bugs": {
|
|
32
|
+
"url": "https://github.com/vyacheslavshtyrlin/react-jssip/issues"
|
|
33
|
+
},
|
|
34
|
+
"homepage": "https://github.com/vyacheslavshtyrlin/react-jssip#readme",
|
|
35
|
+
"author": "SIP Team",
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"jssip": "^3.10.1"
|
|
38
|
+
},
|
|
39
|
+
"peerDependencies": {
|
|
40
|
+
"react": "^18.0.0",
|
|
41
|
+
"react-dom": "^18.0.0"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"react": "^18.2.0",
|
|
45
|
+
"react-dom": "^18.2.0",
|
|
46
|
+
"tsup": "^7.2.0",
|
|
47
|
+
"typescript": "^5.0.0"
|
|
48
|
+
}
|
|
49
|
+
}
|