@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.
Files changed (149) hide show
  1. package/README.md +322 -0
  2. package/android/build.gradle +33 -0
  3. package/android/src/main/AndroidManifest.xml +7 -0
  4. package/android/src/main/java/expo/modules/livepip/LivePipModule.kt +310 -0
  5. package/app.plugin.js +3 -0
  6. package/dist/auctions.d.ts +3 -0
  7. package/dist/auctions.d.ts.map +1 -0
  8. package/dist/auctions.js +152 -0
  9. package/dist/auctions.js.map +1 -0
  10. package/dist/client.d.ts +63 -0
  11. package/dist/client.d.ts.map +1 -0
  12. package/dist/client.js +154 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/clips.d.ts +3 -0
  15. package/dist/clips.d.ts.map +1 -0
  16. package/dist/clips.js +53 -0
  17. package/dist/clips.js.map +1 -0
  18. package/dist/commentLinks.d.ts +46 -0
  19. package/dist/commentLinks.d.ts.map +1 -0
  20. package/dist/commentLinks.js +120 -0
  21. package/dist/commentLinks.js.map +1 -0
  22. package/dist/engine.d.ts +13 -0
  23. package/dist/engine.d.ts.map +1 -0
  24. package/dist/engine.js +40 -0
  25. package/dist/engine.js.map +1 -0
  26. package/dist/engine.native.d.ts +3 -0
  27. package/dist/engine.native.d.ts.map +1 -0
  28. package/dist/engine.native.js +815 -0
  29. package/dist/engine.native.js.map +1 -0
  30. package/dist/flags.d.ts +5 -0
  31. package/dist/flags.d.ts.map +1 -0
  32. package/dist/flags.js +61 -0
  33. package/dist/flags.js.map +1 -0
  34. package/dist/guest.d.ts +5 -0
  35. package/dist/guest.d.ts.map +1 -0
  36. package/dist/guest.js +89 -0
  37. package/dist/guest.js.map +1 -0
  38. package/dist/index.d.ts +31 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +80 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/liveSelling.d.ts +3 -0
  43. package/dist/liveSelling.d.ts.map +1 -0
  44. package/dist/liveSelling.js +44 -0
  45. package/dist/liveSelling.js.map +1 -0
  46. package/dist/nativeViewTag.d.ts +15 -0
  47. package/dist/nativeViewTag.d.ts.map +1 -0
  48. package/dist/nativeViewTag.js +23 -0
  49. package/dist/nativeViewTag.js.map +1 -0
  50. package/dist/pip.d.ts +14 -0
  51. package/dist/pip.d.ts.map +1 -0
  52. package/dist/pip.js +15 -0
  53. package/dist/pip.js.map +1 -0
  54. package/dist/pip.native.d.ts +11 -0
  55. package/dist/pip.native.d.ts.map +1 -0
  56. package/dist/pip.native.js +47 -0
  57. package/dist/pip.native.js.map +1 -0
  58. package/dist/polls.d.ts +11 -0
  59. package/dist/polls.d.ts.map +1 -0
  60. package/dist/polls.js +135 -0
  61. package/dist/polls.js.map +1 -0
  62. package/dist/react/LiveSellingProvider.d.ts +16 -0
  63. package/dist/react/LiveSellingProvider.d.ts.map +1 -0
  64. package/dist/react/LiveSellingProvider.js +49 -0
  65. package/dist/react/LiveSellingProvider.js.map +1 -0
  66. package/dist/react/LiveVideoTarget.d.ts +22 -0
  67. package/dist/react/LiveVideoTarget.d.ts.map +1 -0
  68. package/dist/react/LiveVideoTarget.js +73 -0
  69. package/dist/react/LiveVideoTarget.js.map +1 -0
  70. package/dist/react/index.d.ts +19 -0
  71. package/dist/react/index.d.ts.map +1 -0
  72. package/dist/react/index.js +43 -0
  73. package/dist/react/index.js.map +1 -0
  74. package/dist/react/useAuction.d.ts +28 -0
  75. package/dist/react/useAuction.d.ts.map +1 -0
  76. package/dist/react/useAuction.js +66 -0
  77. package/dist/react/useAuction.js.map +1 -0
  78. package/dist/react/useAuctionBidGate.d.ts +48 -0
  79. package/dist/react/useAuctionBidGate.d.ts.map +1 -0
  80. package/dist/react/useAuctionBidGate.js +144 -0
  81. package/dist/react/useAuctionBidGate.js.map +1 -0
  82. package/dist/react/useAuctionWins.d.ts +51 -0
  83. package/dist/react/useAuctionWins.d.ts.map +1 -0
  84. package/dist/react/useAuctionWins.js +268 -0
  85. package/dist/react/useAuctionWins.js.map +1 -0
  86. package/dist/react/useClips.d.ts +9 -0
  87. package/dist/react/useClips.d.ts.map +1 -0
  88. package/dist/react/useClips.js +37 -0
  89. package/dist/react/useClips.js.map +1 -0
  90. package/dist/react/useLiveSession.d.ts +34 -0
  91. package/dist/react/useLiveSession.d.ts.map +1 -0
  92. package/dist/react/useLiveSession.js +876 -0
  93. package/dist/react/useLiveSession.js.map +1 -0
  94. package/dist/react/useLiveStreams.d.ts +9 -0
  95. package/dist/react/useLiveStreams.d.ts.map +1 -0
  96. package/dist/react/useLiveStreams.js +35 -0
  97. package/dist/react/useLiveStreams.js.map +1 -0
  98. package/dist/react/useOngoingLive.d.ts +13 -0
  99. package/dist/react/useOngoingLive.d.ts.map +1 -0
  100. package/dist/react/useOngoingLive.js +45 -0
  101. package/dist/react/useOngoingLive.js.map +1 -0
  102. package/dist/react/useReplays.d.ts +15 -0
  103. package/dist/react/useReplays.d.ts.map +1 -0
  104. package/dist/react/useReplays.js +66 -0
  105. package/dist/react/useReplays.js.map +1 -0
  106. package/dist/react/useStreamInfo.d.ts +21 -0
  107. package/dist/react/useStreamInfo.d.ts.map +1 -0
  108. package/dist/react/useStreamInfo.js +125 -0
  109. package/dist/react/useStreamInfo.js.map +1 -0
  110. package/dist/replays.d.ts +3 -0
  111. package/dist/replays.d.ts.map +1 -0
  112. package/dist/replays.js +114 -0
  113. package/dist/replays.js.map +1 -0
  114. package/dist/session.d.ts +23 -0
  115. package/dist/session.d.ts.map +1 -0
  116. package/dist/session.js +464 -0
  117. package/dist/session.js.map +1 -0
  118. package/dist/sessionTypes.d.ts +462 -0
  119. package/dist/sessionTypes.d.ts.map +1 -0
  120. package/dist/sessionTypes.js +55 -0
  121. package/dist/sessionTypes.js.map +1 -0
  122. package/dist/streams.d.ts +67 -0
  123. package/dist/streams.d.ts.map +1 -0
  124. package/dist/streams.js +170 -0
  125. package/dist/streams.js.map +1 -0
  126. package/dist/types.d.ts +591 -0
  127. package/dist/types.d.ts.map +1 -0
  128. package/dist/types.js +17 -0
  129. package/dist/types.js.map +1 -0
  130. package/dist/viewer.d.ts +5 -0
  131. package/dist/viewer.d.ts.map +1 -0
  132. package/dist/viewer.js +66 -0
  133. package/dist/viewer.js.map +1 -0
  134. package/dist/wire.d.ts +155 -0
  135. package/dist/wire.d.ts.map +1 -0
  136. package/dist/wire.js +73 -0
  137. package/dist/wire.js.map +1 -0
  138. package/dist/zego.d.ts +83 -0
  139. package/dist/zego.d.ts.map +1 -0
  140. package/dist/zego.js +13 -0
  141. package/dist/zego.js.map +1 -0
  142. package/expo-module.config.json +9 -0
  143. package/ios/LivePip.podspec +20 -0
  144. package/ios/LivePipController.swift +327 -0
  145. package/ios/LivePipModule.swift +35 -0
  146. package/package.json +91 -0
  147. package/plugin/build/index.d.ts +29 -0
  148. package/plugin/build/index.js +101 -0
  149. package/react/package.json +6 -0
@@ -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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"}