kasunk99-livestream-core 0.3.5 → 0.3.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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LiveStreamViewerItem.d.ts","sourceRoot":"","sources":["../../src/components/LiveStreamViewerItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqD,MAAM,OAAO,CAAC;AAe1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAK/C,KAAK,yBAAyB,GAAG;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAgBF;;GAEG;AACH,eAAO,MAAM,oBAAoB,
|
|
1
|
+
{"version":3,"file":"LiveStreamViewerItem.d.ts","sourceRoot":"","sources":["../../src/components/LiveStreamViewerItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqD,MAAM,OAAO,CAAC;AAe1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAK/C,KAAK,yBAAyB,GAAG;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAgBF;;GAEG;AACH,eAAO,MAAM,oBAAoB,uDAyW/B,CAAC"}
|
|
@@ -133,9 +133,21 @@ export const LiveStreamViewerItem = memo(function LiveStreamViewerItem({ stream,
|
|
|
133
133
|
return next;
|
|
134
134
|
});
|
|
135
135
|
};
|
|
136
|
+
const onViewerJoined = (msg) => {
|
|
137
|
+
const m = msg;
|
|
138
|
+
const name = typeof m.displayName === 'string' ? m.displayName : 'Someone';
|
|
139
|
+
const timestamp = Date.now();
|
|
140
|
+
const id = `${roomId}-join-${String(m.peerId ?? timestamp)}-${timestamp}`;
|
|
141
|
+
setChatMessages((prev) => [
|
|
142
|
+
...prev,
|
|
143
|
+
{ id, displayName: '', text: `${name} joined`, timestamp },
|
|
144
|
+
]);
|
|
145
|
+
};
|
|
136
146
|
socket.on('chat-message', onChatMessage);
|
|
147
|
+
socket.on('viewer-joined', onViewerJoined);
|
|
137
148
|
return () => {
|
|
138
149
|
socket.off('chat-message', onChatMessage);
|
|
150
|
+
socket.off('viewer-joined', onViewerJoined);
|
|
139
151
|
};
|
|
140
152
|
}, [isActive, roomId, socket]);
|
|
141
153
|
// Render messages in natural order (oldest -> newest).
|
|
@@ -205,7 +217,7 @@ export const LiveStreamViewerItem = memo(function LiveStreamViewerItem({ stream,
|
|
|
205
217
|
}
|
|
206
218
|
});
|
|
207
219
|
};
|
|
208
|
-
return (_jsxs(View, { style: styles.container, children: [showVideo && RTCViewComponent && streamURL ? (_jsx(RTCViewComponent, { streamURL: streamURL, stream: displayStream, style: styles.rtcView, objectFit: "
|
|
220
|
+
return (_jsxs(View, { style: styles.container, children: [showVideo && RTCViewComponent && streamURL ? (_jsx(RTCViewComponent, { streamURL: streamURL, stream: displayStream, style: styles.rtcView, objectFit: "cover", mirror: false }, `rtc-${trackCount}-${streamURL}`)) : (_jsxs(View, { style: styles.videoPlaceholder, children: [joining && _jsx(Text, { style: styles.placeholderText, children: "Joining..." }), error && _jsx(Text, { style: [styles.placeholderText, styles.errorText], children: error }), joined && !joining && !error && (_jsxs(_Fragment, { children: [_jsx(Text, { style: styles.liveBadge, children: "LIVE" }), _jsx(Text, { style: styles.placeholderText, children: stream.roomId }), hasVideo && webrtcUnavailable && (_jsxs(Text, { style: [styles.hintText, styles.warnText], children: ["Video needs a development build.", '\n', "Run: npx expo run:android"] })), hasVideo && consumeError && (_jsx(Text, { style: [styles.hintText, styles.errorText], children: consumeError })), hasVideo && !remoteStream && !webrtcUnavailable && !consumeError && (_jsx(Text, { style: styles.hintText, children: "Loading video..." })), !hasVideo && joined && producerList.length === 0 && (_jsxs(Text, { style: [styles.hintText, styles.warnText], children: ["Host has not started camera yet.", '\n', "Use a web client to stream, or wait for host to produce."] })), hasVideo && remoteStream && !RTCViewComponent && (_jsx(Text, { style: styles.hintText, children: "Video received (use dev build to see it)" })), hasVideo && remoteStream && RTCViewComponent && !hasVideoTrack && (_jsx(Text, { style: [styles.hintText, styles.warnText], children: "Audio only (no video track yet)" })), hasVideo && remoteStream && hasVideoTrack && !streamURL && (_jsx(Text, { style: [styles.hintText, styles.warnText], children: "Video track received but cannot display (need dev build with react-native-webrtc)" }))] }))] })), _jsxs(View, { style: styles.overlay, children: [_jsxs(View, { style: styles.topMeta, children: [_jsx(View, { style: styles.row, children: _jsxs(Text, { style: styles.roomId, numberOfLines: 1, children: ["LIVE \u00B7 ", stream.hostDisplayName || stream.title || stream.roomId] }) }), _jsx(View, { style: styles.stats, children: _jsxs(Text, { style: styles.statsText, children: ["\uD83D\uDC41 ", viewerCount] }) })] }), _jsx(Animated.View, { style: [styles.chatPanel, { bottom: chatBottomAnim }], pointerEvents: "box-none", children: _jsxs(ScrollView, { scrollEnabled: false, keyboardShouldPersistTaps: "always", contentContainerStyle: styles.chatStack, children: [_jsx(View, { style: styles.chatListWrapper, children: _jsx(ScrollView, { ref: chatListRef, contentContainerStyle: styles.chatListContent, showsVerticalScrollIndicator: false, keyboardDismissMode: "on-drag", keyboardShouldPersistTaps: "always", nestedScrollEnabled: true, children: chatData.map((item) => (_jsxs(Text, { style: styles.chatLine, numberOfLines: 2, children: [_jsx(Text, { style: [styles.chatName, { color: getNameColor(item.displayName) }], children: item.displayName }), _jsxs(Text, { style: styles.chatText, children: [" ", item.text] })] }, item.id))) }) }), _jsxs(View, { style: styles.chatInputRow, children: [_jsx(TextInput, { style: styles.chatInput, value: chatInput, onChangeText: setChatInput, placeholder: joined ? 'Say something...' : 'Connecting...', placeholderTextColor: "#9ca3af", editable: joined && !joining && !error, onSubmitEditing: sendChat, returnKeyType: "send" }), _jsx(TouchableOpacity, { onPress: sendChat, disabled: !joined || joining || !!error || !chatInput.trim(), style: [
|
|
209
221
|
styles.chatSendButton,
|
|
210
222
|
(!joined || joining || !!error || !chatInput.trim()) && styles.chatSendButtonDisabled,
|
|
211
223
|
], children: _jsx(Text, { style: styles.chatSendText, children: "\u27A4" }) })] })] }) })] })] }));
|
|
@@ -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,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,
|
|
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,CAgrBrF"}
|
|
@@ -214,8 +214,22 @@ export function useHostSocket(options = {}) {
|
|
|
214
214
|
const id = `${String(m.peerId ?? 'p')}-${timestamp}-${text.slice(0, 6)}`;
|
|
215
215
|
setChatMessages((prev) => [...prev.slice(-99), { id, displayName, text, timestamp }]);
|
|
216
216
|
};
|
|
217
|
+
const onViewerJoined = (msg) => {
|
|
218
|
+
const m = msg;
|
|
219
|
+
const name = typeof m.displayName === 'string' ? m.displayName : 'Someone';
|
|
220
|
+
const timestamp = Date.now();
|
|
221
|
+
const id = `join-${String(m.peerId ?? timestamp)}-${timestamp}`;
|
|
222
|
+
setChatMessages((prev) => [
|
|
223
|
+
...prev.slice(-99),
|
|
224
|
+
{ id, displayName: '', text: `${name} joined`, timestamp },
|
|
225
|
+
]);
|
|
226
|
+
};
|
|
217
227
|
socket.on('chat-message', onChatMessage);
|
|
218
|
-
|
|
228
|
+
socket.on('viewer-joined', onViewerJoined);
|
|
229
|
+
return () => {
|
|
230
|
+
socket.off('chat-message', onChatMessage);
|
|
231
|
+
socket.off('viewer-joined', onViewerJoined);
|
|
232
|
+
};
|
|
219
233
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
220
234
|
}, [state.live]);
|
|
221
235
|
// ── Permissions ────────────────────────────────────────────────────────────
|
|
@@ -249,8 +263,8 @@ export function useHostSocket(options = {}) {
|
|
|
249
263
|
video: {
|
|
250
264
|
facingMode: front ? 'user' : 'environment',
|
|
251
265
|
frameRate: 30,
|
|
252
|
-
width:
|
|
253
|
-
height:
|
|
266
|
+
width: { ideal: 1080, max: 1080 },
|
|
267
|
+
height: { ideal: 1920, max: 1920 },
|
|
254
268
|
},
|
|
255
269
|
}));
|
|
256
270
|
hostSession.localStream = stream;
|
|
@@ -312,7 +326,7 @@ export function useHostSocket(options = {}) {
|
|
|
312
326
|
hostSession.videoProducer = null;
|
|
313
327
|
const producer = await transport.produce({
|
|
314
328
|
track: newTrack,
|
|
315
|
-
encodings: [{ maxBitrate:
|
|
329
|
+
encodings: [{ maxBitrate: 2500000 }],
|
|
316
330
|
codecOptions: { videoSimulcastLayers: [] },
|
|
317
331
|
});
|
|
318
332
|
hostSession.videoProducer = producer;
|
|
@@ -353,8 +367,8 @@ export function useHostSocket(options = {}) {
|
|
|
353
367
|
video: {
|
|
354
368
|
facingMode: front ? 'user' : 'environment',
|
|
355
369
|
frameRate: 30,
|
|
356
|
-
width:
|
|
357
|
-
height:
|
|
370
|
+
width: { ideal: 1080, max: 1080 },
|
|
371
|
+
height: { ideal: 1920, max: 1920 },
|
|
358
372
|
},
|
|
359
373
|
}));
|
|
360
374
|
// fullCleanup may have run while awaiting getUserMedia
|
|
@@ -557,7 +571,7 @@ export function useHostSocket(options = {}) {
|
|
|
557
571
|
for (const track of tracksToPublish) {
|
|
558
572
|
const producer = await transport.produce({
|
|
559
573
|
track: track,
|
|
560
|
-
encodings: track.kind === 'video' ? [{ maxBitrate:
|
|
574
|
+
encodings: track.kind === 'video' ? [{ maxBitrate: 2500000 }] : undefined,
|
|
561
575
|
codecOptions: track.kind === 'video'
|
|
562
576
|
? { videoSimulcastLayers: [] }
|
|
563
577
|
: undefined,
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,UAAU,EACV,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,cAAc,GACf,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAClG,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACnH,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAEzE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGvF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EACL,YAAY,EACZ,cAAc,EACd,cAAc,EACd,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
* @livestream/core — Reusable livestream module for React Native (Expo).
|
|
3
3
|
* Configure with setLivestreamConfig() before using components/hooks.
|
|
4
4
|
*/
|
|
5
|
-
//kk
|
|
6
5
|
export { setLivestreamConfig, getLivestreamConfig, getBaseUrl, getApiKey, getSignalingUrl, getSignalingWsUrl, getDisplayName, } from './config';
|
|
7
6
|
export { fetchActiveStreams, createStream, mintViewerToken } from './services/livestream.service';
|
|
8
7
|
export { ensureMediasoupGlobals } from './services/mediasoup-init';
|
package/package.json
CHANGED