@burdenoff/microfe-comradecircle 2026.1025.2 → 2026.1025.3
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/comradecircle/components/LiveStagePanel.d.ts +10 -0
- package/dist/comradecircle/components/LiveStagePanel.d.ts.map +1 -0
- package/dist/comradecircle/components/LiveStagePanel.js +263 -0
- package/dist/comradecircle/components/LiveStagePanel.js.map +1 -0
- package/dist/comradecircle/components/MediaTile.d.ts +16 -0
- package/dist/comradecircle/components/MediaTile.d.ts.map +1 -0
- package/dist/comradecircle/components/MediaTile.js +74 -0
- package/dist/comradecircle/components/MediaTile.js.map +1 -0
- package/dist/comradecircle/components/VoiceChannelPanel.d.ts +10 -0
- package/dist/comradecircle/components/VoiceChannelPanel.d.ts.map +1 -0
- package/dist/comradecircle/components/VoiceChannelPanel.js +123 -0
- package/dist/comradecircle/components/VoiceChannelPanel.js.map +1 -0
- package/dist/comradecircle/hooks/index.d.ts +3 -0
- package/dist/comradecircle/hooks/index.d.ts.map +1 -1
- package/dist/comradecircle/hooks/index.js +3 -0
- package/dist/comradecircle/hooks/useLiveStage.d.ts +20 -0
- package/dist/comradecircle/hooks/useLiveStage.d.ts.map +1 -0
- package/dist/comradecircle/hooks/useLiveStage.js +160 -0
- package/dist/comradecircle/hooks/useLiveStage.js.map +1 -0
- package/dist/comradecircle/hooks/useVoiceApi.d.ts +36 -0
- package/dist/comradecircle/hooks/useVoiceApi.d.ts.map +1 -0
- package/dist/comradecircle/hooks/useVoiceApi.js +113 -0
- package/dist/comradecircle/hooks/useVoiceApi.js.map +1 -0
- package/dist/comradecircle/hooks/useVoiceCall.d.ts +21 -0
- package/dist/comradecircle/hooks/useVoiceCall.d.ts.map +1 -0
- package/dist/comradecircle/hooks/useVoiceCall.js +154 -0
- package/dist/comradecircle/hooks/useVoiceCall.js.map +1 -0
- package/dist/comradecircle/lib/graphqlStream.d.ts +31 -0
- package/dist/comradecircle/lib/graphqlStream.d.ts.map +1 -0
- package/dist/comradecircle/lib/graphqlStream.js +112 -0
- package/dist/comradecircle/lib/graphqlStream.js.map +1 -0
- package/dist/comradecircle/lib/rtc/liveStage.d.ts +37 -0
- package/dist/comradecircle/lib/rtc/liveStage.d.ts.map +1 -0
- package/dist/comradecircle/lib/rtc/liveStage.js +97 -0
- package/dist/comradecircle/lib/rtc/liveStage.js.map +1 -0
- package/dist/comradecircle/lib/rtc/peerLink.d.ts +50 -0
- package/dist/comradecircle/lib/rtc/peerLink.d.ts.map +1 -0
- package/dist/comradecircle/lib/rtc/peerLink.js +110 -0
- package/dist/comradecircle/lib/rtc/peerLink.js.map +1 -0
- package/dist/comradecircle/lib/rtc/voiceMesh.d.ts +41 -0
- package/dist/comradecircle/lib/rtc/voiceMesh.d.ts.map +1 -0
- package/dist/comradecircle/lib/rtc/voiceMesh.js +101 -0
- package/dist/comradecircle/lib/rtc/voiceMesh.js.map +1 -0
- package/dist/comradecircle/pages/circles/CircleDetailPage.d.ts.map +1 -1
- package/dist/comradecircle/pages/circles/CircleDetailPage.js +299 -286
- package/dist/comradecircle/pages/circles/CircleDetailPage.js.map +1 -1
- package/dist/comradecircle/types/index.d.ts +51 -0
- package/dist/comradecircle/types/index.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voiceMesh.js","names":[],"sources":["../../../../src/comradecircle/lib/rtc/voiceMesh.ts"],"sourcesContent":["/**\n * VoiceMesh — the browser side of a bounded mesh voice/video channel\n * (BOFF-4450). One PeerLink per remote participant.\n *\n * Who dials whom: the participant who joined LATER sends the offer to every\n * participant who was already there, once its own signal subscription is\n * open. Earlier participants never dial newcomers; they answer. That rule\n * means an offer is only ever sent to a peer whose subscription is already\n * listening, so no offer is lost to a subscription race. If two people join\n * at the same instant and both dial, perfect negotiation (polite = larger\n * member id) resolves the collision.\n *\n * A watchdog re-dials any link this side initiated that has not connected\n * within CONNECT_TIMEOUT_MS or has failed, and drops links whose member left\n * the roster.\n */\nimport type { ComRtcSignal, ComVoiceParticipant, ComVoiceSignalType } from '../../types';\nimport { PeerLink } from './peerLink';\n\nexport const CONNECT_TIMEOUT_MS = 15_000;\nconst WATCHDOG_INTERVAL_MS = 5_000;\n\nexport interface VoiceMeshOptions {\n selfId: string;\n rtcConfig: RTCConfiguration;\n localStream: MediaStream | null;\n sendSignal: (\n toMemberId: string,\n signalType: ComVoiceSignalType,\n payload: unknown\n ) => Promise<void>;\n onRemoteStreamsChange: (streams: Map<string, MediaStream>) => void;\n onPeerStatesChange?: (states: Map<string, RTCPeerConnectionState>) => void;\n}\n\n/** True when `self` must dial `remote`: self joined later (ties broken by id). */\nexport function shouldInitiate(self: ComVoiceParticipant, remote: ComVoiceParticipant): boolean {\n const selfAt = Date.parse(self.joinedAt);\n const remoteAt = Date.parse(remote.joinedAt);\n if (selfAt !== remoteAt) return selfAt > remoteAt;\n return self.memberId > remote.memberId;\n}\n\nexport class VoiceMesh {\n private readonly options: VoiceMeshOptions;\n private readonly links = new Map<string, PeerLink>();\n private readonly streams = new Map<string, MediaStream>();\n private readonly states = new Map<string, RTCPeerConnectionState>();\n private readonly disconnectedSince = new Map<string, number>();\n private roster: ComVoiceParticipant[] = [];\n private localStream: MediaStream | null;\n private signalingReady = false;\n private watchdog: ReturnType<typeof setInterval> | null = null;\n private disposed = false;\n\n constructor(options: VoiceMeshOptions) {\n this.options = options;\n this.localStream = options.localStream;\n this.watchdog = setInterval(() => this.checkLinks(), WATCHDOG_INTERVAL_MS);\n }\n\n /** Call once the signal subscription has been accepted by the gateway. */\n markSignalingReady(): void {\n this.signalingReady = true;\n this.dialPending();\n }\n\n /** Apply the latest active roster (from the join response, heartbeat or roster subscription). */\n updateRoster(participants: ComVoiceParticipant[]): void {\n if (this.disposed) return;\n this.roster = participants.filter((p) => !p.leftAt);\n const present = new Set(this.roster.map((p) => p.memberId));\n for (const remoteId of [...this.links.keys()]) {\n if (!present.has(remoteId)) this.dropLink(remoteId);\n }\n this.dialPending();\n }\n\n /** Route an inbound relayed signal to its link, creating an answering link on a first offer. */\n async handleSignal(signal: ComRtcSignal): Promise<void> {\n if (this.disposed || signal.fromMemberId === this.options.selfId) return;\n let link = this.links.get(signal.fromMemberId);\n if (!link) {\n if (signal.signalType !== 'OFFER') return;\n link = this.createLink(signal.fromMemberId, false);\n }\n try {\n await link.handleSignal(signal.signalType, signal.payload);\n } catch {\n // A broken negotiation is recovered by the watchdog.\n }\n }\n\n setLocalStream(stream: MediaStream | null): void {\n this.localStream = stream;\n for (const link of this.links.values()) link.setLocalStream(stream);\n }\n\n dispose(): void {\n this.disposed = true;\n if (this.watchdog) clearInterval(this.watchdog);\n for (const remoteId of [...this.links.keys()]) this.dropLink(remoteId, false);\n this.emit();\n }\n\n private self(): ComVoiceParticipant | undefined {\n return this.roster.find((p) => p.memberId === this.options.selfId);\n }\n\n private dialPending(): void {\n if (!this.signalingReady || this.disposed) return;\n const self = this.self();\n if (!self) return;\n for (const remote of this.roster) {\n if (remote.memberId === self.memberId || this.links.has(remote.memberId)) continue;\n if (shouldInitiate(self, remote)) this.createLink(remote.memberId, true);\n }\n }\n\n private createLink(remoteId: string, initiator: boolean): PeerLink {\n const link = new PeerLink({\n remoteId,\n initiator,\n polite: this.options.selfId > remoteId,\n rtcConfig: this.options.rtcConfig,\n localStream: this.localStream,\n send: (signalType, payload) => this.options.sendSignal(remoteId, signalType, payload),\n onRemoteStream: (stream) => {\n this.streams.set(remoteId, stream);\n this.emit();\n },\n onStateChange: (state) => {\n this.states.set(remoteId, state);\n this.options.onPeerStatesChange?.(new Map(this.states));\n },\n });\n this.links.set(remoteId, link);\n this.states.set(remoteId, 'new');\n this.options.onPeerStatesChange?.(new Map(this.states));\n return link;\n }\n\n private dropLink(remoteId: string, notify = true): void {\n this.links.get(remoteId)?.close();\n this.links.delete(remoteId);\n this.streams.delete(remoteId);\n this.states.delete(remoteId);\n if (notify) {\n this.emit();\n this.options.onPeerStatesChange?.(new Map(this.states));\n }\n }\n\n private checkLinks(): void {\n if (this.disposed) return;\n const now = Date.now();\n for (const [remoteId, link] of [...this.links.entries()]) {\n const state = link.connectionState;\n if (state === 'disconnected') {\n if (!this.disconnectedSince.has(remoteId)) this.disconnectedSince.set(remoteId, now);\n } else {\n this.disconnectedSince.delete(remoteId);\n }\n const neverConnected =\n (state === 'new' || state === 'connecting') && now - link.createdAt > CONNECT_TIMEOUT_MS;\n const lostConnection =\n now - (this.disconnectedSince.get(remoteId) ?? now) > CONNECT_TIMEOUT_MS;\n if (state === 'failed' || state === 'closed' || neverConnected || lostConnection) {\n this.disconnectedSince.delete(remoteId);\n const redial = link.initiator;\n this.dropLink(remoteId);\n // The answering side waits for the initiator to dial again.\n if (redial) this.dialPending();\n }\n }\n }\n\n private emit(): void {\n this.options.onRemoteStreamsChange(new Map(this.streams));\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CircleDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/comradecircle/pages/circles/CircleDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"CircleDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/comradecircle/pages/circles/CircleDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAmGH,wBAAgB,gBAAgB,4CAoL/B"}
|