mirror of
https://github.com/honojs/hono.git
synced 2024-11-21 18:18:57 +01:00
fix(service-worker): bind fetch to globalThis
(#3500)
* fix(service-worker): bind fetch to `globalThis` * chore: ignore lint error
This commit is contained in:
parent
d5166dd851
commit
de7827ee27
@ -2,6 +2,31 @@ import { Hono } from '../../hono'
|
|||||||
import { handle } from './handler'
|
import { handle } from './handler'
|
||||||
import type { FetchEvent } from './types'
|
import type { FetchEvent } from './types'
|
||||||
|
|
||||||
|
beforeAll(() => {
|
||||||
|
// fetch errors when it's not bound to globalThis in service worker
|
||||||
|
// set a fetch stub to emulate that behavior
|
||||||
|
vi.stubGlobal(
|
||||||
|
'fetch',
|
||||||
|
function fetch(this: undefined | typeof globalThis, arg0: string | Request) {
|
||||||
|
if (this !== globalThis) {
|
||||||
|
const error = new Error(
|
||||||
|
// eslint-disable-next-line quotes
|
||||||
|
"Failed to execute 'fetch' on 'WorkerGlobalScope': Illegal invocation"
|
||||||
|
)
|
||||||
|
error.name = 'TypeError'
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
if (arg0 instanceof Request && arg0.url === 'http://localhost/fallback') {
|
||||||
|
return new Response('hello world')
|
||||||
|
}
|
||||||
|
return Response.error()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
})
|
||||||
|
afterAll(() => {
|
||||||
|
vi.unstubAllGlobals()
|
||||||
|
})
|
||||||
|
|
||||||
describe('handle', () => {
|
describe('handle', () => {
|
||||||
it('Success to fetch', async () => {
|
it('Success to fetch', async () => {
|
||||||
const app = new Hono()
|
const app = new Hono()
|
||||||
@ -20,6 +45,19 @@ describe('handle', () => {
|
|||||||
expect(json).toStrictEqual({ hello: 'world' })
|
expect(json).toStrictEqual({ hello: 'world' })
|
||||||
})
|
})
|
||||||
it('Fallback 404', async () => {
|
it('Fallback 404', async () => {
|
||||||
|
const app = new Hono()
|
||||||
|
const handler = handle(app)
|
||||||
|
const text = await new Promise<Response>((resolve) => {
|
||||||
|
handler({
|
||||||
|
request: new Request('http://localhost/fallback'),
|
||||||
|
respondWith(res) {
|
||||||
|
resolve(res)
|
||||||
|
},
|
||||||
|
} as FetchEvent)
|
||||||
|
}).then((res) => res.text())
|
||||||
|
expect(text).toBe('hello world')
|
||||||
|
})
|
||||||
|
it('Fallback 404 with explicit fetch', async () => {
|
||||||
const app = new Hono()
|
const app = new Hono()
|
||||||
const handler = handle(app, {
|
const handler = handle(app, {
|
||||||
async fetch() {
|
async fetch() {
|
||||||
|
@ -16,8 +16,8 @@ export const handle = (
|
|||||||
opts: {
|
opts: {
|
||||||
fetch?: typeof fetch
|
fetch?: typeof fetch
|
||||||
} = {
|
} = {
|
||||||
// To use `fetch` on a Service Worker correctly, first refer to `self.fetch`.
|
// To use `fetch` on a Service Worker correctly, bind it to `globalThis`.
|
||||||
fetch: globalThis.self !== undefined ? globalThis.self.fetch : fetch,
|
fetch: globalThis.fetch.bind(globalThis),
|
||||||
}
|
}
|
||||||
): Handler => {
|
): Handler => {
|
||||||
return (evt) => {
|
return (evt) => {
|
||||||
|
Loading…
Reference in New Issue
Block a user