@mattebox/player-cast 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/LICENSE +21 -0
- package/NOTICE +24 -0
- package/README.md +54 -0
- package/dist/cast-button.d.ts +13 -0
- package/dist/cast-button.d.ts.map +1 -0
- package/dist/cast-button.js +65 -0
- package/dist/cast-button.js.map +1 -0
- package/dist/cast-screen.d.ts +24 -0
- package/dist/cast-screen.d.ts.map +1 -0
- package/dist/cast-screen.js +148 -0
- package/dist/cast-screen.js.map +1 -0
- package/dist/cast.d.ts +77 -0
- package/dist/cast.d.ts.map +1 -0
- package/dist/cast.js +343 -0
- package/dist/cast.js.map +1 -0
- package/dist/cdn/mattebox-player-cast.min.js +91 -0
- package/dist/component.d.ts +48 -0
- package/dist/component.d.ts.map +1 -0
- package/dist/component.js +89 -0
- package/dist/component.js.map +1 -0
- package/dist/es2015/cast-button.js +59 -0
- package/dist/es2015/cast-screen.js +151 -0
- package/dist/es2015/cast.js +299 -0
- package/dist/es2015/component.js +84 -0
- package/dist/es2015/host.js +19 -0
- package/dist/es2015/icons.js +23 -0
- package/dist/es2015/index.js +17 -0
- package/dist/es2015/shared.js +125 -0
- package/dist/es2015/slider.js +154 -0
- package/dist/host.d.ts +14 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +19 -0
- package/dist/host.js.map +1 -0
- package/dist/icons.d.ts +33 -0
- package/dist/icons.d.ts.map +1 -0
- package/dist/icons.js +52 -0
- package/dist/icons.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/shared.d.ts +29 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +125 -0
- package/dist/shared.js.map +1 -0
- package/dist/slider.d.ts +28 -0
- package/dist/slider.d.ts.map +1 -0
- package/dist/slider.js +165 -0
- package/dist/slider.js.map +1 -0
- package/package.json +59 -0
package/dist/cast.js
ADDED
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
/** Whether the session is live: the engine's `live` namespace, once it has an edge. */
|
|
2
|
+
function live(engine) {
|
|
3
|
+
const api = engine?.live;
|
|
4
|
+
return api !== undefined && api.edge !== null;
|
|
5
|
+
}
|
|
6
|
+
/** The Default Media Receiver: Google's player, which plays HLS and DASH by itself. */
|
|
7
|
+
const DEFAULT_RECEIVER = 'CC1AD845';
|
|
8
|
+
const SDK_URL = 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1';
|
|
9
|
+
// The page-wide part: one SDK, one context, one remote player. Held in the
|
|
10
|
+
// module because the SDK holds them in the window.
|
|
11
|
+
let framework = null;
|
|
12
|
+
let configured = null;
|
|
13
|
+
let remotePlayer = null;
|
|
14
|
+
let remoteController = null;
|
|
15
|
+
const watchers = new Set();
|
|
16
|
+
/** The player whose session this is, so two players on a page do not both take a session. */
|
|
17
|
+
let owner = null;
|
|
18
|
+
/** The receiver's last known playback, read while it reports and kept once it stops. */
|
|
19
|
+
const NOTHING = { loaded: false, paused: true, time: 0, duration: Number.NaN };
|
|
20
|
+
let last = NOTHING;
|
|
21
|
+
function globals() {
|
|
22
|
+
return globalThis;
|
|
23
|
+
}
|
|
24
|
+
function notify() {
|
|
25
|
+
for (const fn of [...watchers])
|
|
26
|
+
fn();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The framework, once the page has it. Resolves null where the SDK never
|
|
30
|
+
* arrives: a browser without Cast, a page whose CSP refused the script, or
|
|
31
|
+
* `sdk="none"` with no script of the page's own.
|
|
32
|
+
*/
|
|
33
|
+
function load(sdk) {
|
|
34
|
+
if (framework !== null)
|
|
35
|
+
return framework;
|
|
36
|
+
const held = globals();
|
|
37
|
+
if (held.cast?.framework !== undefined) {
|
|
38
|
+
framework = Promise.resolve(held.cast.framework);
|
|
39
|
+
return framework;
|
|
40
|
+
}
|
|
41
|
+
// The SDK is Chromium's. Elsewhere the script only reports that it is
|
|
42
|
+
// unavailable, so it is not fetched.
|
|
43
|
+
if (!('chrome' in held)) {
|
|
44
|
+
framework = Promise.resolve(null);
|
|
45
|
+
return framework;
|
|
46
|
+
}
|
|
47
|
+
framework = new Promise((resolve) => {
|
|
48
|
+
const previous = held.__onGCastApiAvailable;
|
|
49
|
+
// The SDK calls this once it is in, on its own script or the page's.
|
|
50
|
+
held.__onGCastApiAvailable = (available) => {
|
|
51
|
+
previous?.(available);
|
|
52
|
+
resolve(available ? (globals().cast?.framework ?? null) : null);
|
|
53
|
+
};
|
|
54
|
+
if (sdk === 'none')
|
|
55
|
+
return;
|
|
56
|
+
const script = document.createElement('script');
|
|
57
|
+
script.src = SDK_URL;
|
|
58
|
+
script.async = true;
|
|
59
|
+
script.addEventListener('error', () => resolve(null));
|
|
60
|
+
document.head.append(script);
|
|
61
|
+
});
|
|
62
|
+
return framework;
|
|
63
|
+
}
|
|
64
|
+
/** The context, set up once per page. */
|
|
65
|
+
function context(fw, receiver) {
|
|
66
|
+
const ctx = fw.CastContext.getInstance();
|
|
67
|
+
const wanted = receiver ?? DEFAULT_RECEIVER;
|
|
68
|
+
if (configured === null) {
|
|
69
|
+
const policy = globals().chrome?.cast?.AutoJoinPolicy.ORIGIN_SCOPED ?? 'origin_scoped';
|
|
70
|
+
ctx.setOptions({ receiverApplicationId: wanted, autoJoinPolicy: policy });
|
|
71
|
+
configured = wanted;
|
|
72
|
+
ctx.addEventListener(fw.CastContextEventType.CAST_STATE_CHANGED, notify);
|
|
73
|
+
ctx.addEventListener(fw.CastContextEventType.SESSION_STATE_CHANGED, (event) => {
|
|
74
|
+
onSession(fw, ctx, event.sessionState ?? '');
|
|
75
|
+
});
|
|
76
|
+
remotePlayer = new fw.RemotePlayer();
|
|
77
|
+
remoteController = new fw.RemotePlayerController(remotePlayer);
|
|
78
|
+
remoteController.addEventListener(fw.RemotePlayerEventType.ANY_CHANGE, () => {
|
|
79
|
+
const remote = remotePlayer;
|
|
80
|
+
if (remote?.isConnected === true && remote.isMediaLoaded) {
|
|
81
|
+
last = {
|
|
82
|
+
loaded: true,
|
|
83
|
+
paused: remote.isPaused,
|
|
84
|
+
time: remote.currentTime,
|
|
85
|
+
duration: remote.duration > 0 ? remote.duration : Number.POSITIVE_INFINITY,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
notify();
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
else if (receiver !== null && receiver !== configured) {
|
|
92
|
+
console.error(`mattebox-player: the Cast context already uses receiver ${configured}`);
|
|
93
|
+
}
|
|
94
|
+
return ctx;
|
|
95
|
+
}
|
|
96
|
+
function onSession(fw, ctx, state) {
|
|
97
|
+
const states = fw.SessionState;
|
|
98
|
+
if (state === states.SESSION_STARTED && owner !== null && owner.pending) {
|
|
99
|
+
// A new session has loaded nothing yet, whatever the last one played.
|
|
100
|
+
last = NOTHING;
|
|
101
|
+
owner.begin(ctx);
|
|
102
|
+
}
|
|
103
|
+
else if (state === states.SESSION_RESUMED) {
|
|
104
|
+
// Chrome rejoins a session of this origin on load. It is this player's
|
|
105
|
+
// when the receiver plays what the player has.
|
|
106
|
+
const playing = ctx.getCurrentSession()?.getMediaSession()?.media?.contentId;
|
|
107
|
+
const found = [...connected].find((cast) => cast.plays(playing));
|
|
108
|
+
if (found !== undefined && owner === null) {
|
|
109
|
+
owner = found;
|
|
110
|
+
found.adopt();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else if (state === states.SESSION_ENDED || state === states.SESSION_START_FAILED) {
|
|
114
|
+
const ended = owner;
|
|
115
|
+
owner = null;
|
|
116
|
+
ended?.end(state === states.SESSION_ENDED);
|
|
117
|
+
}
|
|
118
|
+
notify();
|
|
119
|
+
}
|
|
120
|
+
/** One per player, found again by its button and its screen. Weak, so a player that leaves is not held. */
|
|
121
|
+
const players = new WeakMap();
|
|
122
|
+
/** The players with a cast button attached, for a session Chrome rejoins on load. */
|
|
123
|
+
const connected = new Set();
|
|
124
|
+
class CastOf {
|
|
125
|
+
constructor(player) {
|
|
126
|
+
this.player = player;
|
|
127
|
+
this.target = null;
|
|
128
|
+
this.ctx = null;
|
|
129
|
+
this.fw = null;
|
|
130
|
+
this.pending = false;
|
|
131
|
+
this.casting = false;
|
|
132
|
+
this.handoff = null;
|
|
133
|
+
}
|
|
134
|
+
connect(receiver, sdk) {
|
|
135
|
+
connected.add(this);
|
|
136
|
+
void load(sdk).then((fw) => {
|
|
137
|
+
if (fw === null)
|
|
138
|
+
return;
|
|
139
|
+
this.fw = fw;
|
|
140
|
+
this.ctx = context(fw, receiver);
|
|
141
|
+
notify();
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
disconnect() {
|
|
145
|
+
connected.delete(this);
|
|
146
|
+
}
|
|
147
|
+
state() {
|
|
148
|
+
const ctx = this.ctx;
|
|
149
|
+
const fw = this.fw;
|
|
150
|
+
if (ctx === null || fw === null)
|
|
151
|
+
return 'unavailable';
|
|
152
|
+
if (this.casting)
|
|
153
|
+
return 'casting';
|
|
154
|
+
const cast = ctx.getCastState();
|
|
155
|
+
if (cast === fw.CastState.NO_DEVICES_AVAILABLE)
|
|
156
|
+
return 'unavailable';
|
|
157
|
+
if (cast === fw.CastState.CONNECTING || this.pending)
|
|
158
|
+
return 'connecting';
|
|
159
|
+
return 'idle';
|
|
160
|
+
}
|
|
161
|
+
device() {
|
|
162
|
+
if (!this.casting)
|
|
163
|
+
return null;
|
|
164
|
+
return this.ctx?.getCurrentSession()?.getCastDevice().friendlyName ?? null;
|
|
165
|
+
}
|
|
166
|
+
remote() {
|
|
167
|
+
return last;
|
|
168
|
+
}
|
|
169
|
+
start(target) {
|
|
170
|
+
const ctx = this.ctx;
|
|
171
|
+
if (ctx === null || this.casting)
|
|
172
|
+
return;
|
|
173
|
+
// Another player on the page holds the session. The SDK has one, so
|
|
174
|
+
// this click ends it, the way Chrome's own dialog offers to.
|
|
175
|
+
if (owner !== null && owner !== this) {
|
|
176
|
+
ctx.endCurrentSession(true);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
this.target = target;
|
|
180
|
+
this.pending = true;
|
|
181
|
+
owner = this;
|
|
182
|
+
notify();
|
|
183
|
+
// Rejected when the viewer closes the picker; SESSION_START_FAILED
|
|
184
|
+
// does not fire for that, so the wait ends here.
|
|
185
|
+
ctx.requestSession().catch(() => {
|
|
186
|
+
if (owner === this)
|
|
187
|
+
owner = null;
|
|
188
|
+
this.pending = false;
|
|
189
|
+
notify();
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
stop() {
|
|
193
|
+
if (this.casting)
|
|
194
|
+
this.ctx?.endCurrentSession(true);
|
|
195
|
+
}
|
|
196
|
+
playPause() {
|
|
197
|
+
if (this.casting)
|
|
198
|
+
remoteController?.playOrPause();
|
|
199
|
+
}
|
|
200
|
+
seek(time) {
|
|
201
|
+
if (!this.casting || remotePlayer === null)
|
|
202
|
+
return;
|
|
203
|
+
remotePlayer.currentTime = time;
|
|
204
|
+
remoteController?.seek();
|
|
205
|
+
}
|
|
206
|
+
watch(fn) {
|
|
207
|
+
watchers.add(fn);
|
|
208
|
+
return () => {
|
|
209
|
+
watchers.delete(fn);
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
/** Whether this player's session plays `url`. */
|
|
213
|
+
plays(url) {
|
|
214
|
+
return url !== undefined && this.player.player?.session?.source.url === url;
|
|
215
|
+
}
|
|
216
|
+
/** A session started for this player: freeze the picture and send the source. */
|
|
217
|
+
begin(ctx) {
|
|
218
|
+
this.pending = false;
|
|
219
|
+
const session = this.player.player?.session ?? null;
|
|
220
|
+
const video = this.player.video;
|
|
221
|
+
const time = video.currentTime;
|
|
222
|
+
const autoplay = !video.paused;
|
|
223
|
+
this.freeze();
|
|
224
|
+
if (session === null)
|
|
225
|
+
return;
|
|
226
|
+
const request = this.request(session.source, time, autoplay);
|
|
227
|
+
if (request === null)
|
|
228
|
+
return;
|
|
229
|
+
const event = new CustomEvent('castload', {
|
|
230
|
+
detail: request,
|
|
231
|
+
bubbles: true,
|
|
232
|
+
composed: true,
|
|
233
|
+
cancelable: true,
|
|
234
|
+
});
|
|
235
|
+
if (this.target?.dispatchEvent(event) === false)
|
|
236
|
+
return;
|
|
237
|
+
void ctx
|
|
238
|
+
.getCurrentSession()
|
|
239
|
+
?.loadMedia(request)
|
|
240
|
+
.catch(() => {
|
|
241
|
+
// The receiver refused the media. The session stays, so the viewer
|
|
242
|
+
// can stop it; the screen shows no time.
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
/** A session Chrome rejoined, already playing this player's source. */
|
|
246
|
+
adopt() {
|
|
247
|
+
this.freeze();
|
|
248
|
+
}
|
|
249
|
+
freeze() {
|
|
250
|
+
const engine = this.player.engine;
|
|
251
|
+
this.handoff = { live: live(engine) };
|
|
252
|
+
this.player.video.pause();
|
|
253
|
+
// The engine keeps its buffers and makes no request while the receiver
|
|
254
|
+
// plays (engine guide 01, suspend and resume).
|
|
255
|
+
engine?.suspend();
|
|
256
|
+
this.casting = true;
|
|
257
|
+
this.player.toggleAttribute('casting', true);
|
|
258
|
+
notify();
|
|
259
|
+
}
|
|
260
|
+
/** The session ended: give the video back where the receiver left it. */
|
|
261
|
+
end(cleanly) {
|
|
262
|
+
this.pending = false;
|
|
263
|
+
if (!this.casting)
|
|
264
|
+
return;
|
|
265
|
+
this.casting = false;
|
|
266
|
+
const handoff = this.handoff;
|
|
267
|
+
this.handoff = null;
|
|
268
|
+
const video = this.player.video;
|
|
269
|
+
const engine = this.player.engine;
|
|
270
|
+
engine?.resume();
|
|
271
|
+
this.player.removeAttribute('casting');
|
|
272
|
+
if (!cleanly || !last.loaded)
|
|
273
|
+
return;
|
|
274
|
+
// Live rejoins at the edge on its own; the receiver's time is on the
|
|
275
|
+
// receiver's own timeline and means nothing here.
|
|
276
|
+
if (handoff?.live !== true && Number.isFinite(last.time))
|
|
277
|
+
video.currentTime = last.time;
|
|
278
|
+
if (!last.paused)
|
|
279
|
+
video.play().catch(() => undefined);
|
|
280
|
+
}
|
|
281
|
+
/** The load request: the source, the time, the stream type, and the video's own text tracks. */
|
|
282
|
+
request(source, time, autoplay) {
|
|
283
|
+
const media = globals().chrome?.cast?.media;
|
|
284
|
+
if (media === undefined)
|
|
285
|
+
return null;
|
|
286
|
+
const engine = this.player.engine;
|
|
287
|
+
const type = source.type ?? '';
|
|
288
|
+
const info = new media.MediaInfo(source.url, type);
|
|
289
|
+
info.streamType = live(engine) ? media.StreamType.LIVE : media.StreamType.BUFFERED;
|
|
290
|
+
if (/mpegurl/i.test(type)) {
|
|
291
|
+
// The receiver assumes MPEG-TS segments for HLS unless told. The
|
|
292
|
+
// engine's presentation says which the stream has; a native session
|
|
293
|
+
// has none, and CMAF is the assumption there.
|
|
294
|
+
const ts = tsSegments(engine);
|
|
295
|
+
info.hlsSegmentFormat = ts ? 'ts' : 'fmp4';
|
|
296
|
+
info.hlsVideoSegmentFormat = ts ? 'mpeg2_ts' : 'fmp4';
|
|
297
|
+
}
|
|
298
|
+
const tracks = [];
|
|
299
|
+
for (const node of this.player.video.querySelectorAll('track[src]')) {
|
|
300
|
+
const track = node;
|
|
301
|
+
if (track.kind !== 'subtitles' && track.kind !== 'captions')
|
|
302
|
+
continue;
|
|
303
|
+
const out = new media.Track(tracks.length + 1, media.TrackType.TEXT);
|
|
304
|
+
out.trackContentId = track.src;
|
|
305
|
+
out.trackContentType = 'text/vtt';
|
|
306
|
+
out.subtype =
|
|
307
|
+
track.kind === 'captions' ? media.TextTrackType.CAPTIONS : media.TextTrackType.SUBTITLES;
|
|
308
|
+
out.name = track.label;
|
|
309
|
+
out.language = track.srclang;
|
|
310
|
+
tracks.push(out);
|
|
311
|
+
}
|
|
312
|
+
info.tracks = tracks.length > 0 ? tracks : null;
|
|
313
|
+
const request = new media.LoadRequest(info);
|
|
314
|
+
request.currentTime = time;
|
|
315
|
+
request.autoplay = autoplay;
|
|
316
|
+
return request;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/** Whether the engine's presentation carries MPEG-TS renditions. */
|
|
320
|
+
function tsSegments(engine) {
|
|
321
|
+
const presentation = engine?.stats.snapshot().presentation;
|
|
322
|
+
if (presentation === null || presentation === undefined)
|
|
323
|
+
return false;
|
|
324
|
+
for (const period of presentation.periods) {
|
|
325
|
+
for (const track of period.tracks) {
|
|
326
|
+
for (const rendition of track.renditions) {
|
|
327
|
+
if (/mp2t/i.test(rendition.mimeType))
|
|
328
|
+
return true;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return false;
|
|
333
|
+
}
|
|
334
|
+
/** The player's Cast, one per player, shared by its cast button and cast screen. */
|
|
335
|
+
export function cast(player) {
|
|
336
|
+
let held = players.get(player);
|
|
337
|
+
if (held === undefined) {
|
|
338
|
+
held = new CastOf(player);
|
|
339
|
+
players.set(player, held);
|
|
340
|
+
}
|
|
341
|
+
return held;
|
|
342
|
+
}
|
|
343
|
+
//# sourceMappingURL=cast.js.map
|
package/dist/cast.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cast.js","sourceRoot":"","sources":["../src/cast.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
var matteboxPlayerCast=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});function t(e){let t=e==null?void 0:e.live;return t!==void 0&&t.edge!==null}let n=null,r=null,i=null,a=null,o=new Set,s=null,c={loaded:!1,paused:!0,time:0,duration:NaN},l=c;function u(){return globalThis}function d(){for(let e of[...o])e()}function f(e){var t;if(n!==null)return n;let r=u();return((t=r.cast)==null?void 0:t.framework)===void 0?`chrome`in r?(n=new Promise(t=>{let n=r.__onGCastApiAvailable;if(r.__onGCastApiAvailable=e=>{var r,i;n==null||n(e),t(e?(r=(i=u().cast)==null?void 0:i.framework)==null?null:r:null)},e===`none`)return;let i=document.createElement(`script`);i.src=`https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1`,i.async=!0,i.addEventListener(`error`,()=>t(null)),document.head.append(i)}),n):(n=Promise.resolve(null),n):(n=Promise.resolve(r.cast.framework),n)}function p(e,t){let n=e.CastContext.getInstance(),o=t==null?`CC1AD845`:t;if(r===null){var s,c;let t=(s=(c=u().chrome)==null||(c=c.cast)==null?void 0:c.AutoJoinPolicy.ORIGIN_SCOPED)==null?`origin_scoped`:s;n.setOptions({receiverApplicationId:o,autoJoinPolicy:t}),r=o,n.addEventListener(e.CastContextEventType.CAST_STATE_CHANGED,d),n.addEventListener(e.CastContextEventType.SESSION_STATE_CHANGED,t=>{var r;m(e,n,(r=t.sessionState)==null?``:r)}),i=new e.RemotePlayer,a=new e.RemotePlayerController(i),a.addEventListener(e.RemotePlayerEventType.ANY_CHANGE,()=>{let e=i;(e==null?void 0:e.isConnected)===!0&&e.isMediaLoaded&&(l={loaded:!0,paused:e.isPaused,time:e.currentTime,duration:e.duration>0?e.duration:1/0}),d()})}else t!==null&&t!==r&&console.error(`mattebox-player: the Cast context already uses receiver ${r}`);return n}function m(e,t,n){let r=e.SessionState;if(n===r.SESSION_STARTED&&s!==null&&s.pending)l=c,s.begin(t);else if(n===r.SESSION_RESUMED){var i;let e=(i=t.getCurrentSession())==null||(i=i.getMediaSession())==null||(i=i.media)==null?void 0:i.contentId,n=[...g].find(t=>t.plays(e));n!==void 0&&s===null&&(s=n,n.adopt())}else if(n===r.SESSION_ENDED||n===r.SESSION_START_FAILED){let e=s;s=null,e==null||e.end(n===r.SESSION_ENDED)}d()}let h=new WeakMap,g=new Set;var _=class{constructor(e){this.player=e,this.target=null,this.ctx=null,this.fw=null,this.pending=!1,this.casting=!1,this.handoff=null}connect(e,t){g.add(this),f(t).then(t=>{t!==null&&(this.fw=t,this.ctx=p(t,e),d())})}disconnect(){g.delete(this)}state(){let e=this.ctx,t=this.fw;if(e===null||t===null)return`unavailable`;if(this.casting)return`casting`;let n=e.getCastState();return n===t.CastState.NO_DEVICES_AVAILABLE?`unavailable`:n===t.CastState.CONNECTING||this.pending?`connecting`:`idle`}device(){var e,t;return this.casting?(e=(t=this.ctx)==null||(t=t.getCurrentSession())==null?void 0:t.getCastDevice().friendlyName)==null?null:e:null}remote(){return l}start(e){let t=this.ctx;if(!(t===null||this.casting)){if(s!==null&&s!==this){t.endCurrentSession(!0);return}this.target=e,this.pending=!0,s=this,d(),t.requestSession().catch(()=>{s===this&&(s=null),this.pending=!1,d()})}}stop(){var e;this.casting&&((e=this.ctx)==null||e.endCurrentSession(!0))}playPause(){this.casting&&(a==null||a.playOrPause())}seek(e){this.casting&&i!==null&&(i.currentTime=e,a==null||a.seek())}watch(e){return o.add(e),()=>{o.delete(e)}}plays(e){var t;return e!==void 0&&((t=this.player.player)==null||(t=t.session)==null?void 0:t.source.url)===e}begin(e){var t,n,r,i;this.pending=!1;let a=(t=(n=this.player.player)==null?void 0:n.session)==null?null:t,o=this.player.video,s=o.currentTime,c=!o.paused;if(this.freeze(),a===null)return;let l=this.request(a.source,s,c);if(l===null)return;let u=new CustomEvent(`castload`,{detail:l,bubbles:!0,composed:!0,cancelable:!0});((r=this.target)==null?void 0:r.dispatchEvent(u))!==!1&&((i=e.getCurrentSession())==null||i.loadMedia(l).catch(()=>{}))}adopt(){this.freeze()}freeze(){let e=this.player.engine;this.handoff={live:t(e)},this.player.video.pause(),e==null||e.suspend(),this.casting=!0,this.player.toggleAttribute(`casting`,!0),d()}end(e){if(this.pending=!1,!this.casting)return;this.casting=!1;let t=this.handoff;this.handoff=null;let n=this.player.video,r=this.player.engine;r==null||r.resume(),this.player.removeAttribute(`casting`),e&&l.loaded&&((t==null?void 0:t.live)!==!0&&Number.isFinite(l.time)&&(n.currentTime=l.time),l.paused||n.play().catch(()=>void 0))}request(e,n,r){var i,a;let o=(i=u().chrome)==null||(i=i.cast)==null?void 0:i.media;if(o===void 0)return null;let s=this.player.engine,c=(a=e.type)==null?``:a,l=new o.MediaInfo(e.url,c);if(l.streamType=t(s)?o.StreamType.LIVE:o.StreamType.BUFFERED,/mpegurl/i.test(c)){let e=v(s);l.hlsSegmentFormat=e?`ts`:`fmp4`,l.hlsVideoSegmentFormat=e?`mpeg2_ts`:`fmp4`}let d=[];for(let e of this.player.video.querySelectorAll(`track[src]`)){let t=e;if(t.kind!==`subtitles`&&t.kind!==`captions`)continue;let n=new o.Track(d.length+1,o.TrackType.TEXT);n.trackContentId=t.src,n.trackContentType=`text/vtt`,n.subtype=t.kind===`captions`?o.TextTrackType.CAPTIONS:o.TextTrackType.SUBTITLES,n.name=t.label,n.language=t.srclang,d.push(n)}l.tracks=d.length>0?d:null;let f=new o.LoadRequest(l);return f.currentTime=n,f.autoplay=r,f}};function v(e){let t=e==null?void 0:e.stats.snapshot().presentation;if(t==null)return!1;for(let e of t.periods)for(let t of e.tracks)for(let e of t.renditions)if(/mp2t/i.test(e.mimeType))return!0;return!1}function y(e){let t=h.get(e);return t===void 0&&(t=new _(e),h.set(e,t)),t}function b(e){let t=e.parentNode;return t===null?e instanceof ShadowRoot?e.host:null:t}function x(e){let t=e;for(;t!==null;){if(t instanceof HTMLElement&&t.localName===`mattebox-player`)return t;t=b(t)}return null}var S=class extends HTMLElement{constructor(){super(),this.player=null,this.offs=[],this.epoch=0}connectedCallback(){let e=x(this);if(e===null)return;this.epoch+=1;let t=this.epoch,n=()=>{t===this.epoch&&this.isConnected&&(customElements.upgrade(e),`video`in e&&(this.player=e,this.attach(this.player)))};`video`in e?n():customElements.whenDefined(`mattebox-player`).then(n)}disconnectedCallback(){this.epoch+=1;for(let e of this.offs)e();this.offs=[];let e=this.player;e!==null&&(this.player=null,this.detach(e))}attributeChangedCallback(){this.player!==null&&this.render()}listen(e,t,n){for(let r of t)e.addEventListener(r,n);this.offs.push(()=>{for(let r of t)e.removeEventListener(r,n)})}keep(e){this.offs.push(e)}follow(e,t){let n,r=()=>{n==null||n(),n=t(e.engine)};this.listen(e,[`sourcechange`],r),this.offs.push(()=>{n==null||n(),n=void 0}),r()}observe(e,t,n,r=!1){let i=new MutationObserver(n);i.observe(e,{attributes:!0,attributeFilter:[...t],subtree:r}),this.offs.push(()=>{i.disconnect()})}detach(e){}render(){}};let C={play:`M10.6667 6.6548C10.6667 6.10764 11.2894 5.79346 11.7295 6.11862L24.377 15.4634C24.7377 15.7298 24.7377 16.2692 24.3771 16.5357L11.7295 25.8813C11.2895 26.2065 10.6667 25.8923 10.6667 25.3451L10.6667 6.6548Z`,pause:`M8.66667 6.66667C8.29848 6.66667 8 6.96514 8 7.33333V24.6667C8 25.0349 8.29848 25.3333 8.66667 25.3333H12.6667C13.0349 25.3333 13.3333 25.0349 13.3333 24.6667V7.33333C13.3333 6.96514 13.0349 6.66667 12.6667 6.66667H8.66667Z M19.3333 6.66667C18.9651 6.66667 18.6667 6.96514 18.6667 7.33333V24.6667C18.6667 25.0349 18.9651 25.3333 19.3333 25.3333H23.3333C23.7015 25.3333 24 25.0349 24 24.6667V7.33333C24 6.96514 23.7015 6.66667 23.3333 6.66667H19.3333Z`,cast:`M4 6h24v18H20v-2h6V8H6v1H4V6zM4 21a3 3 0 0 1 3 3H4zM4 15a9 9 0 0 1 9 9h-2a7 7 0 0 0-7-7zM4 10a14 14 0 0 1 14 14h-2A12 12 0 0 0 4 12z`,"cast-active":`M4 6h24v18H20A16 16 0 0 0 4 8zM4 21a3 3 0 0 1 3 3H4zM4 15a9 9 0 0 1 9 9h-2a7 7 0 0 0-7-7zM4 10a14 14 0 0 1 14 14h-2A12 12 0 0 0 4 12z`},w=`http://www.w3.org/2000/svg`;function T(e){let t=document.createElementNS(w,`svg`);t.setAttribute(`viewBox`,`0 0 32 32`),t.setAttribute(`aria-hidden`,`true`),t.setAttribute(`part`,`icon`);let n=document.createElementNS(w,`path`);return n.setAttribute(`fill-rule`,`evenodd`),n.setAttribute(`d`,C[e]),t.append(n),t}let E=`
|
|
2
|
+
:host { display: inline-flex; }
|
|
3
|
+
:host([hidden]) { display: none; }
|
|
4
|
+
[part~="button"] {
|
|
5
|
+
display: inline-flex;
|
|
6
|
+
align-items: center;
|
|
7
|
+
justify-content: center;
|
|
8
|
+
flex: none;
|
|
9
|
+
width: 40px;
|
|
10
|
+
height: 40px;
|
|
11
|
+
padding: 0;
|
|
12
|
+
font: inherit;
|
|
13
|
+
color: inherit;
|
|
14
|
+
background: transparent;
|
|
15
|
+
border: 0;
|
|
16
|
+
border-radius: var(--mbx-radius);
|
|
17
|
+
cursor: pointer;
|
|
18
|
+
opacity: 0.9;
|
|
19
|
+
}
|
|
20
|
+
[part~="button"]:hover { opacity: 1; }
|
|
21
|
+
[part~="button"]:focus-visible { outline: 2px solid var(--mbx-accent); outline-offset: -2px; }
|
|
22
|
+
[part~="icon"], ::slotted(*) { width: 1.75em; height: 1.75em; fill: currentColor; }
|
|
23
|
+
slot[hidden] { display: none; }
|
|
24
|
+
`;function D(e){let t=document.createElement(`style`);return t.textContent=e,t}function O(e,t){let n={};for(let r of e){let e=document.createElement(`slot`);e.name=`icon-${r}`,e.append(t(r)),e.hidden=!0,n[r]=e}return n}function k(e,t){for(let n of Object.keys(e))e[n].hidden=n!==t}function A(e,t,n){let r=document.createElement(e);return r.setAttribute(`part`,t),n!==void 0&&(r.textContent=n),r}function j(e,t){return e.replace(/\{(\w+)\}/g,(e,n)=>{let r=t[n];return r===void 0?e:String(r)})}function M(e){return e<10?`0${e}`:`${e}`}function N(e){let t=Number.isFinite(e)&&e>0?Math.floor(e):0,n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60;return n>0?`${n}:${M(r)}:${M(i)}`:`${r}:${M(i)}`}function P(e,t){return Number.isFinite(t)?`${N(e)} of ${N(t)}`:N(e)}let F=[`default`,`active`];var I=class extends S{static get observedAttributes(){return[`label-start`,`label-stop`]}constructor(){super(),this.api=null;let e=this.attachShadow({mode:`open`});this.button=document.createElement(`button`),this.button.type=`button`,this.button.setAttribute(`part`,`button`),this.slots=O(F,e=>T(e===`active`?`cast-active`:`cast`));for(let e of F)this.button.append(this.slots[e]);this.button.addEventListener(`click`,()=>{let e=this.api;e!==null&&(e.state()===`casting`?e.stop():e.start(this))}),e.append(D(E),this.button)}attach(e){let t=y(e);this.api=t,t.connect(this.getAttribute(`receiver`),this.getAttribute(`sdk`)),this.keep(t.watch(()=>{this.render()})),this.follow(e,()=>{this.render()})}detach(){var e;(e=this.api)==null||e.disconnect(),this.api=null}render(){var e,t,n;let r=this.player,i=this.api;if(r===null||i===null)return;let a=i.state(),o=a===`casting`;this.hidden=a===`unavailable`,this.button.disabled=!o&&((e=r.player)==null?void 0:e.session)==null,this.button.toggleAttribute(`aria-busy`,a===`connecting`),k(this.slots,o?`active`:`default`),this.button.setAttribute(`aria-label`,o?(t=this.getAttribute(`label-stop`))==null?`Stop casting`:t:(n=this.getAttribute(`label-start`))==null?`Cast`:n)}};function L(e,t,n){return Math.min(n,Math.max(t,e))}function R(e){let{onInput:t}=e,n=A(`div`,`slider`);n.setAttribute(`role`,`slider`),n.tabIndex=0;let r=A(`div`,`rail`),i=A(`div`,`track`),a=A(`div`,`fill`),o=A(`div`,`thumb`);i.append(a),r.append(i,o),n.append(r);let s=0,c=1,l=0,u=!1;function d(){let e=`${(c>s?(l-s)/(c-s):0)*100}%`;a.style.width=e,o.style.left=e}function f(e){let t=r.getBoundingClientRect();return t.width===0?s:s+L((e-t.left)/t.width,0,1)*(c-s)}function p(t){u=t,e.onDrag(t)}function m(e){if(e.button===0){e.preventDefault(),p(!0);try{n.setPointerCapture(e.pointerId)}catch(e){}t(f(e.clientX))}}function h(e){if(u){if(e.buttons===0){g(e);return}t(f(e.clientX))}}function g(e){u&&(p(!1),t(f(e.clientX)))}function _(){u&&p(!1)}function v(n){let r;switch(n.key){case`ArrowRight`:case`ArrowUp`:r=l+e.step();break;case`ArrowLeft`:case`ArrowDown`:r=l-e.step();break;case`PageUp`:r=l+e.page();break;case`PageDown`:r=l-e.page();break;case`Home`:r=s;break;case`End`:r=c;break;default:return}n.preventDefault(),t(L(r,s,c))}return n.addEventListener(`pointerdown`,m),n.addEventListener(`pointermove`,h),n.addEventListener(`pointerup`,g),n.addEventListener(`pointercancel`,_),n.addEventListener(`lostpointercapture`,_),n.addEventListener(`keydown`,v),{root:n,track:i,rail:r,label(e){n.setAttribute(`aria-label`,e)},dragging(){return u},range(e,t){s=e,c=t,n.setAttribute(`aria-valuemin`,String(e)),n.setAttribute(`aria-valuemax`,String(t)),d()},set(e,t){l=L(e,s,c),n.setAttribute(`aria-valuenow`,String(l)),n.setAttribute(`aria-valuetext`,t),d()},dispose(){n.removeEventListener(`pointerdown`,m),n.removeEventListener(`pointermove`,h),n.removeEventListener(`pointerup`,g),n.removeEventListener(`pointercancel`,_),n.removeEventListener(`lostpointercapture`,_),n.removeEventListener(`keydown`,v)}}}let z=[`play`,`pause`],B=`${E}
|
|
25
|
+
|
|
26
|
+
:host { display: block; }
|
|
27
|
+
:host([hidden]) { display: none; }
|
|
28
|
+
[part~="slider"] {
|
|
29
|
+
position: relative;
|
|
30
|
+
height: 40px;
|
|
31
|
+
border-radius: var(--mbx-radius);
|
|
32
|
+
cursor: pointer;
|
|
33
|
+
touch-action: none;
|
|
34
|
+
}
|
|
35
|
+
[part~="slider"]:focus-visible { outline: 2px solid var(--mbx-accent); outline-offset: -2px; }
|
|
36
|
+
[part~="rail"] { position: absolute; top: 0; bottom: 0; left: 8px; right: 8px; }
|
|
37
|
+
[part~="track"] {
|
|
38
|
+
position: absolute;
|
|
39
|
+
top: 50%;
|
|
40
|
+
left: 0;
|
|
41
|
+
right: 0;
|
|
42
|
+
height: 4px;
|
|
43
|
+
transform: translateY(-50%);
|
|
44
|
+
background: rgba(255, 255, 255, 0.35);
|
|
45
|
+
border-radius: 2px;
|
|
46
|
+
overflow: hidden;
|
|
47
|
+
}
|
|
48
|
+
[part~="fill"] { position: absolute; top: 0; bottom: 0; left: 0; background: var(--mbx-accent); }
|
|
49
|
+
[part~="thumb"] {
|
|
50
|
+
position: absolute;
|
|
51
|
+
top: 50%;
|
|
52
|
+
width: 12px;
|
|
53
|
+
height: 12px;
|
|
54
|
+
margin: -6px 0 0 -6px;
|
|
55
|
+
border-radius: 50%;
|
|
56
|
+
background: var(--mbx-text);
|
|
57
|
+
pointer-events: none;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
:host {
|
|
61
|
+
position: absolute;
|
|
62
|
+
inset: 0;
|
|
63
|
+
display: flex;
|
|
64
|
+
align-items: center;
|
|
65
|
+
justify-content: center;
|
|
66
|
+
padding: 16px;
|
|
67
|
+
background: rgba(0, 0, 0, 0.85);
|
|
68
|
+
color: var(--mbx-text);
|
|
69
|
+
font: 400 15px/1.4 var(--mbx-font);
|
|
70
|
+
text-align: center;
|
|
71
|
+
}
|
|
72
|
+
:host([hidden]) { display: none; }
|
|
73
|
+
[part~="box"] { display: flex; flex-direction: column; align-items: center; gap: 12px; width: min(100%, 420px); }
|
|
74
|
+
[part~="title"] { font-size: 18px; font-weight: 600; }
|
|
75
|
+
[part~="row"] { display: flex; align-items: center; justify-content: center; gap: 12px; width: 100%; }
|
|
76
|
+
[part~="slider"] { flex: 1; }
|
|
77
|
+
[part~="time"] { font-variant-numeric: tabular-nums; color: var(--mbx-muted); font-size: 13px; }
|
|
78
|
+
[part~="stop"] {
|
|
79
|
+
height: 36px;
|
|
80
|
+
padding: 0 16px;
|
|
81
|
+
font: inherit;
|
|
82
|
+
font-weight: 600;
|
|
83
|
+
color: inherit;
|
|
84
|
+
background: transparent;
|
|
85
|
+
border: 1px solid currentColor;
|
|
86
|
+
border-radius: var(--mbx-radius);
|
|
87
|
+
cursor: pointer;
|
|
88
|
+
}
|
|
89
|
+
[part~="stop"]:focus-visible { outline: 2px solid var(--mbx-accent); outline-offset: -2px; }
|
|
90
|
+
[hidden] { display: none; }
|
|
91
|
+
`;var V=class extends S{static get observedAttributes(){return[`label`,`label-stop`,`label-play`,`label-pause`,`label-seek`]}constructor(){super(),this.api=null,this.held=null;let e=this.attachShadow({mode:`open`}),t=A(`div`,`box`);this.title_=A(`div`,`title`),this.play=document.createElement(`button`),this.play.type=`button`,this.play.setAttribute(`part`,`button play`),this.slots=O(z,T);for(let e of z)this.play.append(this.slots[e]);this.play.addEventListener(`click`,()=>{var e;(e=this.api)==null||e.playPause()}),this.seek=R({step:()=>5,page:()=>30,onInput:e=>{var t;if(this.seek.dragging()){this.held=e,this.paint();return}this.held=null,(t=this.api)==null||t.seek(e)},onDrag:e=>{this.toggleAttribute(`dragging`,e),e||(this.held=null)}}),this.time=A(`span`,`time`),this.row=A(`div`,`row`),this.row.append(this.play,this.seek.root,this.time),this.stop=A(`button`,`stop`),this.stop.type=`button`,this.stop.addEventListener(`click`,()=>{var e;(e=this.api)==null||e.stop()}),t.append(this.title_,this.row,this.stop),e.append(D(B),t)}connectedCallback(){this.player===null&&(this.hidden=!0),super.connectedCallback()}attach(e){let t=y(e);this.api=t,this.keep(t.watch(()=>{this.render()})),this.render()}detach(){this.api=null,this.hidden=!0}paint(){var e;let t=this.api;if(t===null)return;let n=t.remote(),r=n.loaded&&Number.isFinite(n.duration);if(this.seek.root.hidden=!r,this.time.hidden=!r,!r)return;let i=(e=this.held)==null?n.time:e;this.seek.range(0,n.duration),this.seek.set(i,P(i,n.duration)),this.time.textContent=`${N(i)} / ${N(n.duration)}`}render(){var e,t,n,r,i;let a=this.api;if(a===null)return;let o=a.remote(),s=o.loaded&&!o.paused?`pause`:`play`;k(this.slots,s),this.play.setAttribute(`aria-label`,(e=this.getAttribute(`label-${s}`))==null?s===`play`?`Play`:`Pause`:e),this.seek.label((t=this.getAttribute(`label-seek`))==null?`Seek`:t),this.stop.textContent=(n=this.getAttribute(`label-stop`))==null?`Stop casting`:n;let c=a.state()===`casting`;this.hidden=!c,c&&(this.title_.textContent=j((r=this.getAttribute(`label`))==null?`Casting to {device}`:r,{device:(i=a.device())==null?``:i}),this.play.disabled=!o.loaded,this.paint())}};let H=`mbx-cast-button`,U=`mbx-cast-screen`;return customElements.get(`mbx-cast-button`)===void 0&&customElements.define(H,I),customElements.get(`mbx-cast-screen`)===void 0&&customElements.define(U,V),e.CAST_BUTTON=H,e.CAST_SCREEN=U,e.MbxCastButton=I,e.MbxCastScreen=V,e})({});
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the two elements share: finding their player, and letting go of it.
|
|
3
|
+
* A copy of the player's own base, because the player exports no base
|
|
4
|
+
* class: a control of the page's own implements the contract from outside
|
|
5
|
+
* (player guide, chapter 03), and so does this package.
|
|
6
|
+
*
|
|
7
|
+
* A control attaches when it is connected inside a player, once the player
|
|
8
|
+
* is defined and upgraded, and detaches when it is removed. Every listener
|
|
9
|
+
* a control adds goes through `listen`, so detaching drops them all. A
|
|
10
|
+
* control connected outside a player is inert. Moving one to another
|
|
11
|
+
* player detaches and attaches again, so a framework that reorders
|
|
12
|
+
* children is safe.
|
|
13
|
+
*
|
|
14
|
+
* No class fields: the ES2015 build would lower them into helpers, and the
|
|
15
|
+
* emit check bans helpers. State is declared, then assigned in the
|
|
16
|
+
* constructor.
|
|
17
|
+
*/
|
|
18
|
+
import type { Mattebox } from 'mattebox';
|
|
19
|
+
import type { PlayerHost } from './host.js';
|
|
20
|
+
export declare abstract class Component extends HTMLElement {
|
|
21
|
+
protected player: PlayerHost | null;
|
|
22
|
+
private offs;
|
|
23
|
+
/** Bumped on every connect and disconnect, so a late upgrade attaches only to the current connection. */
|
|
24
|
+
private epoch;
|
|
25
|
+
constructor();
|
|
26
|
+
connectedCallback(): void;
|
|
27
|
+
disconnectedCallback(): void;
|
|
28
|
+
attributeChangedCallback(): void;
|
|
29
|
+
/** Adds `fn` for every name on `target`, to be removed on detach. */
|
|
30
|
+
protected listen(target: EventTarget, names: readonly string[], fn: () => void): void;
|
|
31
|
+
/** Keeps `off` to run on detach. */
|
|
32
|
+
protected keep(off: () => void): void;
|
|
33
|
+
/**
|
|
34
|
+
* Runs `fn` over the current engine now and on every session change,
|
|
35
|
+
* running what the last call returned first, so a control's engine
|
|
36
|
+
* subscriptions live exactly as long as the session. Detach runs it too.
|
|
37
|
+
*/
|
|
38
|
+
protected follow(player: PlayerHost, fn: (engine: Mattebox | null) => (() => void) | undefined): void;
|
|
39
|
+
/** Runs `fn` when any of `names` changes on `target`, or under it with `subtree`, until detach. */
|
|
40
|
+
protected observe(target: Element, names: readonly string[], fn: () => void, subtree?: boolean): void;
|
|
41
|
+
/** The control is connected inside an upgraded player. Subscribe and render. */
|
|
42
|
+
protected abstract attach(player: PlayerHost): void;
|
|
43
|
+
/** The control left its player. Listeners are already gone; undo anything else. */
|
|
44
|
+
protected detach(_player: PlayerHost): void;
|
|
45
|
+
/** Draws the current state. Called on every observed attribute change while attached. */
|
|
46
|
+
protected render(): void;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAG5C,8BAAsB,SAAU,SAAQ,WAAW;IACjD,UAAkB,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC5C,QAAgB,IAAI,CAAoB;IACxC,yGAAyG;IACzG,QAAgB,KAAK,CAAS;;IAS9B,iBAAiB,IAAI,IAAI;IAiBzB,oBAAoB,IAAI,IAAI;IAU5B,wBAAwB,IAAI,IAAI;IAIhC,qEAAqE;IACrE,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAOrF,oCAAoC;IACpC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,IAAI,GAAG,IAAI;IAIrC;;;;OAIG;IACH,SAAS,CAAC,MAAM,CACd,MAAM,EAAE,UAAU,EAClB,EAAE,EAAE,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,GACxD,IAAI;IAcP,mGAAmG;IACnG,SAAS,CAAC,OAAO,CACf,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,EAAE,EAAE,MAAM,IAAI,EACd,OAAO,UAAQ,GACd,IAAI;IAQP,gFAAgF;IAChF,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAEnD,mFAAmF;IACnF,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAE3C,yFAAyF;IACzF,SAAS,CAAC,MAAM,IAAI,IAAI;CACzB"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { findPlayer, PLAYER } from './host.js';
|
|
2
|
+
export class Component extends HTMLElement {
|
|
3
|
+
constructor() {
|
|
4
|
+
super();
|
|
5
|
+
this.player = null;
|
|
6
|
+
this.offs = [];
|
|
7
|
+
this.epoch = 0;
|
|
8
|
+
}
|
|
9
|
+
connectedCallback() {
|
|
10
|
+
const found = findPlayer(this);
|
|
11
|
+
if (found === null)
|
|
12
|
+
return;
|
|
13
|
+
this.epoch += 1;
|
|
14
|
+
const epoch = this.epoch;
|
|
15
|
+
const attach = () => {
|
|
16
|
+
if (epoch !== this.epoch || !this.isConnected)
|
|
17
|
+
return;
|
|
18
|
+
// Defined, and this instance upgraded: `video` is on the prototype.
|
|
19
|
+
customElements.upgrade(found);
|
|
20
|
+
if (!('video' in found))
|
|
21
|
+
return;
|
|
22
|
+
this.player = found;
|
|
23
|
+
this.attach(this.player);
|
|
24
|
+
};
|
|
25
|
+
if ('video' in found)
|
|
26
|
+
attach();
|
|
27
|
+
else
|
|
28
|
+
void customElements.whenDefined(PLAYER).then(attach);
|
|
29
|
+
}
|
|
30
|
+
disconnectedCallback() {
|
|
31
|
+
this.epoch += 1;
|
|
32
|
+
for (const off of this.offs)
|
|
33
|
+
off();
|
|
34
|
+
this.offs = [];
|
|
35
|
+
const player = this.player;
|
|
36
|
+
if (player === null)
|
|
37
|
+
return;
|
|
38
|
+
this.player = null;
|
|
39
|
+
this.detach(player);
|
|
40
|
+
}
|
|
41
|
+
attributeChangedCallback() {
|
|
42
|
+
if (this.player !== null)
|
|
43
|
+
this.render();
|
|
44
|
+
}
|
|
45
|
+
/** Adds `fn` for every name on `target`, to be removed on detach. */
|
|
46
|
+
listen(target, names, fn) {
|
|
47
|
+
for (const name of names)
|
|
48
|
+
target.addEventListener(name, fn);
|
|
49
|
+
this.offs.push(() => {
|
|
50
|
+
for (const name of names)
|
|
51
|
+
target.removeEventListener(name, fn);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/** Keeps `off` to run on detach. */
|
|
55
|
+
keep(off) {
|
|
56
|
+
this.offs.push(off);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Runs `fn` over the current engine now and on every session change,
|
|
60
|
+
* running what the last call returned first, so a control's engine
|
|
61
|
+
* subscriptions live exactly as long as the session. Detach runs it too.
|
|
62
|
+
*/
|
|
63
|
+
follow(player, fn) {
|
|
64
|
+
let off;
|
|
65
|
+
const run = () => {
|
|
66
|
+
off?.();
|
|
67
|
+
off = fn(player.engine);
|
|
68
|
+
};
|
|
69
|
+
this.listen(player, ['sourcechange'], run);
|
|
70
|
+
this.offs.push(() => {
|
|
71
|
+
off?.();
|
|
72
|
+
off = undefined;
|
|
73
|
+
});
|
|
74
|
+
run();
|
|
75
|
+
}
|
|
76
|
+
/** Runs `fn` when any of `names` changes on `target`, or under it with `subtree`, until detach. */
|
|
77
|
+
observe(target, names, fn, subtree = false) {
|
|
78
|
+
const observer = new MutationObserver(fn);
|
|
79
|
+
observer.observe(target, { attributes: true, attributeFilter: [...names], subtree });
|
|
80
|
+
this.offs.push(() => {
|
|
81
|
+
observer.disconnect();
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/** The control left its player. Listeners are already gone; undo anything else. */
|
|
85
|
+
detach(_player) { }
|
|
86
|
+
/** Draws the current state. Called on every observed attribute change while attached. */
|
|
87
|
+
render() { }
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component.js","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":"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"}
|