kasunk99-livestream-core 0.2.9 → 0.3.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.
@@ -25,6 +25,7 @@ export type HostChatMessage = {
25
25
  export type UseHostSocketReturn = HostState & {
26
26
  chatMessages: HostChatMessage[];
27
27
  setDisplayName: (name: string) => void;
28
+ sendChatMessage: (text: string) => void;
28
29
  startPreview: () => Promise<void>;
29
30
  stopPreview: () => void;
30
31
  startLive: () => Promise<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,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"}
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,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,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,CA4nBrF"}
@@ -172,6 +172,31 @@ export function useHostSocket(options = {}) {
172
172
  const onIceServers = (servers) => {
173
173
  hostSession.iceServers = Array.isArray(servers) ? servers : [];
174
174
  };
175
+ socket.on('connect', onConnect);
176
+ socket.on('connect_error', onConnectError);
177
+ socket.on('disconnect', onDisconnect);
178
+ socket.on('ice-servers', onIceServers);
179
+ return () => {
180
+ socket.off('connect', onConnect);
181
+ socket.off('connect_error', onConnectError);
182
+ socket.off('disconnect', onDisconnect);
183
+ socket.off('ice-servers', onIceServers);
184
+ };
185
+ }, [fullCleanup]);
186
+ // ── Chat subscription ──────────────────────────────────────────────────────
187
+ // Registered on a separate effect keyed to live state so it is guaranteed to
188
+ // be active only while the host is in the room (socket.join runs as part of
189
+ // startLive). Registering it in the socket setup effect is too early — the host
190
+ // has not joined the room yet, and reconnects after navigate-away clear the
191
+ // room membership, so we need to re-register on every live transition.
192
+ useEffect(() => {
193
+ if (!state.live) {
194
+ setChatMessages([]);
195
+ return;
196
+ }
197
+ const socket = hostSession.socket;
198
+ if (!socket)
199
+ return;
175
200
  const onChatMessage = (msg) => {
176
201
  if (!msg || typeof msg !== 'object')
177
202
  return;
@@ -184,19 +209,10 @@ export function useHostSocket(options = {}) {
184
209
  const id = `${String(m.peerId ?? 'p')}-${timestamp}-${text.slice(0, 6)}`;
185
210
  setChatMessages((prev) => [...prev.slice(-99), { id, displayName, text, timestamp }]);
186
211
  };
187
- socket.on('connect', onConnect);
188
- socket.on('connect_error', onConnectError);
189
- socket.on('disconnect', onDisconnect);
190
- socket.on('ice-servers', onIceServers);
191
212
  socket.on('chat-message', onChatMessage);
192
- return () => {
193
- socket.off('connect', onConnect);
194
- socket.off('connect_error', onConnectError);
195
- socket.off('disconnect', onDisconnect);
196
- socket.off('ice-servers', onIceServers);
197
- socket.off('chat-message', onChatMessage);
198
- };
199
- }, [fullCleanup]);
213
+ return () => { socket.off('chat-message', onChatMessage); };
214
+ // eslint-disable-next-line react-hooks/exhaustive-deps
215
+ }, [state.live]);
200
216
  // ── Permissions ────────────────────────────────────────────────────────────
201
217
  const requestCameraMicPermissions = useCallback(async () => {
202
218
  if (Platform.OS !== 'android')
@@ -561,10 +577,17 @@ export function useHostSocket(options = {}) {
561
577
  const setDisplayName = useCallback((name) => {
562
578
  patchHostState({ displayName: name });
563
579
  }, []);
580
+ const sendChatMessage = useCallback((text) => {
581
+ const trimmed = text.trim();
582
+ if (!trimmed || !hostSession.socket?.connected)
583
+ return;
584
+ hostSession.socket.emit('chat-message', { text: trimmed });
585
+ }, []);
564
586
  return {
565
587
  ...state,
566
588
  chatMessages,
567
589
  setDisplayName,
590
+ sendChatMessage,
568
591
  startPreview,
569
592
  stopPreview,
570
593
  startLive,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kasunk99-livestream-core",
3
- "version": "0.2.9",
3
+ "version": "0.3.0",
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",