kasunk99-livestream-core 0.2.8 → 0.2.9

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.
@@ -16,7 +16,14 @@ export type UseHostSocketOptions = {
16
16
  /** App-level user ID forwarded to the server on join-room (optional). */
17
17
  hostUserId?: string;
18
18
  };
19
+ export type HostChatMessage = {
20
+ id: string;
21
+ displayName: string;
22
+ text: string;
23
+ timestamp: number;
24
+ };
19
25
  export type UseHostSocketReturn = HostState & {
26
+ chatMessages: HostChatMessage[];
20
27
  setDisplayName: (name: string) => void;
21
28
  startPreview: () => Promise<void>;
22
29
  stopPreview: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"useHostSocket.d.ts","sourceRoot":"","sources":["../../src/hooks/useHostSocket.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAYH,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,mBAAmB,CAAC;AAoB3B,MAAM,MAAM,oBAAoB,GAAG;IACjC,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG;IAC5C,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,gBAAgB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC,CAAC;AAMF,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,mBAAmB,CAmlBrF"}
1
+ {"version":3,"file":"useHostSocket.d.ts","sourceRoot":"","sources":["../../src/hooks/useHostSocket.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAYH,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,mBAAmB,CAAC;AAoB3B,MAAM,MAAM,oBAAoB,GAAG;IACjC,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG;IAC5C,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,gBAAgB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC,CAAC;AAMF,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,mBAAmB,CAmmBrF"}
@@ -36,6 +36,7 @@ export function useHostSocket(options = {}) {
36
36
  // Subscribe to module-level state so all hook instances stay in sync
37
37
  // and the state survives remount (tab navigation).
38
38
  const [state, setLocalState] = useState(getHostState);
39
+ const [chatMessages, setChatMessages] = useState([]);
39
40
  useEffect(() => {
40
41
  // If the store has a streamURL but our local copy doesn't (fresh mount),
41
42
  // restore it from the active stream so the preview shows immediately.
@@ -107,6 +108,7 @@ export function useHostSocket(options = {}) {
107
108
  }
108
109
  catch { /* ignore */ }
109
110
  resetHostState();
111
+ setChatMessages([]);
110
112
  // Step 3 — stop tracks deferred: give the executor a moment to finish pc.close().
111
113
  // Screen stream: use release() not t.stop(). release() calls TrackPrivate.dispose()
112
114
  // → ScreenCaptureController.dispose() → MediaProjectionService.abort() +
@@ -170,15 +172,29 @@ export function useHostSocket(options = {}) {
170
172
  const onIceServers = (servers) => {
171
173
  hostSession.iceServers = Array.isArray(servers) ? servers : [];
172
174
  };
175
+ const onChatMessage = (msg) => {
176
+ if (!msg || typeof msg !== 'object')
177
+ return;
178
+ const m = msg;
179
+ const text = typeof m.text === 'string' ? m.text.trim() : '';
180
+ if (!text)
181
+ return;
182
+ const displayName = typeof m.displayName === 'string' ? m.displayName : 'User';
183
+ const timestamp = typeof m.timestamp === 'number' ? m.timestamp : Date.now();
184
+ const id = `${String(m.peerId ?? 'p')}-${timestamp}-${text.slice(0, 6)}`;
185
+ setChatMessages((prev) => [...prev.slice(-99), { id, displayName, text, timestamp }]);
186
+ };
173
187
  socket.on('connect', onConnect);
174
188
  socket.on('connect_error', onConnectError);
175
189
  socket.on('disconnect', onDisconnect);
176
190
  socket.on('ice-servers', onIceServers);
191
+ socket.on('chat-message', onChatMessage);
177
192
  return () => {
178
193
  socket.off('connect', onConnect);
179
194
  socket.off('connect_error', onConnectError);
180
195
  socket.off('disconnect', onDisconnect);
181
196
  socket.off('ice-servers', onIceServers);
197
+ socket.off('chat-message', onChatMessage);
182
198
  };
183
199
  }, [fullCleanup]);
184
200
  // ── Permissions ────────────────────────────────────────────────────────────
@@ -547,6 +563,7 @@ export function useHostSocket(options = {}) {
547
563
  }, []);
548
564
  return {
549
565
  ...state,
566
+ chatMessages,
550
567
  setDisplayName,
551
568
  startPreview,
552
569
  stopPreview,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kasunk99-livestream-core",
3
- "version": "0.2.8",
3
+ "version": "0.2.9",
4
4
  "description": "Reusable livestream viewer/host module for React Native (Expo) — mediasoup + Socket.IO",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",