Lazily initialize ResponseWithEncoding (#8253)

* Lazily initialize ResponseWithEncoding

* Fix things

* Add a TODO about removing the workaround

* Remove unused lint ignore

* Use canplaythrough instead

* Use an inline script

* Check the readystate first

* Download the video locally

* Capture consoles

* More debugging

* Use autoplay instead of a ready event
This commit is contained in:
Matthew Phillips 2023-08-28 11:57:21 -04:00 committed by GitHub
parent 46c4c0e053
commit 1048aca550
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 37 additions and 27 deletions

View file

@ -0,0 +1,5 @@
---
'astro': patch
---
Fix, lazily initialize ResponseWithEncoding

View file

@ -1,3 +1,3 @@
<video controls="" autoplay="" name="media" transition:persist transition:name="video">
<video controls="" autoplay="" name="media" transition:persist transition:name="video" autoplay>
<source src="https://ia804502.us.archive.org/33/items/GoldenGa1939_3/GoldenGa1939_3_512kb.mp4" type="video/mp4">
</video>

View file

@ -6,12 +6,4 @@ import Video from '../components/Video.astro';
<p id="video-one">Page 1</p>
<a id="click-two" href="/video-two">go to 2</a>
<Video />
<script>
const vid = document.querySelector('video');
vid.addEventListener('canplay', () => {
// Jump to the 1 minute mark
vid.currentTime = 60;
vid.dataset.ready = '';
}, { once: true });
</script>
</Layout>

View file

@ -302,7 +302,7 @@ test.describe('View Transitions', () => {
// Go to page 1
await page.goto(astro.resolveUrl('/video-one'));
const vid = page.locator('video[data-ready]');
const vid = page.locator('video');
await expect(vid).toBeVisible();
const firstTime = await page.evaluate(getTime);

View file

@ -39,6 +39,7 @@ export function createAPIContext({
props,
adapterName,
}: CreateAPIContext): APIContext {
initResponseWithEncoding();
const context = {
cookies: new AstroCookies(request),
request,
@ -91,27 +92,39 @@ export function createAPIContext({
type ResponseParameters = ConstructorParameters<typeof Response>;
export class ResponseWithEncoding extends Response {
constructor(body: ResponseParameters[0], init: ResponseParameters[1], encoding?: BufferEncoding) {
// If a body string is given, try to encode it to preserve the behaviour as simple objects.
// We don't do the full handling as simple objects so users can control how headers are set instead.
if (typeof body === 'string') {
// In NodeJS, we can use Buffer.from which supports all BufferEncoding
if (typeof Buffer !== 'undefined' && Buffer.from) {
body = Buffer.from(body, encoding);
export let ResponseWithEncoding: ReturnType<typeof initResponseWithEncoding>;
// TODO Remove this after StackBlitz supports Node 18.
let initResponseWithEncoding = () => {
class LocalResponseWithEncoding extends Response {
constructor(body: ResponseParameters[0], init: ResponseParameters[1], encoding?: BufferEncoding) {
// If a body string is given, try to encode it to preserve the behaviour as simple objects.
// We don't do the full handling as simple objects so users can control how headers are set instead.
if (typeof body === 'string') {
// In NodeJS, we can use Buffer.from which supports all BufferEncoding
if (typeof Buffer !== 'undefined' && Buffer.from) {
body = Buffer.from(body, encoding);
}
// In non-NodeJS, use the web-standard TextEncoder for utf-8 strings
else if (encoding == null || encoding === 'utf8' || encoding === 'utf-8') {
body = encoder.encode(body);
}
}
// In non-NodeJS, use the web-standard TextEncoder for utf-8 strings
else if (encoding == null || encoding === 'utf8' || encoding === 'utf-8') {
body = encoder.encode(body);
super(body, init);
if (encoding) {
this.headers.set('X-Astro-Encoding', encoding);
}
}
super(body, init);
if (encoding) {
this.headers.set('X-Astro-Encoding', encoding);
}
}
// Set the module scoped variable.
ResponseWithEncoding = LocalResponseWithEncoding;
// Turn this into a noop.
initResponseWithEncoding = (() => {}) as any;
return LocalResponseWithEncoding;
}
export async function callEndpoint<MiddlewareResult = Response | EndpointOutput>(