Skip to content

Commit e1596e3

Browse files
authored
Avoid using EventSource & getPort (#1763)
1 parent d8d5dfa commit e1596e3

File tree

13 files changed

+130
-136
lines changed

13 files changed

+130
-136
lines changed

examples/generic-auth/__integration-tests__/generic-auth.spec.ts

Lines changed: 39 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { yoga } from '../src/app'
22
import { createServer, Server } from 'http'
33
import { AddressInfo } from 'net'
44
import { fetch } from '@whatwg-node/fetch'
5-
import EventSource from 'eventsource'
65

76
describe('graphql-auth example integration', () => {
87
let server: Server
@@ -58,87 +57,66 @@ describe('graphql-auth example integration', () => {
5857
})
5958

6059
it('should execute on public field with subscription', async () => {
61-
const eventSource = new EventSource(
60+
expect.assertions(1)
61+
const response = await fetch(
6262
`http://localhost:${port}/graphql?query=subscription{public}`,
63+
{
64+
headers: {
65+
Accept: 'text/event-stream',
66+
},
67+
},
6368
)
6469

65-
const messages: string[] = []
66-
try {
67-
await new Promise<void>((resolve, reject) => {
68-
eventSource.onmessage = (message) => {
69-
messages.push(message.data)
70-
eventSource.close()
71-
resolve()
72-
}
73-
eventSource.onerror = (error) => {
74-
reject(error)
75-
}
76-
})
77-
78-
expect(messages).toMatchInlineSnapshot(`
79-
[
80-
"{"data":{"public":"hi"}}",
81-
]
82-
`)
83-
} finally {
84-
eventSource.close()
70+
for await (const chunk of response.body!) {
71+
const chunkString = Buffer.from(chunk).toString('utf-8')
72+
if (chunkString.includes('data:')) {
73+
expect(chunkString.trim()).toBe('data: {"data":{"public":"hi"}}')
74+
break
75+
}
8576
}
8677
})
8778

8879
it('should execute on auth required field with subscription', async () => {
89-
const eventSource = new EventSource(
80+
expect.assertions(1)
81+
const response = await fetch(
9082
`http://localhost:${port}/graphql?query=subscription{requiresAuth}`,
9183
{
9284
headers: {
85+
Accept: 'text/event-stream',
9386
'x-authorization': 'aaa',
9487
},
9588
},
9689
)
9790

98-
const messages: string[] = []
99-
try {
100-
await new Promise<void>((resolve, reject) => {
101-
eventSource.onmessage = (message) => {
102-
messages.push(message.data)
103-
eventSource.close()
104-
resolve()
105-
}
106-
eventSource.onerror = (error) => {
107-
reject(error)
108-
}
109-
})
110-
111-
expect(messages).toMatchInlineSnapshot(`
112-
[
113-
"{"data":{"requiresAuth":"hi [email protected]"}}",
114-
]
115-
`)
116-
} finally {
117-
eventSource.close()
91+
for await (const chunk of response.body!) {
92+
const chunkStr = Buffer.from(chunk).toString('utf-8')
93+
if (chunkStr.startsWith('data:')) {
94+
expect(chunkStr.trim()).toBe(
95+
'data: {"data":{"requiresAuth":"hi [email protected]"}}',
96+
)
97+
break
98+
}
11899
}
119100
})
120101

121102
it('should not execute on auth required field with subscription', async () => {
122-
const eventSource = new EventSource(
103+
expect.assertions(1)
104+
const response = await fetch(
123105
`http://localhost:${port}/graphql?query=subscription{requiresAuth}`,
106+
{
107+
headers: {
108+
Accept: 'text/event-stream',
109+
},
110+
},
124111
)
125-
126-
const messages: string[] = []
127-
try {
128-
await new Promise<void>((resolve, reject) => {
129-
eventSource.onmessage = (message) => {
130-
messages.push(message.data)
131-
eventSource.close()
132-
resolve()
133-
}
134-
eventSource.onerror = (error) => {
135-
reject(error)
136-
}
137-
})
138-
} catch (err) {
139-
expect(err.message).toEqual('Internal Server Error')
140-
} finally {
141-
eventSource.close()
112+
for await (const chunk of response.body!) {
113+
const chunkStr = Buffer.from(chunk).toString('utf-8')
114+
if (chunkStr.startsWith('data:')) {
115+
expect(chunkStr.trim()).toBe(
116+
'data: {"data":null,"errors":[{"message":"Accessing \'Subscription.requiresAuth\' requires authentication.","locations":[{"line":1,"column":14}]}]}',
117+
)
118+
break
119+
}
142120
}
143121
})
144122
})

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@
7676
"babel-plugin-transform-typescript-metadata": "0.3.2",
7777
"bob-the-bundler": "4.0.0",
7878
"cross-env": "7.0.3",
79-
"get-port": "5.1.1",
8079
"eslint": "^8.21.0",
8180
"execa": "5.1.1",
8281
"graphql": "^16.5.0",
@@ -90,7 +89,7 @@
9089
"supertest": "^6.1.6",
9190
"ts-jest": "^29.0.0",
9291
"typescript": "4.8.3",
93-
"weak-napi": ""
92+
"weak-napi": "2.0.2"
9493
},
9594
"resolutions": {
9695
"graphql": "16.6.0"

packages/client/apollo-link/__integration-tests__/apollo-link.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { parse } from 'graphql'
55
import { observableToAsyncIterable } from '@graphql-tools/utils'
66
import { YogaLink } from '@graphql-yoga/apollo-link'
77
import { File } from '@whatwg-node/fetch'
8-
import getPort from 'get-port'
8+
import { AddressInfo } from 'node:net'
99

1010
describe('Yoga Apollo Link', () => {
1111
const endpoint = '/graphql'
@@ -54,8 +54,9 @@ describe('Yoga Apollo Link', () => {
5454
let client: ApolloClient<any>
5555

5656
beforeAll(async () => {
57-
const port = await getPort()
5857
server = createServer(yoga)
58+
await new Promise<void>((resolve) => server.listen(0, hostname, resolve))
59+
const port = (server.address() as AddressInfo).port
5960
url = `http://${hostname}:${port}${endpoint}`
6061
client = new ApolloClient({
6162
link: new YogaLink({
@@ -64,7 +65,6 @@ describe('Yoga Apollo Link', () => {
6465
}),
6566
cache: new InMemoryCache(),
6667
})
67-
await new Promise<void>((resolve) => server.listen(port, hostname, resolve))
6868
})
6969
afterAll(() => {
7070
server.close()

packages/client/urql-exchange/__integration-tests__/urql-exchange.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { pipe, toObservable } from 'wonka'
55
import { createYoga, createSchema } from 'graphql-yoga'
66
import { File } from '@whatwg-node/fetch'
77
import { createServer, Server } from 'http'
8-
import getPort from 'get-port'
8+
import { AddressInfo } from 'node:net'
99

1010
describe('graphExchange', () => {
1111
const endpoint = '/graphql'
@@ -54,8 +54,9 @@ describe('graphExchange', () => {
5454
let client: Client
5555

5656
beforeAll(async () => {
57-
const port = await getPort()
5857
server = createServer(yoga)
58+
await new Promise<void>((resolve) => server.listen(0, hostname, resolve))
59+
const port = (server.address() as AddressInfo).port
5960
url = `http://${hostname}:${port}${endpoint}`
6061
client = createClient({
6162
url,
@@ -65,7 +66,6 @@ describe('graphExchange', () => {
6566
}),
6667
],
6768
})
68-
await new Promise<void>((resolve) => server.listen(port, hostname, resolve))
6969
})
7070
afterAll(() => {
7171
server.close()

packages/graphql-yoga/__integration-tests__/browser.spec.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
} from 'graphql'
1717
import { GraphQLBigInt } from 'graphql-scalars'
1818
import 'json-bigint-patch'
19-
import getPort from 'get-port'
19+
import { AddressInfo } from 'net'
2020

2121
export function createTestSchema() {
2222
let liveQueryCounter = 0
@@ -155,8 +155,8 @@ describe('browser', () => {
155155
const server = createServer(yogaApp)
156156

157157
beforeAll(async () => {
158-
port = await getPort()
159-
await new Promise<void>((resolve) => server.listen(port, resolve))
158+
await new Promise<void>((resolve) => server.listen(0, resolve))
159+
port = (server.address() as AddressInfo).port
160160
browser = await puppeteer.launch({
161161
// If you wanna run tests with open browser
162162
// set your PUPPETEER_HEADLESS env to "false"
@@ -384,7 +384,6 @@ describe('browser', () => {
384384
let anotherServer: Server
385385
let anotherOriginPort: number
386386
beforeAll(async () => {
387-
anotherOriginPort = await getPort()
388387
anotherServer = createServer((_req, res) => {
389388
res.end(/* HTML */ `
390389
<html>
@@ -422,8 +421,9 @@ describe('browser', () => {
422421
`)
423422
})
424423
await new Promise<void>((resolve) =>
425-
anotherServer.listen(anotherOriginPort, () => resolve()),
424+
anotherServer.listen(0, () => resolve()),
426425
)
426+
anotherOriginPort = (anotherServer.address() as AddressInfo).port
427427
})
428428
afterAll(async () => {
429429
await new Promise<void>((resolve) => anotherServer.close(() => resolve()))

packages/graphql-yoga/__integration-tests__/file-uploads.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import * as os from 'os'
55
import { createServer } from 'http'
66
import { createYoga, createSchema } from 'graphql-yoga'
77
import { fetch, File, FormData } from '@whatwg-node/fetch'
8-
import getPort from 'get-port'
8+
import { AddressInfo } from 'net'
99

1010
function md5File(path: string) {
1111
return new Promise((resolve, reject) => {
@@ -68,8 +68,8 @@ describe('file uploads', () => {
6868
const server = createServer(yoga)
6969

7070
try {
71-
const port = await getPort()
72-
await new Promise<void>((resolve) => server.listen(port, resolve))
71+
await new Promise<void>((resolve) => server.listen(0, resolve))
72+
const port = (server.address() as AddressInfo).port
7373

7474
const formData = new FormData()
7575
formData.set(

packages/graphql-yoga/__integration-tests__/incremental-delivery.spec.ts

Lines changed: 49 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,8 @@ import {
1616
File,
1717
FormData,
1818
} from '@whatwg-node/fetch'
19-
import getPort from 'get-port'
20-
import EventSource from 'eventsource'
2119
import { createGraphQLError } from '@graphql-tools/utils'
20+
import { AddressInfo } from 'net'
2221

2322
describe('incremental delivery', () => {
2423
it('incremental delivery source is closed properly', async () => {
@@ -63,23 +62,27 @@ describe('incremental delivery', () => {
6362
const server = createServer(yoga)
6463

6564
try {
66-
await new Promise<void>((resolve) => server.listen(9876, resolve))
65+
await new Promise<void>((resolve) => server.listen(0, resolve))
66+
const port = (server.address() as AddressInfo).port
6767
const abortCtrl = new AbortController()
68-
const res = await yoga.fetchAPI.fetch('http://localhost:9876/graphql', {
69-
method: 'POST',
70-
headers: {
71-
'content-type': 'application/json',
72-
accept: 'multipart/mixed',
68+
const res = await yoga.fetchAPI.fetch(
69+
`http://localhost:${port}/graphql`,
70+
{
71+
method: 'POST',
72+
headers: {
73+
'content-type': 'application/json',
74+
accept: 'multipart/mixed',
75+
},
76+
body: JSON.stringify({
77+
query: /* GraphQL */ `
78+
query {
79+
a
80+
}
81+
`,
82+
}),
83+
signal: abortCtrl.signal,
7384
},
74-
body: JSON.stringify({
75-
query: /* GraphQL */ `
76-
query {
77-
a
78-
}
79-
`,
80-
}),
81-
signal: abortCtrl.signal,
82-
})
85+
)
8386

8487
// Start and Close a HTTP Request
8588
for await (const chunk of res.body!) {
@@ -236,9 +239,9 @@ describe('incremental delivery: node-fetch', () => {
236239
let url: string
237240
beforeEach(async () => {
238241
server = createServer(yoga)
239-
const port = await getPort()
242+
await new Promise<void>((resolve) => server.listen(0, resolve))
243+
const port = (server.address() as AddressInfo).port
240244
url = `http://localhost:${port}/graphql`
241-
await new Promise<void>((resolve) => server.listen(port, resolve))
242245
})
243246
afterEach(async () => {
244247
await new Promise((resolve) => server.close(resolve))
@@ -366,29 +369,36 @@ describe('incremental delivery: node-fetch', () => {
366369
expect(body.errors[0].message).toBe('File size limit exceeded: 12 bytes')
367370
})
368371

369-
it('should get subscription', (done) => {
372+
it('should get subscription', async () => {
370373
expect.assertions(3)
371-
const eventSource = new EventSource(`${url}?query=subscription{counter}`)
372374
let counter = 0
373-
eventSource.onmessage = (event) => {
374-
const result = JSON.parse(event.data)
375-
if (counter === 0) {
376-
expect(result.data.counter).toBe(0)
377-
counter++
378-
push?.(counter)
379-
} else if (counter === 1) {
380-
expect(result.data.counter).toBe(1)
381-
counter++
382-
push?.(counter)
383-
} else if (counter === 2) {
384-
expect(result.data.counter).toBe(2)
385-
counter++
386-
stop?.()
387-
done()
388-
}
389-
}
390-
new Promise((resolve) => setTimeout(resolve, 100)).then(() => {
375+
setTimeout(() => {
391376
push?.(counter)
377+
}, 500)
378+
const response = await fetch(`${url}?query=subscription{counter}`, {
379+
headers: {
380+
Accept: 'text/event-stream',
381+
},
392382
})
383+
for await (const chunk of response.body!) {
384+
const chunkString = Buffer.from(chunk).toString('utf-8')
385+
if (chunkString.includes('data:')) {
386+
const result = JSON.parse(chunkString.replace('data:', ''))
387+
if (counter === 0) {
388+
expect(result.data.counter).toBe(0)
389+
counter++
390+
push?.(counter)
391+
} else if (counter === 1) {
392+
expect(result.data.counter).toBe(1)
393+
counter++
394+
push?.(counter)
395+
} else if (counter === 2) {
396+
expect(result.data.counter).toBe(2)
397+
counter++
398+
stop?.()
399+
return
400+
}
401+
}
402+
}
393403
})
394404
})

0 commit comments

Comments
 (0)