@tiledev/sdk-apptile-live-selling 0.1.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.
- package/README.md +322 -0
- package/android/build.gradle +33 -0
- package/android/src/main/AndroidManifest.xml +7 -0
- package/android/src/main/java/expo/modules/livepip/LivePipModule.kt +310 -0
- package/app.plugin.js +3 -0
- package/dist/auctions.d.ts +3 -0
- package/dist/auctions.d.ts.map +1 -0
- package/dist/auctions.js +152 -0
- package/dist/auctions.js.map +1 -0
- package/dist/client.d.ts +63 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +154 -0
- package/dist/client.js.map +1 -0
- package/dist/clips.d.ts +3 -0
- package/dist/clips.d.ts.map +1 -0
- package/dist/clips.js +53 -0
- package/dist/clips.js.map +1 -0
- package/dist/commentLinks.d.ts +46 -0
- package/dist/commentLinks.d.ts.map +1 -0
- package/dist/commentLinks.js +120 -0
- package/dist/commentLinks.js.map +1 -0
- package/dist/engine.d.ts +13 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +40 -0
- package/dist/engine.js.map +1 -0
- package/dist/engine.native.d.ts +3 -0
- package/dist/engine.native.d.ts.map +1 -0
- package/dist/engine.native.js +815 -0
- package/dist/engine.native.js.map +1 -0
- package/dist/flags.d.ts +5 -0
- package/dist/flags.d.ts.map +1 -0
- package/dist/flags.js +61 -0
- package/dist/flags.js.map +1 -0
- package/dist/guest.d.ts +5 -0
- package/dist/guest.d.ts.map +1 -0
- package/dist/guest.js +89 -0
- package/dist/guest.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +80 -0
- package/dist/index.js.map +1 -0
- package/dist/liveSelling.d.ts +3 -0
- package/dist/liveSelling.d.ts.map +1 -0
- package/dist/liveSelling.js +44 -0
- package/dist/liveSelling.js.map +1 -0
- package/dist/nativeViewTag.d.ts +15 -0
- package/dist/nativeViewTag.d.ts.map +1 -0
- package/dist/nativeViewTag.js +23 -0
- package/dist/nativeViewTag.js.map +1 -0
- package/dist/pip.d.ts +14 -0
- package/dist/pip.d.ts.map +1 -0
- package/dist/pip.js +15 -0
- package/dist/pip.js.map +1 -0
- package/dist/pip.native.d.ts +11 -0
- package/dist/pip.native.d.ts.map +1 -0
- package/dist/pip.native.js +47 -0
- package/dist/pip.native.js.map +1 -0
- package/dist/polls.d.ts +11 -0
- package/dist/polls.d.ts.map +1 -0
- package/dist/polls.js +135 -0
- package/dist/polls.js.map +1 -0
- package/dist/react/LiveSellingProvider.d.ts +16 -0
- package/dist/react/LiveSellingProvider.d.ts.map +1 -0
- package/dist/react/LiveSellingProvider.js +49 -0
- package/dist/react/LiveSellingProvider.js.map +1 -0
- package/dist/react/LiveVideoTarget.d.ts +22 -0
- package/dist/react/LiveVideoTarget.d.ts.map +1 -0
- package/dist/react/LiveVideoTarget.js +73 -0
- package/dist/react/LiveVideoTarget.js.map +1 -0
- package/dist/react/index.d.ts +19 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +43 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/useAuction.d.ts +28 -0
- package/dist/react/useAuction.d.ts.map +1 -0
- package/dist/react/useAuction.js +66 -0
- package/dist/react/useAuction.js.map +1 -0
- package/dist/react/useAuctionBidGate.d.ts +48 -0
- package/dist/react/useAuctionBidGate.d.ts.map +1 -0
- package/dist/react/useAuctionBidGate.js +144 -0
- package/dist/react/useAuctionBidGate.js.map +1 -0
- package/dist/react/useAuctionWins.d.ts +51 -0
- package/dist/react/useAuctionWins.d.ts.map +1 -0
- package/dist/react/useAuctionWins.js +268 -0
- package/dist/react/useAuctionWins.js.map +1 -0
- package/dist/react/useClips.d.ts +9 -0
- package/dist/react/useClips.d.ts.map +1 -0
- package/dist/react/useClips.js +37 -0
- package/dist/react/useClips.js.map +1 -0
- package/dist/react/useLiveSession.d.ts +34 -0
- package/dist/react/useLiveSession.d.ts.map +1 -0
- package/dist/react/useLiveSession.js +876 -0
- package/dist/react/useLiveSession.js.map +1 -0
- package/dist/react/useLiveStreams.d.ts +9 -0
- package/dist/react/useLiveStreams.d.ts.map +1 -0
- package/dist/react/useLiveStreams.js +35 -0
- package/dist/react/useLiveStreams.js.map +1 -0
- package/dist/react/useOngoingLive.d.ts +13 -0
- package/dist/react/useOngoingLive.d.ts.map +1 -0
- package/dist/react/useOngoingLive.js +45 -0
- package/dist/react/useOngoingLive.js.map +1 -0
- package/dist/react/useReplays.d.ts +15 -0
- package/dist/react/useReplays.d.ts.map +1 -0
- package/dist/react/useReplays.js +66 -0
- package/dist/react/useReplays.js.map +1 -0
- package/dist/react/useStreamInfo.d.ts +21 -0
- package/dist/react/useStreamInfo.d.ts.map +1 -0
- package/dist/react/useStreamInfo.js +125 -0
- package/dist/react/useStreamInfo.js.map +1 -0
- package/dist/replays.d.ts +3 -0
- package/dist/replays.d.ts.map +1 -0
- package/dist/replays.js +114 -0
- package/dist/replays.js.map +1 -0
- package/dist/session.d.ts +23 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +464 -0
- package/dist/session.js.map +1 -0
- package/dist/sessionTypes.d.ts +462 -0
- package/dist/sessionTypes.d.ts.map +1 -0
- package/dist/sessionTypes.js +55 -0
- package/dist/sessionTypes.js.map +1 -0
- package/dist/streams.d.ts +67 -0
- package/dist/streams.d.ts.map +1 -0
- package/dist/streams.js +170 -0
- package/dist/streams.js.map +1 -0
- package/dist/types.d.ts +591 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +17 -0
- package/dist/types.js.map +1 -0
- package/dist/viewer.d.ts +5 -0
- package/dist/viewer.d.ts.map +1 -0
- package/dist/viewer.js +66 -0
- package/dist/viewer.js.map +1 -0
- package/dist/wire.d.ts +155 -0
- package/dist/wire.d.ts.map +1 -0
- package/dist/wire.js +73 -0
- package/dist/wire.js.map +1 -0
- package/dist/zego.d.ts +83 -0
- package/dist/zego.d.ts.map +1 -0
- package/dist/zego.js +13 -0
- package/dist/zego.js.map +1 -0
- package/expo-module.config.json +9 -0
- package/ios/LivePip.podspec +20 -0
- package/ios/LivePipController.swift +327 -0
- package/ios/LivePipModule.swift +35 -0
- package/package.json +91 -0
- package/plugin/build/index.d.ts +29 -0
- package/plugin/build/index.js +101 -0
- package/react/package.json +6 -0
package/dist/session.js
ADDED
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.initialSessionState = exports.REACTION_MS = exports.SOLD_CARD_MS = void 0;
|
|
4
|
+
exports.sessionReducer = sessionReducer;
|
|
5
|
+
exports.remainingMs = remainingMs;
|
|
6
|
+
exports.timeLeftMs = timeLeftMs;
|
|
7
|
+
exports.deriveStatus = deriveStatus;
|
|
8
|
+
/** Rolling windows. Nothing on screen reaches past a few dozen comments. */
|
|
9
|
+
const MAX_COMMENTS = 300;
|
|
10
|
+
const MAX_SOLD_CARDS = 4;
|
|
11
|
+
const MAX_REACTIONS = 30;
|
|
12
|
+
/**
|
|
13
|
+
* Transient cards carry their own lifetime; `prune` is driven by the session's 1s tick.
|
|
14
|
+
*
|
|
15
|
+
* Ten seconds because that is `VISIBLE_DURATION_MS` in the host's own `SoldAnnouncementCards` widget,
|
|
16
|
+
* and the two render the same room side by side — a sale that leaves a viewer's screen four seconds
|
|
17
|
+
* before it leaves the host's dashboard is the same event with two durations. It was 6s.
|
|
18
|
+
*/
|
|
19
|
+
exports.SOLD_CARD_MS = 10000;
|
|
20
|
+
exports.REACTION_MS = 4000;
|
|
21
|
+
/**
|
|
22
|
+
* Zero-video quality samples before the picture counts as gone.
|
|
23
|
+
*
|
|
24
|
+
* Samples land every ~3s, and the first one after a bind is legitimately zero — frames have not
|
|
25
|
+
* started flowing yet — so one is a false positive on every join. Two is ~5s to a placeholder,
|
|
26
|
+
* against a black rectangle that otherwise never resolves.
|
|
27
|
+
*/
|
|
28
|
+
const IDLE_SAMPLES_BEFORE_STALLED = 2;
|
|
29
|
+
exports.initialSessionState = {
|
|
30
|
+
connected: false,
|
|
31
|
+
ended: false,
|
|
32
|
+
publishing: false,
|
|
33
|
+
videoBroken: false,
|
|
34
|
+
audioBroken: false,
|
|
35
|
+
videoIdleSamples: 0,
|
|
36
|
+
rawViewerCount: 0,
|
|
37
|
+
multiplierOverride: null,
|
|
38
|
+
comments: [],
|
|
39
|
+
activeStoreProductId: null,
|
|
40
|
+
extraStoreProductIds: [],
|
|
41
|
+
removedStoreProductIds: [],
|
|
42
|
+
sold: [],
|
|
43
|
+
reactions: [],
|
|
44
|
+
poll: null,
|
|
45
|
+
pollResults: null,
|
|
46
|
+
votedOptionId: null,
|
|
47
|
+
mutedDeviceIds: [],
|
|
48
|
+
guestMode: false,
|
|
49
|
+
guestStatus: 'idle',
|
|
50
|
+
guestSlot: null,
|
|
51
|
+
guestMutedByHost: false,
|
|
52
|
+
guestCameraOffByHost: false,
|
|
53
|
+
mixerLayout: null,
|
|
54
|
+
videoTag: null,
|
|
55
|
+
seq: 0,
|
|
56
|
+
biddingOpen: false,
|
|
57
|
+
endsAtMs: 0,
|
|
58
|
+
openedEndsAtMs: 0,
|
|
59
|
+
serverOffsetMs: 0,
|
|
60
|
+
highestBid: 0,
|
|
61
|
+
nextBid: 0,
|
|
62
|
+
bidLeader: null,
|
|
63
|
+
auctionExtended: false,
|
|
64
|
+
biddingStoreProductId: null,
|
|
65
|
+
moderatorId: null,
|
|
66
|
+
lastWin: null,
|
|
67
|
+
giveawayStoreProductId: null,
|
|
68
|
+
giveawayEntryCount: 0,
|
|
69
|
+
giveawayRegistered: false,
|
|
70
|
+
giveawayResult: null,
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Everything a round owns, back to nothing.
|
|
74
|
+
*
|
|
75
|
+
* Between lots this has to be exhaustive. A stale `moderatorId` sends the next round's bids to a
|
|
76
|
+
* moderator who is no longer running it, and a stale `nextBid` lets the opening bid of the next lot
|
|
77
|
+
* be clamped upward by the last lot's price.
|
|
78
|
+
*/
|
|
79
|
+
const CLOSED_ROUND = {
|
|
80
|
+
biddingOpen: false,
|
|
81
|
+
endsAtMs: 0,
|
|
82
|
+
openedEndsAtMs: 0,
|
|
83
|
+
serverOffsetMs: 0,
|
|
84
|
+
highestBid: 0,
|
|
85
|
+
nextBid: 0,
|
|
86
|
+
bidLeader: null,
|
|
87
|
+
auctionExtended: false,
|
|
88
|
+
biddingStoreProductId: null,
|
|
89
|
+
moderatorId: null,
|
|
90
|
+
};
|
|
91
|
+
function sessionReducer(state, action) {
|
|
92
|
+
var _a, _b, _c;
|
|
93
|
+
switch (action.kind) {
|
|
94
|
+
case 'reset':
|
|
95
|
+
return exports.initialSessionState;
|
|
96
|
+
case 'ownComment':
|
|
97
|
+
return { ...state, comments: append(state.comments, action.comment, MAX_COMMENTS) };
|
|
98
|
+
case 'vote': {
|
|
99
|
+
if (!state.poll || state.votedOptionId)
|
|
100
|
+
return state;
|
|
101
|
+
// Optimistic, because the bars are only revealed by voting and the host's next tally is
|
|
102
|
+
// seconds away — waiting for it would leave the sheet looking unresponsive.
|
|
103
|
+
const base = (_a = state.pollResults) !== null && _a !== void 0 ? _a : { pollUuid: state.poll.pollUuid, totalVotes: 0, votes: {} };
|
|
104
|
+
return {
|
|
105
|
+
...state,
|
|
106
|
+
votedOptionId: action.optionId,
|
|
107
|
+
pollResults: addVote(base, action.optionId, 1),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
case 'restoreVote': {
|
|
111
|
+
// Guarded on the poll it was cast in: the read is async, so a poll can have ended and another
|
|
112
|
+
// begun meanwhile. The tally is left alone — the service counted this vote long ago, and the
|
|
113
|
+
// standing count arrives with the poll itself.
|
|
114
|
+
if (((_b = state.poll) === null || _b === void 0 ? void 0 : _b.pollUuid) !== action.pollUuid)
|
|
115
|
+
return state;
|
|
116
|
+
if (state.votedOptionId)
|
|
117
|
+
return state;
|
|
118
|
+
return { ...state, votedOptionId: action.optionId };
|
|
119
|
+
}
|
|
120
|
+
case 'voteFailed': {
|
|
121
|
+
if (state.votedOptionId !== action.optionId || !state.pollResults)
|
|
122
|
+
return state;
|
|
123
|
+
return {
|
|
124
|
+
...state,
|
|
125
|
+
votedOptionId: null,
|
|
126
|
+
pollResults: addVote(state.pollResults, action.optionId, -1),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
case 'prune': {
|
|
130
|
+
const sold = state.sold.filter((card) => action.now - card.createdAt < exports.SOLD_CARD_MS);
|
|
131
|
+
const reactions = state.reactions.filter((reaction) => action.now - reaction.createdAt < exports.REACTION_MS);
|
|
132
|
+
if (sold.length === state.sold.length && reactions.length === state.reactions.length) {
|
|
133
|
+
return state;
|
|
134
|
+
}
|
|
135
|
+
return { ...state, sold, reactions };
|
|
136
|
+
}
|
|
137
|
+
case 'auctionExpired':
|
|
138
|
+
return state.biddingOpen ? { ...state, ...CLOSED_ROUND } : state;
|
|
139
|
+
case 'giveawayRegistered':
|
|
140
|
+
return state.giveawayRegistered ? state : { ...state, giveawayRegistered: true };
|
|
141
|
+
case 'giveawaySynced': {
|
|
142
|
+
// A live giveaway-start is more current than the poll it races, so the poll may not name a lot
|
|
143
|
+
// the room already knows about. Only the record can *add* one; only the host can retract it.
|
|
144
|
+
const storeProductId = (_c = action.storeProductId) !== null && _c !== void 0 ? _c : state.giveawayStoreProductId;
|
|
145
|
+
// Our own successful registration must not be undone by a poll that predates it.
|
|
146
|
+
const registered = state.giveawayRegistered || action.registered;
|
|
147
|
+
const entryCount = Math.max(state.giveawayEntryCount, action.entryCount);
|
|
148
|
+
if (storeProductId === state.giveawayStoreProductId &&
|
|
149
|
+
registered === state.giveawayRegistered &&
|
|
150
|
+
entryCount === state.giveawayEntryCount) {
|
|
151
|
+
return state;
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
...state,
|
|
155
|
+
giveawayStoreProductId: storeProductId,
|
|
156
|
+
giveawayEntryCount: entryCount,
|
|
157
|
+
giveawayRegistered: registered,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
case 'dismissWin':
|
|
161
|
+
return state.lastWin ? { ...state, lastWin: null } : state;
|
|
162
|
+
case 'dismissGiveawayResult':
|
|
163
|
+
return state.giveawayResult ? { ...state, giveawayResult: null } : state;
|
|
164
|
+
case 'event':
|
|
165
|
+
return applyEvent(state, action.event, action.at);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function applyEvent(state, event, at) {
|
|
169
|
+
var _a, _b, _c, _d;
|
|
170
|
+
switch (event.type) {
|
|
171
|
+
case 'roomState':
|
|
172
|
+
return { ...state, connected: event.connected };
|
|
173
|
+
case 'streamEnded':
|
|
174
|
+
return { ...state, ended: true };
|
|
175
|
+
case 'publisher':
|
|
176
|
+
// A fresh publish starts the picture from scratch, so old idle samples must not carry over and
|
|
177
|
+
// keep a placeholder up over video that is now arriving.
|
|
178
|
+
return { ...state, publishing: event.publishing, videoIdleSamples: 0 };
|
|
179
|
+
case 'hostMedia':
|
|
180
|
+
return event.kind === 'video'
|
|
181
|
+
? { ...state, videoBroken: event.broken }
|
|
182
|
+
: { ...state, audioBroken: event.broken };
|
|
183
|
+
case 'hostVideo': {
|
|
184
|
+
// Frames back: clear at the first sample, so video reappears as soon as it is really there.
|
|
185
|
+
if (event.receiving) {
|
|
186
|
+
return state.videoIdleSamples === 0 ? state : { ...state, videoIdleSamples: 0 };
|
|
187
|
+
}
|
|
188
|
+
// Already counted as stalled — stop incrementing, or this re-renders every few seconds for ever.
|
|
189
|
+
if (state.videoIdleSamples >= IDLE_SAMPLES_BEFORE_STALLED)
|
|
190
|
+
return state;
|
|
191
|
+
return { ...state, videoIdleSamples: state.videoIdleSamples + 1 };
|
|
192
|
+
}
|
|
193
|
+
case 'viewers':
|
|
194
|
+
return { ...state, rawViewerCount: event.count };
|
|
195
|
+
case 'viewerMultiplier':
|
|
196
|
+
return { ...state, multiplierOverride: event.multiplier };
|
|
197
|
+
case 'productChange':
|
|
198
|
+
return {
|
|
199
|
+
...state,
|
|
200
|
+
activeStoreProductId: event.storeProductId,
|
|
201
|
+
removedStoreProductIds: state.removedStoreProductIds.filter((id) => id !== event.storeProductId),
|
|
202
|
+
extraStoreProductIds: state.extraStoreProductIds.includes(event.storeProductId)
|
|
203
|
+
? state.extraStoreProductIds
|
|
204
|
+
: [...state.extraStoreProductIds, event.storeProductId],
|
|
205
|
+
};
|
|
206
|
+
case 'productRemoved':
|
|
207
|
+
return {
|
|
208
|
+
...state,
|
|
209
|
+
removedStoreProductIds: state.removedStoreProductIds.includes(event.storeProductId)
|
|
210
|
+
? state.removedStoreProductIds
|
|
211
|
+
: [...state.removedStoreProductIds, event.storeProductId],
|
|
212
|
+
activeStoreProductId: state.activeStoreProductId === event.storeProductId ? null : state.activeStoreProductId,
|
|
213
|
+
};
|
|
214
|
+
case 'comment':
|
|
215
|
+
return { ...state, comments: append(state.comments, event.comment, MAX_COMMENTS) };
|
|
216
|
+
case 'reaction': {
|
|
217
|
+
const seq = state.seq + 1;
|
|
218
|
+
return {
|
|
219
|
+
...state,
|
|
220
|
+
seq,
|
|
221
|
+
reactions: append(state.reactions, {
|
|
222
|
+
id: `r${seq}`,
|
|
223
|
+
reactionUrl: event.reactionUrl,
|
|
224
|
+
userName: event.userName,
|
|
225
|
+
createdAt: at,
|
|
226
|
+
}, MAX_REACTIONS),
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
case 'sold': {
|
|
230
|
+
const seq = state.seq + 1;
|
|
231
|
+
return {
|
|
232
|
+
...state,
|
|
233
|
+
seq,
|
|
234
|
+
sold: append(state.sold, { ...event.announcement, id: `s${seq}`, createdAt: at }, MAX_SOLD_CARDS),
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
case 'pollStarted': {
|
|
238
|
+
// The host re-broadcasts this on every vote, so it is both "a poll opened" and "here is the
|
|
239
|
+
// tally again". Keeping the existing poll object when the uuid matches avoids re-deriving the
|
|
240
|
+
// view for an unchanged question; a *different* poll clears the tally and the vote, since
|
|
241
|
+
// carrying either over would credit them to the wrong poll.
|
|
242
|
+
const same = ((_a = state.poll) === null || _a === void 0 ? void 0 : _a.pollUuid) === event.poll.pollUuid;
|
|
243
|
+
const previous = same ? state.pollResults : null;
|
|
244
|
+
const results = event.results ? mergeResults(previous, event.results) : previous;
|
|
245
|
+
if (same && results === state.pollResults)
|
|
246
|
+
return state;
|
|
247
|
+
return {
|
|
248
|
+
...state,
|
|
249
|
+
poll: same ? state.poll : event.poll,
|
|
250
|
+
pollResults: results,
|
|
251
|
+
votedOptionId: same ? state.votedOptionId : null,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
case 'pollResults': {
|
|
255
|
+
// A tally with no poll yet is a late joiner landing between two host messages: the re-publish
|
|
256
|
+
// runs on its own timer, so it can arrive before the poll is unicast to us. The next one lands
|
|
257
|
+
// after it — cheaper than buffering a tally that may never get an owner.
|
|
258
|
+
if (!state.poll)
|
|
259
|
+
return state;
|
|
260
|
+
// The host re-publishes every few seconds, so a tally can land just after a poll ended or the
|
|
261
|
+
// next one opened. Either way it belongs to a poll that is no longer on screen.
|
|
262
|
+
if (event.results.pollUuid && event.results.pollUuid !== state.poll.pollUuid)
|
|
263
|
+
return state;
|
|
264
|
+
const merged = mergeResults(state.pollResults, event.results);
|
|
265
|
+
// Unchanged counts must not produce new state: this arrives every few seconds and the whole
|
|
266
|
+
// app reads the session, so an identical tally would re-render everything for nothing.
|
|
267
|
+
if (merged === state.pollResults)
|
|
268
|
+
return state;
|
|
269
|
+
return { ...state, pollResults: merged };
|
|
270
|
+
}
|
|
271
|
+
case 'pollEnded':
|
|
272
|
+
if (!state.poll && !state.pollResults)
|
|
273
|
+
return state;
|
|
274
|
+
return { ...state, poll: null, pollResults: null, votedOptionId: null };
|
|
275
|
+
case 'mutedUsers':
|
|
276
|
+
return { ...state, mutedDeviceIds: event.deviceIds };
|
|
277
|
+
case 'guestMode':
|
|
278
|
+
// Leaving guest mode resets the rest, so a second stint starts clean rather than inheriting
|
|
279
|
+
// the last one's admit state or a mute the previous host applied.
|
|
280
|
+
return event.active
|
|
281
|
+
? { ...state, guestMode: true, guestStatus: 'waiting' }
|
|
282
|
+
: {
|
|
283
|
+
...state,
|
|
284
|
+
guestMode: false,
|
|
285
|
+
guestStatus: 'idle',
|
|
286
|
+
guestSlot: null,
|
|
287
|
+
guestMutedByHost: false,
|
|
288
|
+
guestCameraOffByHost: false,
|
|
289
|
+
};
|
|
290
|
+
case 'guestAdmitted':
|
|
291
|
+
return {
|
|
292
|
+
...state,
|
|
293
|
+
guestStatus: 'live',
|
|
294
|
+
guestSlot: event.slot,
|
|
295
|
+
mixerLayout: (_b = event.mixerLayout) !== null && _b !== void 0 ? _b : state.mixerLayout,
|
|
296
|
+
};
|
|
297
|
+
case 'guestRemoved':
|
|
298
|
+
// Terminal for this stint, and distinct from leaving: a screen can say so before tearing down.
|
|
299
|
+
return { ...state, guestStatus: 'removed' };
|
|
300
|
+
case 'guestMutedByHost':
|
|
301
|
+
return { ...state, guestMutedByHost: event.muted };
|
|
302
|
+
case 'guestCameraOffByHost':
|
|
303
|
+
return { ...state, guestCameraOffByHost: event.off };
|
|
304
|
+
case 'mixerLayout':
|
|
305
|
+
return state.mixerLayout === event.layout ? state : { ...state, mixerLayout: event.layout };
|
|
306
|
+
case 'videoBound':
|
|
307
|
+
return { ...state, videoTag: event.tag };
|
|
308
|
+
case 'biddingStarted': {
|
|
309
|
+
// The host opens a round on both channels, so the second copy arrives moments after the first.
|
|
310
|
+
// Taking it would reset a deadline that late bids have already extended — which cuts a bidding
|
|
311
|
+
// war short. One round, one opening.
|
|
312
|
+
if (state.biddingOpen)
|
|
313
|
+
return state;
|
|
314
|
+
return {
|
|
315
|
+
...state,
|
|
316
|
+
biddingOpen: true,
|
|
317
|
+
endsAtMs: event.endsAtMs,
|
|
318
|
+
openedEndsAtMs: event.endsAtMs,
|
|
319
|
+
serverOffsetMs: event.serverNowMs - at,
|
|
320
|
+
highestBid: 0,
|
|
321
|
+
nextBid: 0,
|
|
322
|
+
bidLeader: null,
|
|
323
|
+
auctionExtended: false,
|
|
324
|
+
biddingStoreProductId: event.storeProductId,
|
|
325
|
+
moderatorId: event.moderatorId,
|
|
326
|
+
// The previous lot's hammer must not sit over the new round.
|
|
327
|
+
lastWin: null,
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
case 'bidInfo': {
|
|
331
|
+
// A bid can reach us before the round's opening does, on a reconnect or a slow broadcast.
|
|
332
|
+
// Taking it opens the round rather than dropping the bid, which keeps a rejoining viewer from
|
|
333
|
+
// seeing "Yet to bid" while everyone else is at 200.
|
|
334
|
+
const movesDeadline = event.endsAtMs !== null && event.endsAtMs > state.endsAtMs;
|
|
335
|
+
const endsAtMs = movesDeadline ? event.endsAtMs : state.endsAtMs;
|
|
336
|
+
const openedEndsAtMs = state.openedEndsAtMs || endsAtMs;
|
|
337
|
+
return {
|
|
338
|
+
...state,
|
|
339
|
+
biddingOpen: true,
|
|
340
|
+
endsAtMs,
|
|
341
|
+
openedEndsAtMs,
|
|
342
|
+
// Re-synced only when the host moved the clock, because that message is the one whose send
|
|
343
|
+
// time pairs with the new deadline.
|
|
344
|
+
serverOffsetMs: movesDeadline ? event.serverNowMs - at : state.serverOffsetMs,
|
|
345
|
+
highestBid: event.highestBid,
|
|
346
|
+
nextBid: event.nextBid,
|
|
347
|
+
bidLeader: event.leader,
|
|
348
|
+
// Latches: a war stays a war for the rest of the round, however many late bids land.
|
|
349
|
+
auctionExtended: state.auctionExtended || endsAtMs > openedEndsAtMs,
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
case 'biddingClosed':
|
|
353
|
+
return { ...state, ...CLOSED_ROUND };
|
|
354
|
+
case 'auctionWon':
|
|
355
|
+
return { ...state, ...CLOSED_ROUND, lastWin: event.win };
|
|
356
|
+
case 'giveawayStarted': {
|
|
357
|
+
// Delivered at-least-once, so the dashboard (or a reconnect) can resend it for the lot already
|
|
358
|
+
// being tracked. A resend is not a new lot: a repeat of the *same* id means this device may
|
|
359
|
+
// already have registered under it, and that flag is not this event's to clear. A genuinely
|
|
360
|
+
// new lot always arrives with a different id, or after an end nulled the old one.
|
|
361
|
+
const sameLot = !!state.giveawayStoreProductId && state.giveawayStoreProductId === event.storeProductId;
|
|
362
|
+
return {
|
|
363
|
+
...state,
|
|
364
|
+
giveawayStoreProductId: event.storeProductId,
|
|
365
|
+
giveawayEntryCount: sameLot
|
|
366
|
+
? Math.max(state.giveawayEntryCount, (_c = event.entryCount) !== null && _c !== void 0 ? _c : 0)
|
|
367
|
+
: ((_d = event.entryCount) !== null && _d !== void 0 ? _d : 0),
|
|
368
|
+
giveawayRegistered: sameLot ? state.giveawayRegistered : false,
|
|
369
|
+
giveawayResult: null,
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
case 'giveawayEnded':
|
|
373
|
+
return {
|
|
374
|
+
...state,
|
|
375
|
+
giveawayStoreProductId: null,
|
|
376
|
+
giveawayEntryCount: 0,
|
|
377
|
+
giveawayRegistered: false,
|
|
378
|
+
// A draw with nobody in it has no winner, so there is nothing to celebrate.
|
|
379
|
+
giveawayResult: event.winnerName
|
|
380
|
+
? { storeProductId: event.storeProductId, winnerName: event.winnerName }
|
|
381
|
+
: null,
|
|
382
|
+
};
|
|
383
|
+
case 'giveawayEntries':
|
|
384
|
+
return { ...state, giveawayEntryCount: event.count };
|
|
385
|
+
// Owned by the engine (the mixer) or carrying no state of their own. Kept explicit so adding an
|
|
386
|
+
// event is a compile error away, not a silent no-op.
|
|
387
|
+
case 'mixer':
|
|
388
|
+
case 'cartAnnouncement':
|
|
389
|
+
case 'unknown':
|
|
390
|
+
return state;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Milliseconds to the deadline on the host's clock. Goes negative once it has passed — signed on
|
|
395
|
+
* purpose, so a ticker can wait out a grace period before closing the round itself.
|
|
396
|
+
*/
|
|
397
|
+
function remainingMs(state, now) {
|
|
398
|
+
if (!state.biddingOpen || !state.endsAtMs)
|
|
399
|
+
return 0;
|
|
400
|
+
return state.endsAtMs - (now + state.serverOffsetMs);
|
|
401
|
+
}
|
|
402
|
+
/** What a timer shows. Clamped at zero rather than counting up past the deadline. */
|
|
403
|
+
function timeLeftMs(state, now) {
|
|
404
|
+
return Math.max(0, remainingMs(state, now));
|
|
405
|
+
}
|
|
406
|
+
function append(list, item, max) {
|
|
407
|
+
const next = list.length >= max ? list.slice(list.length - max + 1) : list;
|
|
408
|
+
return [...next, item];
|
|
409
|
+
}
|
|
410
|
+
function addVote(results, optionId, delta) {
|
|
411
|
+
var _a;
|
|
412
|
+
return {
|
|
413
|
+
...results,
|
|
414
|
+
totalVotes: Math.max(0, results.totalVotes + delta),
|
|
415
|
+
votes: { ...results.votes, [optionId]: Math.max(0, ((_a = results.votes[optionId]) !== null && _a !== void 0 ? _a : 0) + delta) },
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Folds a fresh tally onto the one on screen, keeping the high-water mark per option.
|
|
420
|
+
*
|
|
421
|
+
* Votes within a poll only ever go up, so a count that comes back *lower* is a read the host took
|
|
422
|
+
* before something reached it — most often our own optimistic vote, which would otherwise make the
|
|
423
|
+
* total tick 25 → 24 → 25 in the seconds after voting. Returns `previous` unchanged when nothing
|
|
424
|
+
* moved, so an identical re-publish costs no render.
|
|
425
|
+
*/
|
|
426
|
+
function mergeResults(previous, next) {
|
|
427
|
+
var _a, _b, _c;
|
|
428
|
+
if (!previous)
|
|
429
|
+
return next;
|
|
430
|
+
const votes = {};
|
|
431
|
+
let changed = false;
|
|
432
|
+
for (const optionId of Object.keys({ ...previous.votes, ...next.votes })) {
|
|
433
|
+
const was = (_a = previous.votes[optionId]) !== null && _a !== void 0 ? _a : 0;
|
|
434
|
+
votes[optionId] = Math.max(was, (_b = next.votes[optionId]) !== null && _b !== void 0 ? _b : 0);
|
|
435
|
+
if (votes[optionId] !== was)
|
|
436
|
+
changed = true;
|
|
437
|
+
}
|
|
438
|
+
const totalVotes = Math.max(previous.totalVotes, next.totalVotes);
|
|
439
|
+
if (!changed && totalVotes === previous.totalVotes)
|
|
440
|
+
return previous;
|
|
441
|
+
return { pollUuid: (_c = next.pollUuid) !== null && _c !== void 0 ? _c : previous.pollUuid, totalVotes, votes };
|
|
442
|
+
}
|
|
443
|
+
function deriveStatus(state, hasStream, joining, error,
|
|
444
|
+
/** From the polled record — the server's own view, and the tiebreaker. */
|
|
445
|
+
serverSaysLive) {
|
|
446
|
+
if (error)
|
|
447
|
+
return 'error';
|
|
448
|
+
if (!hasStream)
|
|
449
|
+
return 'loading';
|
|
450
|
+
// Only an explicit host signal, or the record itself, ends a stream. A dropped socket shows as
|
|
451
|
+
// connecting: backgrounding the app disconnects the room and Zego recovers by itself.
|
|
452
|
+
if (state.ended || !serverSaysLive)
|
|
453
|
+
return 'ended';
|
|
454
|
+
if (joining || !state.connected)
|
|
455
|
+
return 'connecting';
|
|
456
|
+
// Three ways to have no picture: the host is not publishing at all, the feed broke, or it is
|
|
457
|
+
// publishing nothing — the camera-off case, which only the quality samples reveal.
|
|
458
|
+
if (!state.publishing || state.videoBroken)
|
|
459
|
+
return 'waitingForHost';
|
|
460
|
+
if (state.videoIdleSamples >= IDLE_SAMPLES_BEFORE_STALLED)
|
|
461
|
+
return 'waitingForHost';
|
|
462
|
+
return 'playing';
|
|
463
|
+
}
|
|
464
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|