@xcall/sdk 1.0.6 → 1.0.7
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/xcall.min.js.map +1 -1
- package/package.json +1 -1
package/dist/xcall.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/internal/iframe.ts","../src/internal/events.ts","../src/core/XCall.ts"],"sourcesContent":["export { XCall } from './core/XCall'\nexport * from './types'\n","import type { XCallOptions } from '../types'\n\nconst PERMISSIONS = 'camera; microphone; display-capture; autoplay; clipboard-write; fullscreen'\n\nexport function createIframe(base: string, style?: Partial<CSSStyleDeclaration>): HTMLIFrameElement {\n const el = document.createElement('iframe')\n el.src = base.replace(/\\/$/, '')\n el.allow = PERMISSIONS\n el.style.border = 'none'\n el.style.width = '100%'\n el.style.height = '100%'\n\n if (style) {\n for (const [key, value] of Object.entries(style)) {\n ;(el.style as unknown as Record<string, string>)[key] = value as string\n }\n }\n\n return el\n}\n\nexport function resolveContainer(container: XCallOptions['container']): HTMLElement {\n const el =\n typeof container === 'string'\n ? (document.querySelector(container) as HTMLElement | null)\n : container\n if (!el) throw new Error('[xCall] container not found')\n return el\n}\n","import type { XCallEventName, XCallEventCallback, XCallEventMap } from '../types'\n\ntype ListenerMap = Partial<{\n [K in XCallEventName]: Set<XCallEventCallback<K>>\n}>\n\nexport class EventEmitter {\n private listeners: ListenerMap = {}\n\n on<K extends XCallEventName>(event: K, cb: XCallEventCallback<K>): this {\n if (!this.listeners[event]) {\n this.listeners[event] = new Set() as never\n }\n ;(this.listeners[event] as Set<XCallEventCallback<K>>).add(cb)\n return this\n }\n\n off<K extends XCallEventName>(event: K, cb: XCallEventCallback<K>): this {\n ;(this.listeners[event] as Set<XCallEventCallback<K>> | undefined)?.delete(cb)\n return this\n }\n\n emit<K extends XCallEventName>(event: K, data: XCallEventMap[K]): void {\n const handlers = this.listeners[event] as Set<XCallEventCallback<K>> | undefined\n handlers?.forEach((cb) => cb(data))\n }\n}\n","import type { XCallOptions, XCallEventName, XCallEventCallback, XCallCommand, XCallIncomingMessage } from '../types'\nimport { createIframe, resolveContainer } from '../internal/iframe'\nimport { EventEmitter } from '../internal/events'\n\nconst DEFAULT_ROOM_URL = 'https://room.xcall.com.br'\n\nexport class XCall {\n private iframe: HTMLIFrameElement\n private origin: string\n private emitter = new EventEmitter()\n private messageHandler: (e: MessageEvent) => void\n\n constructor(options: XCallOptions) {\n const container = resolveContainer(options.container)\n const base = options.roomUrl ?? DEFAULT_ROOM_URL\n\n this.origin = new URL(base).origin\n this.iframe = createIframe(base, options.iframeStyle)\n container.appendChild(this.iframe)\n\n this.messageHandler = (e: MessageEvent) => {\n if (e.origin !== this.origin) return\n const raw = e.data\n if (!raw || typeof raw !== 'object') return\n // xCall-room envia { source: 'xcall-room', type, payload }\n // Normaliza para o formato flat que _handleMessage espera\n const msg: XCallIncomingMessage = raw.payload\n ? { type: raw.type, ...raw.payload }\n : raw\n this._handleMessage(msg, options.token)\n }\n window.addEventListener('message', this.messageHandler)\n }\n\n // ── Eventos ───────────────────────────────────────────────────────────────\n\n on<K extends XCallEventName>(event: K, cb: XCallEventCallback<K>): this {\n this.emitter.on(event, cb)\n return this\n }\n\n off<K extends XCallEventName>(event: K, cb: XCallEventCallback<K>): this {\n this.emitter.off(event, cb)\n return this\n }\n\n // ── Comandos ──────────────────────────────────────────────────────────────\n\n muteAudio(muted: boolean) { this._send({ type: 'xcall:mute_audio', muted }) }\n muteVideo(muted: boolean) { this._send({ type: 'xcall:mute_video', muted }) }\n leave() { this._send({ type: 'xcall:leave' }) }\n\n destroy() {\n window.removeEventListener('message', this.messageHandler)\n this.iframe.remove()\n }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _handleMessage(msg: XCallIncomingMessage, token: string) {\n const m = msg as any\n switch (m.type) {\n case 'xcall:ready':\n this._send({ type: 'xcall:token', token })\n this.emitter.emit('ready', undefined as void)\n break\n case 'xcall:joined':\n this.emitter.emit('joined', { roomId: m.roomId, userId: m.userId })\n break\n case 'xcall:left':\n this.emitter.emit('left', { roomId: m.roomId, reason: m.reason })\n break\n // xCall-room usa xcall:peer_joined; SDK expõe como participant_joined\n case 'xcall:peer_joined':\n case 'xcall:participant_joined':\n this.emitter.emit('participant_joined', { userId: m.peerId ?? m.userId, displayName: m.peerName ?? m.displayName })\n break\n // xCall-room usa xcall:peer_left; SDK expõe como participant_left\n case 'xcall:peer_left':\n case 'xcall:participant_left':\n this.emitter.emit('participant_left', { userId: m.peerId ?? m.userId })\n break\n case 'xcall:error':\n this.emitter.emit('error', { code: m.code ?? 'unknown', message: m.message ?? String(m) })\n break\n }\n }\n\n private _send(cmd: XCallCommand) {\n this.iframe.contentWindow?.postMessage(cmd, this.origin)\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/internal/iframe.ts","../src/internal/events.ts","../src/core/XCall.ts"],"sourcesContent":["export { XCall } from './core/XCall'\nexport * from './types'\n","import type { XCallOptions } from '../types'\n\nconst PERMISSIONS = 'camera; microphone; display-capture; autoplay; clipboard-write; fullscreen'\n\nexport function createIframe(base: string, style?: Partial<CSSStyleDeclaration>): HTMLIFrameElement {\n const el = document.createElement('iframe')\n el.src = base.replace(/\\/$/, '')\n el.allow = PERMISSIONS\n el.style.border = 'none'\n el.style.width = '100%'\n el.style.height = '100%'\n\n if (style) {\n for (const [key, value] of Object.entries(style)) {\n ;(el.style as unknown as Record<string, string>)[key] = value as string\n }\n }\n\n return el\n}\n\nexport function resolveContainer(container: XCallOptions['container']): HTMLElement {\n const el =\n typeof container === 'string'\n ? (document.querySelector(container) as HTMLElement | null)\n : container\n if (!el) throw new Error('[xCall] container not found')\n return el\n}\n","import type { XCallEventName, XCallEventCallback, XCallEventMap } from '../types'\n\ntype ListenerMap = Partial<{\n [K in XCallEventName]: Set<XCallEventCallback<K>>\n}>\n\nexport class EventEmitter {\n private listeners: ListenerMap = {}\n\n on<K extends XCallEventName>(event: K, cb: XCallEventCallback<K>): this {\n if (!this.listeners[event]) {\n this.listeners[event] = new Set() as never\n }\n ;(this.listeners[event] as Set<XCallEventCallback<K>>).add(cb)\n return this\n }\n\n off<K extends XCallEventName>(event: K, cb: XCallEventCallback<K>): this {\n ;(this.listeners[event] as Set<XCallEventCallback<K>> | undefined)?.delete(cb)\n return this\n }\n\n emit<K extends XCallEventName>(event: K, data: XCallEventMap[K]): void {\n const handlers = this.listeners[event] as Set<XCallEventCallback<K>> | undefined\n handlers?.forEach((cb) => cb(data))\n }\n}\n","import type { XCallOptions, XCallEventName, XCallEventCallback, XCallCommand, XCallIncomingMessage } from '../types'\nimport { createIframe, resolveContainer } from '../internal/iframe'\nimport { EventEmitter } from '../internal/events'\n\nconst DEFAULT_ROOM_URL = 'https://room.xcall.com.br'\n\nexport class XCall {\n private iframe: HTMLIFrameElement\n private origin: string\n private emitter = new EventEmitter()\n private messageHandler: (e: MessageEvent) => void\n\n constructor(options: XCallOptions) {\n const container = resolveContainer(options.container)\n const base = options.roomUrl ?? DEFAULT_ROOM_URL\n\n this.origin = new URL(base).origin\n this.iframe = createIframe(base, options.iframeStyle)\n container.appendChild(this.iframe)\n\n this.messageHandler = (e: MessageEvent) => {\n if (e.origin !== this.origin) return\n const raw = e.data\n if (!raw || typeof raw !== 'object') return\n // xCall-room envia { source: 'xcall-room', type, payload }\n // Normaliza para o formato flat que _handleMessage espera\n const msg: XCallIncomingMessage = raw.payload\n ? { type: raw.type, ...raw.payload }\n : raw\n this._handleMessage(msg, options.token)\n }\n window.addEventListener('message', this.messageHandler)\n }\n\n // ── Eventos ───────────────────────────────────────────────────────────────\n\n on<K extends XCallEventName>(event: K, cb: XCallEventCallback<K>): this {\n this.emitter.on(event, cb)\n return this\n }\n\n off<K extends XCallEventName>(event: K, cb: XCallEventCallback<K>): this {\n this.emitter.off(event, cb)\n return this\n }\n\n // ── Comandos ──────────────────────────────────────────────────────────────\n\n muteAudio(muted: boolean) { this._send({ type: 'xcall:mute_audio', muted }) }\n muteVideo(muted: boolean) { this._send({ type: 'xcall:mute_video', muted }) }\n leave() { this._send({ type: 'xcall:leave' }) }\n\n destroy() {\n window.removeEventListener('message', this.messageHandler)\n this.iframe.remove()\n }\n\n // ── Internals ─────────────────────────────────────────────────────────────\n\n private _handleMessage(msg: XCallIncomingMessage, token: string) {\n const m = msg as any\n switch (m.type) {\n case 'xcall:ready':\n this._send({ type: 'xcall:token', token })\n this.emitter.emit('ready', undefined as void)\n break\n case 'xcall:joined':\n this.emitter.emit('joined', { roomId: m.roomId, userId: m.userId })\n break\n case 'xcall:left':\n this.emitter.emit('left', { roomId: m.roomId, reason: m.reason })\n break\n // xCall-room usa xcall:peer_joined; SDK expõe como participant_joined\n case 'xcall:peer_joined':\n case 'xcall:participant_joined':\n this.emitter.emit('participant_joined', { userId: m.peerId ?? m.userId, displayName: m.peerName ?? m.displayName })\n break\n // xCall-room usa xcall:peer_left; SDK expõe como participant_left\n case 'xcall:peer_left':\n case 'xcall:participant_left':\n this.emitter.emit('participant_left', { userId: m.peerId ?? m.userId })\n break\n case 'xcall:error':\n this.emitter.emit('error', { code: m.code ?? 'unknown', message: m.message ?? String(m) })\n break\n }\n }\n\n private _send(cmd: XCallCommand) {\n this.iframe.contentWindow?.postMessage(cmd, this.origin)\n }\n}\n"],"mappings":"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","names":["src_exports","__export","XCall","__toCommonJS","PERMISSIONS","createIframe","base","style","el","key","value","resolveContainer","container","EventEmitter","event","cb","_a","data","handlers","DEFAULT_ROOM_URL","XCall","options","EventEmitter","_a","container","resolveContainer","base","createIframe","e","raw","msg","__spreadValues","event","cb","muted","token","_b","_c","_d","_e","m","cmd"]}
|