@oxyhq/bloom 1.2.0 → 1.2.1
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/docs/media-flight.mdx +24 -14
- package/lib/commonjs/media-flight/MediaSurface.js +21 -2
- package/lib/commonjs/media-flight/MediaSurface.js.map +1 -1
- package/lib/commonjs/media-flight/expo-video-module.js +32 -0
- package/lib/commonjs/media-flight/expo-video-module.js.map +1 -1
- package/lib/commonjs/media-flight/index.js +6 -0
- package/lib/commonjs/media-flight/index.js.map +1 -1
- package/lib/module/media-flight/MediaSurface.js +21 -2
- package/lib/module/media-flight/MediaSurface.js.map +1 -1
- package/lib/module/media-flight/expo-video-module.js +31 -0
- package/lib/module/media-flight/expo-video-module.js.map +1 -1
- package/lib/module/media-flight/index.js +1 -1
- package/lib/module/media-flight/index.js.map +1 -1
- package/lib/typescript/commonjs/media-flight/MediaSurface.d.ts.map +1 -1
- package/lib/typescript/commonjs/media-flight/expo-video-module.d.ts +22 -0
- package/lib/typescript/commonjs/media-flight/expo-video-module.d.ts.map +1 -1
- package/lib/typescript/commonjs/media-flight/index.d.ts +1 -1
- package/lib/typescript/commonjs/media-flight/index.d.ts.map +1 -1
- package/lib/typescript/module/media-flight/MediaSurface.d.ts.map +1 -1
- package/lib/typescript/module/media-flight/expo-video-module.d.ts +22 -0
- package/lib/typescript/module/media-flight/expo-video-module.d.ts.map +1 -1
- package/lib/typescript/module/media-flight/index.d.ts +1 -1
- package/lib/typescript/module/media-flight/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/media-flight/MediaSurface.tsx +19 -1
- package/src/media-flight/expo-video-module.ts +31 -0
- package/src/media-flight/index.ts +1 -0
package/docs/media-flight.mdx
CHANGED
|
@@ -78,26 +78,36 @@ resolving to the flying surface having visible pixels:
|
|
|
78
78
|
| already rendered by the page (in the image cache) | **1–5** |
|
|
79
79
|
| never requested before (same file, cache-busted) | **510–900** |
|
|
80
80
|
|
|
81
|
-
So a **warm** poster makes the commit a frame, and a **cold** one
|
|
82
|
-
half-second hole exactly where the origin has just disappeared.
|
|
83
|
-
consuming app the hole was ~350 ms, framed by "the feed row stopped painting"
|
|
84
|
-
and "the flight had not started".
|
|
81
|
+
So a **warm** poster makes the commit a frame, and a **cold** one would open a
|
|
82
|
+
half-second hole exactly where the origin has just disappeared.
|
|
85
83
|
|
|
86
|
-
**The
|
|
87
|
-
front of the user's tap, which is worse in the place people actually feel it.
|
|
88
|
-
The
|
|
89
|
-
will carry.
|
|
84
|
+
**The remedy is not to make `flyTo` wait.** Waiting would move that half second
|
|
85
|
+
in front of the user's tap, which is worse in the place people actually feel it.
|
|
86
|
+
The remedy is to make sure the origin has already painted the exact URI the
|
|
87
|
+
flight will carry.
|
|
90
88
|
|
|
91
|
-
<Callout variant="warning" title="expo-video
|
|
89
|
+
<Callout variant="warning" title="expo-video will not fetch your poster for you">
|
|
92
90
|
On web, expo-video's `VideoView` renders `<video src=…>` with **no `poster`
|
|
93
|
-
attribute
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
91
|
+
attribute**, so passing a poster to the video view does not cause that URL to be
|
|
92
|
+
requested. Something else has to paint it — render the still yourself under the
|
|
93
|
+
video (`MediaPoster` is exported for exactly this, and Mention does it with
|
|
94
|
+
`expo-image` at `cachePolicy="memory-disk"`), or prefetch it. Do that and it is
|
|
95
|
+
warm by the time anything flies.
|
|
97
96
|
</Callout>
|
|
98
97
|
|
|
99
98
|
One-minute check: in the Network panel, does the poster request appear **when
|
|
100
|
-
you tap
|
|
99
|
+
you tap**, or was it already there?
|
|
100
|
+
|
|
101
|
+
<Callout variant="info" title="A poster is invisible to `requestVideoFrameCallback`">
|
|
102
|
+
If you measure continuity by counting decoded video frames, **a flight covered
|
|
103
|
+
by its poster reads as a gap** — `requestVideoFrameCallback` fires only for
|
|
104
|
+
decoded VIDEO, and a poster is an `<img>` that never triggers it. A ~350 ms
|
|
105
|
+
"hole" measured that way in a consuming app turned out to be exactly this: a CDP
|
|
106
|
+
screencast over the same transition showed 25 frames in 844 ms, luminance gliding
|
|
107
|
+
218 → 99, **zero black frames**, with the frame at t=360 ms — inside the supposed
|
|
108
|
+
hole — showing video filling the viewport. Measure what the screen shows, not
|
|
109
|
+
what one API reports.
|
|
110
|
+
</Callout>
|
|
101
111
|
|
|
102
112
|
`scripts/verify-media-flight.mjs` gates Bloom's half — that a warm surface
|
|
103
113
|
presents within a frame or two, with no re-fetch and no fade. Its control flies
|
|
@@ -121,8 +121,19 @@ const MediaSurface = exports.MediaSurface = /*#__PURE__*/(0, _react.memo)(functi
|
|
|
121
121
|
player: content.player,
|
|
122
122
|
contentFit: contentFit,
|
|
123
123
|
surfaceType: mountedSurfaceType,
|
|
124
|
-
nativeControls: nativeControls
|
|
125
|
-
|
|
124
|
+
nativeControls: nativeControls
|
|
125
|
+
// `absoluteFill` ALONE does not size this, and the reason is a CSS
|
|
126
|
+
// rule rather than a bug: expo-video renders a DOM `<video>`, which is
|
|
127
|
+
// a REPLACED element, and `position:absolute; inset:0` with
|
|
128
|
+
// `width/height:auto` resolves a replaced element to its INTRINSIC
|
|
129
|
+
// size — 300x150, the `<video>` default — instead of stretching it.
|
|
130
|
+
// Measured: inside a 320x200 box the element computed
|
|
131
|
+
// `left/right/top/bottom: 0px` and `width: 300px; height: 150px`, so
|
|
132
|
+
// it sat at the default while the box animated around it and then
|
|
133
|
+
// jumped when metadata arrived. The poster escapes this only because
|
|
134
|
+
// expo-image sizes its own element.
|
|
135
|
+
,
|
|
136
|
+
style: [_reactNative.StyleSheet.absoluteFill, styles.fillReplaced],
|
|
126
137
|
accessibilityLabel: accessibilityLabel,
|
|
127
138
|
onFirstFrameRender: reportLive
|
|
128
139
|
}) : null]
|
|
@@ -176,6 +187,14 @@ function EmptyMediaSurface({
|
|
|
176
187
|
});
|
|
177
188
|
}
|
|
178
189
|
const styles = _reactNative.StyleSheet.create({
|
|
190
|
+
/**
|
|
191
|
+
* Explicit size for a REPLACED element. Redundant for a `<div>` and
|
|
192
|
+
* load-bearing for a `<video>` — see the note at the call site.
|
|
193
|
+
*/
|
|
194
|
+
fillReplaced: {
|
|
195
|
+
width: '100%',
|
|
196
|
+
height: '100%'
|
|
197
|
+
},
|
|
179
198
|
box: {
|
|
180
199
|
// What makes the box's corner radius actually clip a video, and the other
|
|
181
200
|
// half of why the Android surface has to be a `textureView`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","require","_reactNative","_expoImage","_reactNativeReanimated","_interopRequireDefault","_store","_expoVideoModule","_jsxRuntime","e","__esModule","default","webDraggableProps","Platform","OS","draggable","MediaSurface","exports","memo","content","style","contentFit","surfaceType","nativeControls","accessibilityLabel","pointerEvents","flightId","mountedSurfaceType","useState","reportLive","useCallback","undefined","handOffFlight","still","kind","poster","uri","expoVideo","loadExpoVideo","warnExpoVideoUnavailable","jsxs","View","styles","box","children","jsx","Image","source","StyleSheet","absoluteFill","transition","onLoad","VideoView","player","onFirstFrameRender","displayName","MediaPoster","EmptyMediaSurface","empty","create","overflow","backgroundColor"],"sourceRoot":"../../../src","sources":["media-flight/MediaSurface.tsx"],"mappings":"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
|
|
1
|
+
{"version":3,"names":["_react","require","_reactNative","_expoImage","_reactNativeReanimated","_interopRequireDefault","_store","_expoVideoModule","_jsxRuntime","e","__esModule","default","webDraggableProps","Platform","OS","draggable","MediaSurface","exports","memo","content","style","contentFit","surfaceType","nativeControls","accessibilityLabel","pointerEvents","flightId","mountedSurfaceType","useState","reportLive","useCallback","undefined","handOffFlight","still","kind","poster","uri","expoVideo","loadExpoVideo","warnExpoVideoUnavailable","jsxs","View","styles","box","children","jsx","Image","source","StyleSheet","absoluteFill","transition","onLoad","VideoView","player","fillReplaced","onFirstFrameRender","displayName","MediaPoster","EmptyMediaSurface","empty","create","width","height","overflow","backgroundColor"],"sourceRoot":"../../../src","sources":["media-flight/MediaSurface.tsx"],"mappings":";;;;;;;;AAeA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAQA,IAAAE,UAAA,GAAAF,OAAA;AACA,IAAAG,sBAAA,GAAAC,sBAAA,CAAAJ,OAAA;AAEA,IAAAK,MAAA,GAAAL,OAAA;AAEA,IAAAM,gBAAA,GAAAN,OAAA;AAI6B,IAAAO,WAAA,GAAAP,OAAA;AAAA,SAAAI,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAjC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAqBA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA,MAAMG,iBAAiB,GAAGC,qBAAQ,CAACC,EAAE,KAAK,KAAK,GAAG;EAAEC,SAAS,EAAE;AAAM,CAAC,GAAG,CAAC,CAAC;AA0C3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,YAAY,GAAAC,OAAA,CAAAD,YAAA,gBAAG,IAAAE,WAAI,EAAC,SAASF,YAAYA,CAAC;EACrDG,OAAO;EACPC,KAAK;EACLC,UAAU,GAAG,SAAS;EACtBC,WAAW,GAAG,aAAa;EAC3BC,cAAc,GAAG,KAAK;EACtBC,kBAAkB;EAClBC,aAAa;EACbC;AACiB,CAAC,EAAE;EACpB;EACA;EACA;EACA,MAAM,CAACC,kBAAkB,CAAC,GAAG,IAAAC,eAAQ,EAACN,WAAW,CAAC;;EAElD;EACA;EACA;EACA;EACA,MAAMO,UAAU,GAAG,IAAAC,kBAAW,EAAC,MAAM;IACnC,IAAIJ,QAAQ,KAAKK,SAAS,EAAE,IAAAC,oBAAa,EAACN,QAAQ,CAAC;EACrD,CAAC,EAAE,CAACA,QAAQ,CAAC,CAAC;EAEd,MAAMO,KAAK,GAAGd,OAAO,CAACe,IAAI,KAAK,OAAO,GAAGf,OAAO,CAACgB,MAAM,GAAGhB,OAAO,CAACiB,GAAG;EACrE;EACA;EACA,MAAMC,SAAS,GAAGlB,OAAO,CAACe,IAAI,KAAK,OAAO,GAAG,IAAAI,8BAAa,EAAC,CAAC,GAAG,IAAI;EACnE,IAAInB,OAAO,CAACe,IAAI,KAAK,OAAO,IAAIG,SAAS,KAAK,IAAI,EAAE;IAClD;IACA;IACA;IACA;IACA,IAAAE,yCAAwB,EAAC,CAAC;EAC5B;EAEA,oBACE,IAAA/B,WAAA,CAAAgC,IAAA,EAACpC,sBAAA,CAAAO,OAAQ,CAAC8B,IAAI;IAACrB,KAAK,EAAE,CAACsB,MAAM,CAACC,GAAG,EAAEvB,KAAK,CAAE;IAACK,aAAa,EAAEA,aAAc;IAAAmB,QAAA,GACrEX,KAAK,KAAKF,SAAS,GAAG,IAAI;IAAA;IACzB;IACA;IACA;IACA;IACA;IACA;IACA,IAAAvB,WAAA,CAAAqC,GAAA,EAAC1C,UAAA,CAAA2C,KAAK;MACJC,MAAM,EAAE;QAAEX,GAAG,EAAEH;MAAM,CAAE;MACvBZ,UAAU,EAAEA,UAAW;MACvBD,KAAK,EAAE4B,uBAAU,CAACC,YAAa;MAC/BC,UAAU,EAAE,CAAE;MACd1B,kBAAkB,EAAEA;MACpB;MACA;MACA;MAAA;MACA2B,MAAM,EAAEhC,OAAO,CAACe,IAAI,KAAK,OAAO,GAAGH,SAAS,GAAGF,UAAW;MAAA,GACtDjB;IAAiB,CACtB,CACF,EACAO,OAAO,CAACe,IAAI,KAAK,OAAO,IAAIG,SAAS,KAAK,IAAI,gBAC7C,IAAA7B,WAAA,CAAAqC,GAAA,EAACR,SAAS,CAACe,SAAS;MAClBC,MAAM,EAAElC,OAAO,CAACkC,MAAO;MACvBhC,UAAU,EAAEA,UAAW;MACvBC,WAAW,EAAEK,kBAAmB;MAChCJ,cAAc,EAAEA;MAChB;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MAAA;MACAH,KAAK,EAAE,CAAC4B,uBAAU,CAACC,YAAY,EAAEP,MAAM,CAACY,YAAY,CAAE;MACtD9B,kBAAkB,EAAEA,kBAAmB;MACvC+B,kBAAkB,EAAE1B;IAAW,CAChC,CAAC,GACA,IAAI;EAAA,CACK,CAAC;AAEpB,CAAC,CAAC;AAEFb,YAAY,CAACwC,WAAW,GAAG,cAAc;;AAEzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,WAAWA,CAAC;EAC1BtC,OAAO;EACPC,KAAK;EACLC,UAAU,GAAG,OAAO;EACpBG;AAMF,CAAC,EAAE;EACD,MAAMY,GAAG,GAAGjB,OAAO,CAACe,IAAI,KAAK,OAAO,GAAGf,OAAO,CAACgB,MAAM,GAAGhB,OAAO,CAACiB,GAAG;EACnE,IAAIA,GAAG,KAAKL,SAAS,EAAE,oBAAO,IAAAvB,WAAA,CAAAqC,GAAA,EAACa,iBAAiB;IAACtC,KAAK,EAAEA;EAAM,CAAE,CAAC;EACjE,oBACE,IAAAZ,WAAA,CAAAqC,GAAA,EAAC1C,UAAA,CAAA2C,KAAK;IACJC,MAAM,EAAE;MAAEX;IAAI,CAAE;IAChBf,UAAU,EAAEA,UAAW;IACvBD,KAAK,EAAEA,KAAM;IACb8B,UAAU,EAAE,CAAE;IACd1B,kBAAkB,EAAEA,kBAAmB;IAAA,GACnCZ;EAAiB,CACtB,CAAC;AAEN;;AAEA;AACA;AACA;AACA;AACO,SAAS8C,iBAAiBA,CAAC;EAAEtC;AAAoC,CAAC,EAAE;EACzE,oBAAO,IAAAZ,WAAA,CAAAqC,GAAA,EAAC3C,YAAA,CAAAuC,IAAI;IAACrB,KAAK,EAAE,CAACsB,MAAM,CAACiB,KAAK,EAAEvC,KAAK,CAAE;IAACK,aAAa,EAAC;EAAM,CAAE,CAAC;AACpE;AAEA,MAAMiB,MAAM,GAAGM,uBAAU,CAACY,MAAM,CAAC;EAC/B;AACF;AACA;AACA;EACEN,YAAY,EAAE;IACZO,KAAK,EAAE,MAAM;IACbC,MAAM,EAAE;EACV,CAAC;EACDnB,GAAG,EAAE;IACH;IACA;IACAoB,QAAQ,EAAE;EACZ,CAAC;EACDJ,KAAK,EAAE;IACLK,eAAe,EAAE;EACnB;AACF,CAAC,CAAC","ignoreList":[]}
|
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.loadExpoVideo = loadExpoVideo;
|
|
7
|
+
exports.provideExpoVideo = provideExpoVideo;
|
|
7
8
|
exports.resetExpoVideoModule = resetExpoVideoModule;
|
|
8
9
|
exports.warnExpoVideoUnavailable = warnExpoVideoUnavailable;
|
|
9
10
|
/**
|
|
@@ -83,12 +84,42 @@ exports.warnExpoVideoUnavailable = warnExpoVideoUnavailable;
|
|
|
83
84
|
|
|
84
85
|
/** `undefined` until the first load attempt, then the module or `null`. */
|
|
85
86
|
let videoModule;
|
|
87
|
+
/** Set by {@link provideExpoVideo}; wins over the `require` below. */
|
|
88
|
+
let providedModule;
|
|
86
89
|
/** Why the load failed, quoted verbatim in the dev warning. */
|
|
87
90
|
let unavailableReason = '';
|
|
88
91
|
let hasWarned = false;
|
|
89
92
|
|
|
93
|
+
/**
|
|
94
|
+
* Hand Bloom the expo-video module explicitly.
|
|
95
|
+
*
|
|
96
|
+
* REQUIRED ON ANY ESM WEB BUNDLER, and measured rather than assumed: in a Vite
|
|
97
|
+
* bundle `typeof require` is `undefined`, so the optional-peer `require` below
|
|
98
|
+
* cannot run and video silently degrades to its poster **even when expo-video
|
|
99
|
+
* is installed**. Metro has a real `require` and is unaffected, which is why
|
|
100
|
+
* this went unnoticed — the app that uses this is Metro-built.
|
|
101
|
+
*
|
|
102
|
+
* There is no bundler-agnostic sync alternative: `import()` is async and this is
|
|
103
|
+
* called during render, so making it async would mean the surface renders
|
|
104
|
+
* without video for a frame and then upgrades. Handing the module over is
|
|
105
|
+
* explicit, synchronous, and costs the consumer one line at startup:
|
|
106
|
+
*
|
|
107
|
+
* ```ts
|
|
108
|
+
* import * as ExpoVideo from 'expo-video';
|
|
109
|
+
* provideExpoVideo(ExpoVideo);
|
|
110
|
+
* ```
|
|
111
|
+
*
|
|
112
|
+
* Pass `null` to clear it.
|
|
113
|
+
*/
|
|
114
|
+
function provideExpoVideo(module) {
|
|
115
|
+
providedModule = module;
|
|
116
|
+
// Drop any cached `require` result so the next load reflects this decision.
|
|
117
|
+
videoModule = undefined;
|
|
118
|
+
}
|
|
119
|
+
|
|
90
120
|
/** The expo-video module, or `null` when the optional peer is not installed. */
|
|
91
121
|
function loadExpoVideo() {
|
|
122
|
+
if (providedModule !== undefined && providedModule !== null) return providedModule;
|
|
92
123
|
if (videoModule !== undefined) return videoModule;
|
|
93
124
|
videoModule = null;
|
|
94
125
|
|
|
@@ -142,6 +173,7 @@ function warnExpoVideoUnavailable() {
|
|
|
142
173
|
/** Test seam — drops the cached module handle so a suite can load it again. */
|
|
143
174
|
function resetExpoVideoModule() {
|
|
144
175
|
videoModule = undefined;
|
|
176
|
+
providedModule = undefined;
|
|
145
177
|
unavailableReason = '';
|
|
146
178
|
hasWarned = false;
|
|
147
179
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["videoModule","unavailableReason","hasWarned","
|
|
1
|
+
{"version":3,"names":["videoModule","providedModule","unavailableReason","hasWarned","provideExpoVideo","module","undefined","loadExpoVideo","require","loaded","resolved","isComponentBearing","default","VideoView","error","Error","message","String","candidate","view","warnExpoVideoUnavailable","process","env","NODE_ENV","console","warn","resetExpoVideoModule"],"sourceRoot":"../../../src","sources":["media-flight/expo-video-module.ts"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAOA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;;AAkBA;;AAKA;AACA,IAAIA,WAA6C;AACjD;AACA,IAAIC,cAAgD;AACpD;AACA,IAAIC,iBAAiB,GAAG,EAAE;AAC1B,IAAIC,SAAS,GAAG,KAAK;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,gBAAgBA,CAACC,MAA4B,EAAQ;EACnEJ,cAAc,GAAGI,MAAM;EACvB;EACAL,WAAW,GAAGM,SAAS;AACzB;;AAEA;AACO,SAASC,aAAaA,CAAA,EAAyB;EACpD,IAAIN,cAAc,KAAKK,SAAS,IAAIL,cAAc,KAAK,IAAI,EAAE,OAAOA,cAAc;EAClF,IAAID,WAAW,KAAKM,SAAS,EAAE,OAAON,WAAW;EACjDA,WAAW,GAAG,IAAI;;EAElB;EACA;EACA;EACA;EACA,IAAI,OAAOQ,OAAO,KAAK,WAAW,EAAE;IAClCN,iBAAiB,GAAG,uCAAuC;IAC3D,OAAOF,WAAW;EACpB;EAEA,IAAI;IACF,MAAMS,MAAM,GAAGD,OAAO,CAAC,YAAY,CAGtB;IACb;IACA;IACA;IACA,MAAME,QAAQ,GAAGC,kBAAkB,CAACF,MAAM,CAAC,GAAGA,MAAM,GAAGA,MAAM,EAAEG,OAAO;IAEtE,IAAID,kBAAkB,CAACD,QAAQ,CAAC,EAAE;MAChCV,WAAW,GAAG;QAAEa,SAAS,EAAEH,QAAQ,CAACG;MAA+C,CAAC;IACtF,CAAC,MAAM;MACLX,iBAAiB,GAAG,kDAAkD;IACxE;EACF,CAAC,CAAC,OAAOY,KAAK,EAAE;IACdZ,iBAAiB,GAAGY,KAAK,YAAYC,KAAK,GAAGD,KAAK,CAACE,OAAO,GAAGC,MAAM,CAACH,KAAK,CAAC;EAC5E;EAEA,OAAOd,WAAW;AACpB;AAEA,SAASW,kBAAkBA,CACzBO,SAA8E,EACU;EACxF,MAAMC,IAAI,GAAGD,SAAS,EAAEL,SAAS;EACjC,IAAI,OAAOM,IAAI,KAAK,UAAU,EAAE,OAAO,IAAI;EAC3C,OAAO,OAAOA,IAAI,KAAK,QAAQ,IAAIA,IAAI,KAAK,IAAI,IAAI,UAAU,IAAIA,IAAI;AACxE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,wBAAwBA,CAAA,EAAS;EAC/C,IAAIC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,IAAIpB,SAAS,EAAE;EACxDA,SAAS,GAAG,IAAI;EAChB;EACA;EACA;EACAqB,OAAO,CAACC,IAAI,CACV,2EAA2E,GACzE,2EAA2E,GAC3E,6DAA6D,GAC7D,8DAA8D,GAC9D,WAAWvB,iBAAiB,EAChC,CAAC;AACH;;AAEA;AACO,SAASwB,oBAAoBA,CAAA,EAAS;EAC3C1B,WAAW,GAAGM,SAAS;EACvBL,cAAc,GAAGK,SAAS;EAC1BJ,iBAAiB,GAAG,EAAE;EACtBC,SAAS,GAAG,KAAK;AACnB","ignoreList":[]}
|
|
@@ -63,6 +63,12 @@ Object.defineProperty(exports, "loadExpoVideo", {
|
|
|
63
63
|
return _expoVideoModule.loadExpoVideo;
|
|
64
64
|
}
|
|
65
65
|
});
|
|
66
|
+
Object.defineProperty(exports, "provideExpoVideo", {
|
|
67
|
+
enumerable: true,
|
|
68
|
+
get: function () {
|
|
69
|
+
return _expoVideoModule.provideExpoVideo;
|
|
70
|
+
}
|
|
71
|
+
});
|
|
66
72
|
Object.defineProperty(exports, "releaseFlight", {
|
|
67
73
|
enumerable: true,
|
|
68
74
|
get: function () {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_MediaFlightLayer","require","_MediaSurface","_useMediaFlight","_store","_constants","_expoVideoModule"],"sourceRoot":"../../../src","sources":["media-flight/index.ts"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_MediaFlightLayer","require","_MediaSurface","_useMediaFlight","_store","_constants","_expoVideoModule"],"sourceRoot":"../../../src","sources":["media-flight/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,iBAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AACA,IAAAE,eAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AAQA,IAAAI,UAAA,GAAAJ,OAAA;AACA,IAAAK,gBAAA,GAAAL,OAAA","ignoreList":[]}
|
|
@@ -113,8 +113,19 @@ export const MediaSurface = /*#__PURE__*/memo(function MediaSurface({
|
|
|
113
113
|
player: content.player,
|
|
114
114
|
contentFit: contentFit,
|
|
115
115
|
surfaceType: mountedSurfaceType,
|
|
116
|
-
nativeControls: nativeControls
|
|
117
|
-
|
|
116
|
+
nativeControls: nativeControls
|
|
117
|
+
// `absoluteFill` ALONE does not size this, and the reason is a CSS
|
|
118
|
+
// rule rather than a bug: expo-video renders a DOM `<video>`, which is
|
|
119
|
+
// a REPLACED element, and `position:absolute; inset:0` with
|
|
120
|
+
// `width/height:auto` resolves a replaced element to its INTRINSIC
|
|
121
|
+
// size — 300x150, the `<video>` default — instead of stretching it.
|
|
122
|
+
// Measured: inside a 320x200 box the element computed
|
|
123
|
+
// `left/right/top/bottom: 0px` and `width: 300px; height: 150px`, so
|
|
124
|
+
// it sat at the default while the box animated around it and then
|
|
125
|
+
// jumped when metadata arrived. The poster escapes this only because
|
|
126
|
+
// expo-image sizes its own element.
|
|
127
|
+
,
|
|
128
|
+
style: [StyleSheet.absoluteFill, styles.fillReplaced],
|
|
118
129
|
accessibilityLabel: accessibilityLabel,
|
|
119
130
|
onFirstFrameRender: reportLive
|
|
120
131
|
}) : null]
|
|
@@ -168,6 +179,14 @@ export function EmptyMediaSurface({
|
|
|
168
179
|
});
|
|
169
180
|
}
|
|
170
181
|
const styles = StyleSheet.create({
|
|
182
|
+
/**
|
|
183
|
+
* Explicit size for a REPLACED element. Redundant for a `<div>` and
|
|
184
|
+
* load-bearing for a `<video>` — see the note at the call site.
|
|
185
|
+
*/
|
|
186
|
+
fillReplaced: {
|
|
187
|
+
width: '100%',
|
|
188
|
+
height: '100%'
|
|
189
|
+
},
|
|
171
190
|
box: {
|
|
172
191
|
// What makes the box's corner radius actually clip a video, and the other
|
|
173
192
|
// half of why the Android surface has to be a `textureView`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["memo","useCallback","useState","Platform","StyleSheet","View","Image","Animated","handOffFlight","loadExpoVideo","warnExpoVideoUnavailable","jsx","_jsx","jsxs","_jsxs","webDraggableProps","OS","draggable","MediaSurface","content","style","contentFit","surfaceType","nativeControls","accessibilityLabel","pointerEvents","flightId","mountedSurfaceType","reportLive","undefined","still","kind","poster","uri","expoVideo","styles","box","children","source","absoluteFill","transition","onLoad","VideoView","player","onFirstFrameRender","displayName","MediaPoster","EmptyMediaSurface","empty","create","overflow","backgroundColor"],"sourceRoot":"../../../src","sources":["media-flight/MediaSurface.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,IAAI,EAAEC,WAAW,EAAEC,QAAQ,QAA6B,OAAO;AACxE,SACEC,QAAQ,EACRC,UAAU,EACVC,IAAI,QAIC,cAAc;AACrB,SAASC,KAAK,QAAQ,YAAY;AAClC,OAAOC,QAAQ,MAAM,yBAAyB;AAE9C,SAASC,aAAa,QAAQ,YAAS;AAEvC,SACEC,aAAa,EACbC,wBAAwB,QAEnB,wBAAqB;;AAE5B;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AALA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAQA;AACA;AACA;AACA;AACA;AACA,MAAMC,iBAAiB,GAAGZ,QAAQ,CAACa,EAAE,KAAK,KAAK,GAAG;EAAEC,SAAS,EAAE;AAAM,CAAC,GAAG,CAAC,CAAC;AA0C3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,YAAY,gBAAGlB,IAAI,CAAC,SAASkB,YAAYA,CAAC;EACrDC,OAAO;EACPC,KAAK;EACLC,UAAU,GAAG,SAAS;EACtBC,WAAW,GAAG,aAAa;EAC3BC,cAAc,GAAG,KAAK;EACtBC,kBAAkB;EAClBC,aAAa;EACbC;AACiB,CAAC,EAAE;EACpB;EACA;EACA;EACA,MAAM,CAACC,kBAAkB,CAAC,GAAGzB,QAAQ,CAACoB,WAAW,CAAC;;EAElD;EACA;EACA;EACA;EACA,MAAMM,UAAU,GAAG3B,WAAW,CAAC,MAAM;IACnC,IAAIyB,QAAQ,KAAKG,SAAS,EAAErB,aAAa,CAACkB,QAAQ,CAAC;EACrD,CAAC,EAAE,CAACA,QAAQ,CAAC,CAAC;EAEd,MAAMI,KAAK,GAAGX,OAAO,CAACY,IAAI,KAAK,OAAO,GAAGZ,OAAO,CAACa,MAAM,GAAGb,OAAO,CAACc,GAAG;EACrE;EACA;EACA,MAAMC,SAAS,GAAGf,OAAO,CAACY,IAAI,KAAK,OAAO,GAAGtB,aAAa,CAAC,CAAC,GAAG,IAAI;EACnE,IAAIU,OAAO,CAACY,IAAI,KAAK,OAAO,IAAIG,SAAS,KAAK,IAAI,EAAE;IAClD;IACA;IACA;IACA;IACAxB,wBAAwB,CAAC,CAAC;EAC5B;EAEA,oBACEI,KAAA,CAACP,QAAQ,CAACF,IAAI;IAACe,KAAK,EAAE,CAACe,MAAM,CAACC,GAAG,EAAEhB,KAAK,CAAE;IAACK,aAAa,EAAEA,aAAc;IAAAY,QAAA,GACrEP,KAAK,KAAKD,SAAS,GAAG,IAAI;IAAA;IACzB;IACA;IACA;IACA;IACA;IACA;IACAjB,IAAA,CAACN,KAAK;MACJgC,MAAM,EAAE;QAAEL,GAAG,EAAEH;MAAM,CAAE;MACvBT,UAAU,EAAEA,UAAW;MACvBD,KAAK,EAAEhB,UAAU,CAACmC,YAAa;MAC/BC,UAAU,EAAE,CAAE;MACdhB,kBAAkB,EAAEA;MACpB;MACA;MACA;MAAA;MACAiB,MAAM,EAAEtB,OAAO,CAACY,IAAI,KAAK,OAAO,GAAGF,SAAS,GAAGD,UAAW;MAAA,GACtDb;IAAiB,CACtB,CACF,EACAI,OAAO,CAACY,IAAI,KAAK,OAAO,IAAIG,SAAS,KAAK,IAAI,gBAC7CtB,IAAA,CAACsB,SAAS,CAACQ,SAAS;MAClBC,MAAM,EAAExB,OAAO,CAACwB,MAAO;MACvBtB,UAAU,EAAEA,UAAW;MACvBC,WAAW,EAAEK,kBAAmB;MAChCJ,cAAc,EAAEA
|
|
1
|
+
{"version":3,"names":["memo","useCallback","useState","Platform","StyleSheet","View","Image","Animated","handOffFlight","loadExpoVideo","warnExpoVideoUnavailable","jsx","_jsx","jsxs","_jsxs","webDraggableProps","OS","draggable","MediaSurface","content","style","contentFit","surfaceType","nativeControls","accessibilityLabel","pointerEvents","flightId","mountedSurfaceType","reportLive","undefined","still","kind","poster","uri","expoVideo","styles","box","children","source","absoluteFill","transition","onLoad","VideoView","player","fillReplaced","onFirstFrameRender","displayName","MediaPoster","EmptyMediaSurface","empty","create","width","height","overflow","backgroundColor"],"sourceRoot":"../../../src","sources":["media-flight/MediaSurface.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,IAAI,EAAEC,WAAW,EAAEC,QAAQ,QAA6B,OAAO;AACxE,SACEC,QAAQ,EACRC,UAAU,EACVC,IAAI,QAIC,cAAc;AACrB,SAASC,KAAK,QAAQ,YAAY;AAClC,OAAOC,QAAQ,MAAM,yBAAyB;AAE9C,SAASC,aAAa,QAAQ,YAAS;AAEvC,SACEC,aAAa,EACbC,wBAAwB,QAEnB,wBAAqB;;AAE5B;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AALA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAQA;AACA;AACA;AACA;AACA;AACA,MAAMC,iBAAiB,GAAGZ,QAAQ,CAACa,EAAE,KAAK,KAAK,GAAG;EAAEC,SAAS,EAAE;AAAM,CAAC,GAAG,CAAC,CAAC;AA0C3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,YAAY,gBAAGlB,IAAI,CAAC,SAASkB,YAAYA,CAAC;EACrDC,OAAO;EACPC,KAAK;EACLC,UAAU,GAAG,SAAS;EACtBC,WAAW,GAAG,aAAa;EAC3BC,cAAc,GAAG,KAAK;EACtBC,kBAAkB;EAClBC,aAAa;EACbC;AACiB,CAAC,EAAE;EACpB;EACA;EACA;EACA,MAAM,CAACC,kBAAkB,CAAC,GAAGzB,QAAQ,CAACoB,WAAW,CAAC;;EAElD;EACA;EACA;EACA;EACA,MAAMM,UAAU,GAAG3B,WAAW,CAAC,MAAM;IACnC,IAAIyB,QAAQ,KAAKG,SAAS,EAAErB,aAAa,CAACkB,QAAQ,CAAC;EACrD,CAAC,EAAE,CAACA,QAAQ,CAAC,CAAC;EAEd,MAAMI,KAAK,GAAGX,OAAO,CAACY,IAAI,KAAK,OAAO,GAAGZ,OAAO,CAACa,MAAM,GAAGb,OAAO,CAACc,GAAG;EACrE;EACA;EACA,MAAMC,SAAS,GAAGf,OAAO,CAACY,IAAI,KAAK,OAAO,GAAGtB,aAAa,CAAC,CAAC,GAAG,IAAI;EACnE,IAAIU,OAAO,CAACY,IAAI,KAAK,OAAO,IAAIG,SAAS,KAAK,IAAI,EAAE;IAClD;IACA;IACA;IACA;IACAxB,wBAAwB,CAAC,CAAC;EAC5B;EAEA,oBACEI,KAAA,CAACP,QAAQ,CAACF,IAAI;IAACe,KAAK,EAAE,CAACe,MAAM,CAACC,GAAG,EAAEhB,KAAK,CAAE;IAACK,aAAa,EAAEA,aAAc;IAAAY,QAAA,GACrEP,KAAK,KAAKD,SAAS,GAAG,IAAI;IAAA;IACzB;IACA;IACA;IACA;IACA;IACA;IACAjB,IAAA,CAACN,KAAK;MACJgC,MAAM,EAAE;QAAEL,GAAG,EAAEH;MAAM,CAAE;MACvBT,UAAU,EAAEA,UAAW;MACvBD,KAAK,EAAEhB,UAAU,CAACmC,YAAa;MAC/BC,UAAU,EAAE,CAAE;MACdhB,kBAAkB,EAAEA;MACpB;MACA;MACA;MAAA;MACAiB,MAAM,EAAEtB,OAAO,CAACY,IAAI,KAAK,OAAO,GAAGF,SAAS,GAAGD,UAAW;MAAA,GACtDb;IAAiB,CACtB,CACF,EACAI,OAAO,CAACY,IAAI,KAAK,OAAO,IAAIG,SAAS,KAAK,IAAI,gBAC7CtB,IAAA,CAACsB,SAAS,CAACQ,SAAS;MAClBC,MAAM,EAAExB,OAAO,CAACwB,MAAO;MACvBtB,UAAU,EAAEA,UAAW;MACvBC,WAAW,EAAEK,kBAAmB;MAChCJ,cAAc,EAAEA;MAChB;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MAAA;MACAH,KAAK,EAAE,CAAChB,UAAU,CAACmC,YAAY,EAAEJ,MAAM,CAACS,YAAY,CAAE;MACtDpB,kBAAkB,EAAEA,kBAAmB;MACvCqB,kBAAkB,EAAEjB;IAAW,CAChC,CAAC,GACA,IAAI;EAAA,CACK,CAAC;AAEpB,CAAC,CAAC;AAEFV,YAAY,CAAC4B,WAAW,GAAG,cAAc;;AAEzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,WAAWA,CAAC;EAC1B5B,OAAO;EACPC,KAAK;EACLC,UAAU,GAAG,OAAO;EACpBG;AAMF,CAAC,EAAE;EACD,MAAMS,GAAG,GAAGd,OAAO,CAACY,IAAI,KAAK,OAAO,GAAGZ,OAAO,CAACa,MAAM,GAAGb,OAAO,CAACc,GAAG;EACnE,IAAIA,GAAG,KAAKJ,SAAS,EAAE,oBAAOjB,IAAA,CAACoC,iBAAiB;IAAC5B,KAAK,EAAEA;EAAM,CAAE,CAAC;EACjE,oBACER,IAAA,CAACN,KAAK;IACJgC,MAAM,EAAE;MAAEL;IAAI,CAAE;IAChBZ,UAAU,EAAEA,UAAW;IACvBD,KAAK,EAAEA,KAAM;IACboB,UAAU,EAAE,CAAE;IACdhB,kBAAkB,EAAEA,kBAAmB;IAAA,GACnCT;EAAiB,CACtB,CAAC;AAEN;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASiC,iBAAiBA,CAAC;EAAE5B;AAAoC,CAAC,EAAE;EACzE,oBAAOR,IAAA,CAACP,IAAI;IAACe,KAAK,EAAE,CAACe,MAAM,CAACc,KAAK,EAAE7B,KAAK,CAAE;IAACK,aAAa,EAAC;EAAM,CAAE,CAAC;AACpE;AAEA,MAAMU,MAAM,GAAG/B,UAAU,CAAC8C,MAAM,CAAC;EAC/B;AACF;AACA;AACA;EACEN,YAAY,EAAE;IACZO,KAAK,EAAE,MAAM;IACbC,MAAM,EAAE;EACV,CAAC;EACDhB,GAAG,EAAE;IACH;IACA;IACAiB,QAAQ,EAAE;EACZ,CAAC;EACDJ,KAAK,EAAE;IACLK,eAAe,EAAE;EACnB;AACF,CAAC,CAAC","ignoreList":[]}
|
|
@@ -77,12 +77,42 @@
|
|
|
77
77
|
|
|
78
78
|
/** `undefined` until the first load attempt, then the module or `null`. */
|
|
79
79
|
let videoModule;
|
|
80
|
+
/** Set by {@link provideExpoVideo}; wins over the `require` below. */
|
|
81
|
+
let providedModule;
|
|
80
82
|
/** Why the load failed, quoted verbatim in the dev warning. */
|
|
81
83
|
let unavailableReason = '';
|
|
82
84
|
let hasWarned = false;
|
|
83
85
|
|
|
86
|
+
/**
|
|
87
|
+
* Hand Bloom the expo-video module explicitly.
|
|
88
|
+
*
|
|
89
|
+
* REQUIRED ON ANY ESM WEB BUNDLER, and measured rather than assumed: in a Vite
|
|
90
|
+
* bundle `typeof require` is `undefined`, so the optional-peer `require` below
|
|
91
|
+
* cannot run and video silently degrades to its poster **even when expo-video
|
|
92
|
+
* is installed**. Metro has a real `require` and is unaffected, which is why
|
|
93
|
+
* this went unnoticed — the app that uses this is Metro-built.
|
|
94
|
+
*
|
|
95
|
+
* There is no bundler-agnostic sync alternative: `import()` is async and this is
|
|
96
|
+
* called during render, so making it async would mean the surface renders
|
|
97
|
+
* without video for a frame and then upgrades. Handing the module over is
|
|
98
|
+
* explicit, synchronous, and costs the consumer one line at startup:
|
|
99
|
+
*
|
|
100
|
+
* ```ts
|
|
101
|
+
* import * as ExpoVideo from 'expo-video';
|
|
102
|
+
* provideExpoVideo(ExpoVideo);
|
|
103
|
+
* ```
|
|
104
|
+
*
|
|
105
|
+
* Pass `null` to clear it.
|
|
106
|
+
*/
|
|
107
|
+
export function provideExpoVideo(module) {
|
|
108
|
+
providedModule = module;
|
|
109
|
+
// Drop any cached `require` result so the next load reflects this decision.
|
|
110
|
+
videoModule = undefined;
|
|
111
|
+
}
|
|
112
|
+
|
|
84
113
|
/** The expo-video module, or `null` when the optional peer is not installed. */
|
|
85
114
|
export function loadExpoVideo() {
|
|
115
|
+
if (providedModule !== undefined && providedModule !== null) return providedModule;
|
|
86
116
|
if (videoModule !== undefined) return videoModule;
|
|
87
117
|
videoModule = null;
|
|
88
118
|
|
|
@@ -136,6 +166,7 @@ export function warnExpoVideoUnavailable() {
|
|
|
136
166
|
/** Test seam — drops the cached module handle so a suite can load it again. */
|
|
137
167
|
export function resetExpoVideoModule() {
|
|
138
168
|
videoModule = undefined;
|
|
169
|
+
providedModule = undefined;
|
|
139
170
|
unavailableReason = '';
|
|
140
171
|
hasWarned = false;
|
|
141
172
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["videoModule","unavailableReason","hasWarned","
|
|
1
|
+
{"version":3,"names":["videoModule","providedModule","unavailableReason","hasWarned","provideExpoVideo","module","undefined","loadExpoVideo","require","loaded","resolved","isComponentBearing","default","VideoView","error","Error","message","String","candidate","view","warnExpoVideoUnavailable","process","env","NODE_ENV","console","warn","resetExpoVideoModule"],"sourceRoot":"../../../src","sources":["media-flight/expo-video-module.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAOA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;;AAkBA;;AAKA;AACA,IAAIA,WAA6C;AACjD;AACA,IAAIC,cAAgD;AACpD;AACA,IAAIC,iBAAiB,GAAG,EAAE;AAC1B,IAAIC,SAAS,GAAG,KAAK;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAACC,MAA4B,EAAQ;EACnEJ,cAAc,GAAGI,MAAM;EACvB;EACAL,WAAW,GAAGM,SAAS;AACzB;;AAEA;AACA,OAAO,SAASC,aAAaA,CAAA,EAAyB;EACpD,IAAIN,cAAc,KAAKK,SAAS,IAAIL,cAAc,KAAK,IAAI,EAAE,OAAOA,cAAc;EAClF,IAAID,WAAW,KAAKM,SAAS,EAAE,OAAON,WAAW;EACjDA,WAAW,GAAG,IAAI;;EAElB;EACA;EACA;EACA;EACA,IAAI,OAAOQ,OAAO,KAAK,WAAW,EAAE;IAClCN,iBAAiB,GAAG,uCAAuC;IAC3D,OAAOF,WAAW;EACpB;EAEA,IAAI;IACF,MAAMS,MAAM,GAAGD,OAAO,CAAC,YAAY,CAGtB;IACb;IACA;IACA;IACA,MAAME,QAAQ,GAAGC,kBAAkB,CAACF,MAAM,CAAC,GAAGA,MAAM,GAAGA,MAAM,EAAEG,OAAO;IAEtE,IAAID,kBAAkB,CAACD,QAAQ,CAAC,EAAE;MAChCV,WAAW,GAAG;QAAEa,SAAS,EAAEH,QAAQ,CAACG;MAA+C,CAAC;IACtF,CAAC,MAAM;MACLX,iBAAiB,GAAG,kDAAkD;IACxE;EACF,CAAC,CAAC,OAAOY,KAAK,EAAE;IACdZ,iBAAiB,GAAGY,KAAK,YAAYC,KAAK,GAAGD,KAAK,CAACE,OAAO,GAAGC,MAAM,CAACH,KAAK,CAAC;EAC5E;EAEA,OAAOd,WAAW;AACpB;AAEA,SAASW,kBAAkBA,CACzBO,SAA8E,EACU;EACxF,MAAMC,IAAI,GAAGD,SAAS,EAAEL,SAAS;EACjC,IAAI,OAAOM,IAAI,KAAK,UAAU,EAAE,OAAO,IAAI;EAC3C,OAAO,OAAOA,IAAI,KAAK,QAAQ,IAAIA,IAAI,KAAK,IAAI,IAAI,UAAU,IAAIA,IAAI;AACxE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,wBAAwBA,CAAA,EAAS;EAC/C,IAAIC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,IAAIpB,SAAS,EAAE;EACxDA,SAAS,GAAG,IAAI;EAChB;EACA;EACA;EACAqB,OAAO,CAACC,IAAI,CACV,2EAA2E,GACzE,2EAA2E,GAC3E,6DAA6D,GAC7D,8DAA8D,GAC9D,WAAWvB,iBAAiB,EAChC,CAAC;AACH;;AAEA;AACA,OAAO,SAASwB,oBAAoBA,CAAA,EAAS;EAC3C1B,WAAW,GAAGM,SAAS;EACvBL,cAAc,GAAGK,SAAS;EAC1BJ,iBAAiB,GAAG,EAAE;EACtBC,SAAS,GAAG,KAAK;AACnB","ignoreList":[]}
|
|
@@ -5,5 +5,5 @@ export { MediaSurface, MediaPoster, EmptyMediaSurface } from "./MediaSurface.js"
|
|
|
5
5
|
export { useMediaFlight } from "./use-media-flight.js";
|
|
6
6
|
export { DEFAULT_FLIGHT_CORNER_RADIUS, flightProgress, handOffFlight, hasFlight, releaseFlight, resetMediaFlight } from "./store.js";
|
|
7
7
|
export { SURFACE_MOUNT_TIMEOUT_MS } from "./constants.js";
|
|
8
|
-
export { loadExpoVideo, warnExpoVideoUnavailable, resetExpoVideoModule } from "./expo-video-module.js";
|
|
8
|
+
export { loadExpoVideo, warnExpoVideoUnavailable, provideExpoVideo, resetExpoVideoModule } from "./expo-video-module.js";
|
|
9
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["MediaFlightLayer","MediaSurface","MediaPoster","EmptyMediaSurface","useMediaFlight","DEFAULT_FLIGHT_CORNER_RADIUS","flightProgress","handOffFlight","hasFlight","releaseFlight","resetMediaFlight","SURFACE_MOUNT_TIMEOUT_MS","loadExpoVideo","warnExpoVideoUnavailable","resetExpoVideoModule"],"sourceRoot":"../../../src","sources":["media-flight/index.ts"],"mappings":";;AAAA,SAASA,gBAAgB,QAAQ,uBAAoB;AACrD,SAASC,YAAY,EAAEC,WAAW,EAAEC,iBAAiB,QAAQ,mBAAgB;AAC7E,SAASC,cAAc,QAAQ,uBAAoB;AACnD,SACEC,4BAA4B,EAC5BC,cAAc,EACdC,aAAa,EACbC,SAAS,EACTC,aAAa,EACbC,gBAAgB,QACX,YAAS;AAChB,SAASC,wBAAwB,QAAQ,gBAAa;AACtD,SACEC,aAAa,EACbC,wBAAwB,EACxBC,oBAAoB,QAMf,wBAAqB","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["MediaFlightLayer","MediaSurface","MediaPoster","EmptyMediaSurface","useMediaFlight","DEFAULT_FLIGHT_CORNER_RADIUS","flightProgress","handOffFlight","hasFlight","releaseFlight","resetMediaFlight","SURFACE_MOUNT_TIMEOUT_MS","loadExpoVideo","warnExpoVideoUnavailable","provideExpoVideo","resetExpoVideoModule"],"sourceRoot":"../../../src","sources":["media-flight/index.ts"],"mappings":";;AAAA,SAASA,gBAAgB,QAAQ,uBAAoB;AACrD,SAASC,YAAY,EAAEC,WAAW,EAAEC,iBAAiB,QAAQ,mBAAgB;AAC7E,SAASC,cAAc,QAAQ,uBAAoB;AACnD,SACEC,4BAA4B,EAC5BC,cAAc,EACdC,aAAa,EACbC,SAAS,EACTC,aAAa,EACbC,gBAAgB,QACX,YAAS;AAChB,SAASC,wBAAwB,QAAQ,gBAAa;AACtD,SACEC,aAAa,EACbC,wBAAwB,EACxBC,gBAAgB,EAChBC,oBAAoB,QAMf,wBAAqB","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaSurface.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/MediaSurface.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAA+B,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AACzE,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAEtB,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAG/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAE7B;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;AAE9E;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC;AASjE,MAAM,WAAW,iBAAiB;IAChC,2EAA2E;IAC3E,OAAO,EAAE,mBAAmB,CAAC;IAC7B,0EAA0E;IAC1E,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,4DAA4D;IAC5D,UAAU,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IACjC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,kFAAkF;IAClF,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC1D;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"MediaSurface.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/MediaSurface.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAA+B,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AACzE,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAEtB,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAG/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAE7B;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;AAE9E;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC;AASjE,MAAM,WAAW,iBAAiB;IAChC,2EAA2E;IAC3E,OAAO,EAAE,mBAAmB,CAAC;IAC7B,0EAA0E;IAC1E,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,4DAA4D;IAC5D,UAAU,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IACjC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,kFAAkF;IAClF,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC1D;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,yDAgFvB,CAAC;AAIH;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,KAAK,EACL,UAAoB,EACpB,kBAAkB,GACnB,EAAE;IACD,OAAO,EAAE,mBAAmB,CAAC;IAC7B,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,UAAU,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,2CAaA;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,gBAAgB,CAAA;CAAE,2CAExE"}
|
|
@@ -89,6 +89,28 @@ export interface VideoViewLikeProps {
|
|
|
89
89
|
export interface ExpoVideoLike {
|
|
90
90
|
VideoView: ComponentType<VideoViewLikeProps>;
|
|
91
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Hand Bloom the expo-video module explicitly.
|
|
94
|
+
*
|
|
95
|
+
* REQUIRED ON ANY ESM WEB BUNDLER, and measured rather than assumed: in a Vite
|
|
96
|
+
* bundle `typeof require` is `undefined`, so the optional-peer `require` below
|
|
97
|
+
* cannot run and video silently degrades to its poster **even when expo-video
|
|
98
|
+
* is installed**. Metro has a real `require` and is unaffected, which is why
|
|
99
|
+
* this went unnoticed — the app that uses this is Metro-built.
|
|
100
|
+
*
|
|
101
|
+
* There is no bundler-agnostic sync alternative: `import()` is async and this is
|
|
102
|
+
* called during render, so making it async would mean the surface renders
|
|
103
|
+
* without video for a frame and then upgrades. Handing the module over is
|
|
104
|
+
* explicit, synchronous, and costs the consumer one line at startup:
|
|
105
|
+
*
|
|
106
|
+
* ```ts
|
|
107
|
+
* import * as ExpoVideo from 'expo-video';
|
|
108
|
+
* provideExpoVideo(ExpoVideo);
|
|
109
|
+
* ```
|
|
110
|
+
*
|
|
111
|
+
* Pass `null` to clear it.
|
|
112
|
+
*/
|
|
113
|
+
export declare function provideExpoVideo(module: ExpoVideoLike | null): void;
|
|
92
114
|
/** The expo-video module, or `null` when the optional peer is not installed. */
|
|
93
115
|
export declare function loadExpoVideo(): ExpoVideoLike | null;
|
|
94
116
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expo-video-module.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/expo-video-module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AASzD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,IAAI,IAAI,CAAC;CACf;AAED,oFAAoF;AACpF,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAElE;;;;;;;;;;GAUG;AACH,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,aAAa,CAAC;AAE7D,kDAAkD;AAClD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC1D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;CACjC;AAED,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;CAC9C;
|
|
1
|
+
{"version":3,"file":"expo-video-module.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/expo-video-module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AASzD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,IAAI,IAAI,CAAC;CACf;AAED,oFAAoF;AACpF,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAElE;;;;;;;;;;GAUG;AACH,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,aAAa,CAAC;AAE7D,kDAAkD;AAClD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC1D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;CACjC;AAED,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;CAC9C;AAUD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAInE;AAED,gFAAgF;AAChF,wBAAgB,aAAa,IAAI,aAAa,GAAG,IAAI,CAkCpD;AAUD;;;;;GAKG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAa/C;AAED,+EAA+E;AAC/E,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C"}
|
|
@@ -3,7 +3,7 @@ export { MediaSurface, MediaPoster, EmptyMediaSurface } from './MediaSurface';
|
|
|
3
3
|
export { useMediaFlight } from './use-media-flight';
|
|
4
4
|
export { DEFAULT_FLIGHT_CORNER_RADIUS, flightProgress, handOffFlight, hasFlight, releaseFlight, resetMediaFlight, } from './store';
|
|
5
5
|
export { SURFACE_MOUNT_TIMEOUT_MS } from './constants';
|
|
6
|
-
export { loadExpoVideo, warnExpoVideoUnavailable, resetExpoVideoModule, type ExpoVideoLike, type VideoPlayerLike, type VideoSurfaceContentFit, type VideoSurfaceType, type VideoViewLikeProps, } from './expo-video-module';
|
|
6
|
+
export { loadExpoVideo, warnExpoVideoUnavailable, provideExpoVideo, resetExpoVideoModule, type ExpoVideoLike, type VideoPlayerLike, type VideoSurfaceContentFit, type VideoSurfaceType, type VideoViewLikeProps, } from './expo-video-module';
|
|
7
7
|
export type { MediaFlight, MediaFlightAnchorNode, MediaFlightController, MediaFlightOptions, MediaSurfaceContent, MediaSurfaceImage, MediaSurfaceVideo, MeasuredRect, } from './types';
|
|
8
8
|
export type { MediaSurfaceProps } from './MediaSurface';
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,4BAA4B,EAC5B,cAAc,EACd,aAAa,EACb,SAAS,EACT,aAAa,EACb,gBAAgB,GACjB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,WAAW,EACX,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,4BAA4B,EAC5B,cAAc,EACd,aAAa,EACb,SAAS,EACT,aAAa,EACb,gBAAgB,GACjB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,WAAW,EACX,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaSurface.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/MediaSurface.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAA+B,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AACzE,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAEtB,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAG/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAE7B;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;AAE9E;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC;AASjE,MAAM,WAAW,iBAAiB;IAChC,2EAA2E;IAC3E,OAAO,EAAE,mBAAmB,CAAC;IAC7B,0EAA0E;IAC1E,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,4DAA4D;IAC5D,UAAU,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IACjC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,kFAAkF;IAClF,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC1D;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"MediaSurface.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/MediaSurface.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAA+B,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AACzE,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAEtB,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAG/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAE7B;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;AAE9E;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC;AASjE,MAAM,WAAW,iBAAiB;IAChC,2EAA2E;IAC3E,OAAO,EAAE,mBAAmB,CAAC;IAC7B,0EAA0E;IAC1E,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,4DAA4D;IAC5D,UAAU,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IACjC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,kFAAkF;IAClF,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC1D;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,yDAgFvB,CAAC;AAIH;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,KAAK,EACL,UAAoB,EACpB,kBAAkB,GACnB,EAAE;IACD,OAAO,EAAE,mBAAmB,CAAC;IAC7B,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,UAAU,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,2CAaA;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,gBAAgB,CAAA;CAAE,2CAExE"}
|
|
@@ -89,6 +89,28 @@ export interface VideoViewLikeProps {
|
|
|
89
89
|
export interface ExpoVideoLike {
|
|
90
90
|
VideoView: ComponentType<VideoViewLikeProps>;
|
|
91
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Hand Bloom the expo-video module explicitly.
|
|
94
|
+
*
|
|
95
|
+
* REQUIRED ON ANY ESM WEB BUNDLER, and measured rather than assumed: in a Vite
|
|
96
|
+
* bundle `typeof require` is `undefined`, so the optional-peer `require` below
|
|
97
|
+
* cannot run and video silently degrades to its poster **even when expo-video
|
|
98
|
+
* is installed**. Metro has a real `require` and is unaffected, which is why
|
|
99
|
+
* this went unnoticed — the app that uses this is Metro-built.
|
|
100
|
+
*
|
|
101
|
+
* There is no bundler-agnostic sync alternative: `import()` is async and this is
|
|
102
|
+
* called during render, so making it async would mean the surface renders
|
|
103
|
+
* without video for a frame and then upgrades. Handing the module over is
|
|
104
|
+
* explicit, synchronous, and costs the consumer one line at startup:
|
|
105
|
+
*
|
|
106
|
+
* ```ts
|
|
107
|
+
* import * as ExpoVideo from 'expo-video';
|
|
108
|
+
* provideExpoVideo(ExpoVideo);
|
|
109
|
+
* ```
|
|
110
|
+
*
|
|
111
|
+
* Pass `null` to clear it.
|
|
112
|
+
*/
|
|
113
|
+
export declare function provideExpoVideo(module: ExpoVideoLike | null): void;
|
|
92
114
|
/** The expo-video module, or `null` when the optional peer is not installed. */
|
|
93
115
|
export declare function loadExpoVideo(): ExpoVideoLike | null;
|
|
94
116
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expo-video-module.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/expo-video-module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AASzD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,IAAI,IAAI,CAAC;CACf;AAED,oFAAoF;AACpF,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAElE;;;;;;;;;;GAUG;AACH,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,aAAa,CAAC;AAE7D,kDAAkD;AAClD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC1D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;CACjC;AAED,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;CAC9C;
|
|
1
|
+
{"version":3,"file":"expo-video-module.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/expo-video-module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AASzD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,IAAI,IAAI,CAAC;CACf;AAED,oFAAoF;AACpF,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAElE;;;;;;;;;;GAUG;AACH,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,aAAa,CAAC;AAE7D,kDAAkD;AAClD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC1D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;CACjC;AAED,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;CAC9C;AAUD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAInE;AAED,gFAAgF;AAChF,wBAAgB,aAAa,IAAI,aAAa,GAAG,IAAI,CAkCpD;AAUD;;;;;GAKG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAa/C;AAED,+EAA+E;AAC/E,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C"}
|
|
@@ -3,7 +3,7 @@ export { MediaSurface, MediaPoster, EmptyMediaSurface } from './MediaSurface';
|
|
|
3
3
|
export { useMediaFlight } from './use-media-flight';
|
|
4
4
|
export { DEFAULT_FLIGHT_CORNER_RADIUS, flightProgress, handOffFlight, hasFlight, releaseFlight, resetMediaFlight, } from './store';
|
|
5
5
|
export { SURFACE_MOUNT_TIMEOUT_MS } from './constants';
|
|
6
|
-
export { loadExpoVideo, warnExpoVideoUnavailable, resetExpoVideoModule, type ExpoVideoLike, type VideoPlayerLike, type VideoSurfaceContentFit, type VideoSurfaceType, type VideoViewLikeProps, } from './expo-video-module';
|
|
6
|
+
export { loadExpoVideo, warnExpoVideoUnavailable, provideExpoVideo, resetExpoVideoModule, type ExpoVideoLike, type VideoPlayerLike, type VideoSurfaceContentFit, type VideoSurfaceType, type VideoViewLikeProps, } from './expo-video-module';
|
|
7
7
|
export type { MediaFlight, MediaFlightAnchorNode, MediaFlightController, MediaFlightOptions, MediaSurfaceContent, MediaSurfaceImage, MediaSurfaceVideo, MeasuredRect, } from './types';
|
|
8
8
|
export type { MediaSurfaceProps } from './MediaSurface';
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,4BAA4B,EAC5B,cAAc,EACd,aAAa,EACb,SAAS,EACT,aAAa,EACb,gBAAgB,GACjB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,WAAW,EACX,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,4BAA4B,EAC5B,cAAc,EACd,aAAa,EACb,SAAS,EACT,aAAa,EACb,gBAAgB,GACjB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,WAAW,EACX,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/package.json
CHANGED
|
@@ -166,7 +166,17 @@ export const MediaSurface = memo(function MediaSurface({
|
|
|
166
166
|
contentFit={contentFit}
|
|
167
167
|
surfaceType={mountedSurfaceType}
|
|
168
168
|
nativeControls={nativeControls}
|
|
169
|
-
|
|
169
|
+
// `absoluteFill` ALONE does not size this, and the reason is a CSS
|
|
170
|
+
// rule rather than a bug: expo-video renders a DOM `<video>`, which is
|
|
171
|
+
// a REPLACED element, and `position:absolute; inset:0` with
|
|
172
|
+
// `width/height:auto` resolves a replaced element to its INTRINSIC
|
|
173
|
+
// size — 300x150, the `<video>` default — instead of stretching it.
|
|
174
|
+
// Measured: inside a 320x200 box the element computed
|
|
175
|
+
// `left/right/top/bottom: 0px` and `width: 300px; height: 150px`, so
|
|
176
|
+
// it sat at the default while the box animated around it and then
|
|
177
|
+
// jumped when metadata arrived. The poster escapes this only because
|
|
178
|
+
// expo-image sizes its own element.
|
|
179
|
+
style={[StyleSheet.absoluteFill, styles.fillReplaced]}
|
|
170
180
|
accessibilityLabel={accessibilityLabel}
|
|
171
181
|
onFirstFrameRender={reportLive}
|
|
172
182
|
/>
|
|
@@ -222,6 +232,14 @@ export function EmptyMediaSurface({ style }: { style?: MediaPosterStyle }) {
|
|
|
222
232
|
}
|
|
223
233
|
|
|
224
234
|
const styles = StyleSheet.create({
|
|
235
|
+
/**
|
|
236
|
+
* Explicit size for a REPLACED element. Redundant for a `<div>` and
|
|
237
|
+
* load-bearing for a `<video>` — see the note at the call site.
|
|
238
|
+
*/
|
|
239
|
+
fillReplaced: {
|
|
240
|
+
width: '100%',
|
|
241
|
+
height: '100%',
|
|
242
|
+
},
|
|
225
243
|
box: {
|
|
226
244
|
// What makes the box's corner radius actually clip a video, and the other
|
|
227
245
|
// half of why the Android surface has to be a `textureView`.
|
|
@@ -104,12 +104,42 @@ export interface ExpoVideoLike {
|
|
|
104
104
|
|
|
105
105
|
/** `undefined` until the first load attempt, then the module or `null`. */
|
|
106
106
|
let videoModule: ExpoVideoLike | null | undefined;
|
|
107
|
+
/** Set by {@link provideExpoVideo}; wins over the `require` below. */
|
|
108
|
+
let providedModule: ExpoVideoLike | null | undefined;
|
|
107
109
|
/** Why the load failed, quoted verbatim in the dev warning. */
|
|
108
110
|
let unavailableReason = '';
|
|
109
111
|
let hasWarned = false;
|
|
110
112
|
|
|
113
|
+
/**
|
|
114
|
+
* Hand Bloom the expo-video module explicitly.
|
|
115
|
+
*
|
|
116
|
+
* REQUIRED ON ANY ESM WEB BUNDLER, and measured rather than assumed: in a Vite
|
|
117
|
+
* bundle `typeof require` is `undefined`, so the optional-peer `require` below
|
|
118
|
+
* cannot run and video silently degrades to its poster **even when expo-video
|
|
119
|
+
* is installed**. Metro has a real `require` and is unaffected, which is why
|
|
120
|
+
* this went unnoticed — the app that uses this is Metro-built.
|
|
121
|
+
*
|
|
122
|
+
* There is no bundler-agnostic sync alternative: `import()` is async and this is
|
|
123
|
+
* called during render, so making it async would mean the surface renders
|
|
124
|
+
* without video for a frame and then upgrades. Handing the module over is
|
|
125
|
+
* explicit, synchronous, and costs the consumer one line at startup:
|
|
126
|
+
*
|
|
127
|
+
* ```ts
|
|
128
|
+
* import * as ExpoVideo from 'expo-video';
|
|
129
|
+
* provideExpoVideo(ExpoVideo);
|
|
130
|
+
* ```
|
|
131
|
+
*
|
|
132
|
+
* Pass `null` to clear it.
|
|
133
|
+
*/
|
|
134
|
+
export function provideExpoVideo(module: ExpoVideoLike | null): void {
|
|
135
|
+
providedModule = module;
|
|
136
|
+
// Drop any cached `require` result so the next load reflects this decision.
|
|
137
|
+
videoModule = undefined;
|
|
138
|
+
}
|
|
139
|
+
|
|
111
140
|
/** The expo-video module, or `null` when the optional peer is not installed. */
|
|
112
141
|
export function loadExpoVideo(): ExpoVideoLike | null {
|
|
142
|
+
if (providedModule !== undefined && providedModule !== null) return providedModule;
|
|
113
143
|
if (videoModule !== undefined) return videoModule;
|
|
114
144
|
videoModule = null;
|
|
115
145
|
|
|
@@ -176,6 +206,7 @@ export function warnExpoVideoUnavailable(): void {
|
|
|
176
206
|
/** Test seam — drops the cached module handle so a suite can load it again. */
|
|
177
207
|
export function resetExpoVideoModule(): void {
|
|
178
208
|
videoModule = undefined;
|
|
209
|
+
providedModule = undefined;
|
|
179
210
|
unavailableReason = '';
|
|
180
211
|
hasWarned = false;
|
|
181
212
|
}
|