Skip to content

Commit bc42937

Browse files
committed
fix(core): Files leak
1 parent c898380 commit bc42937

File tree

5 files changed

+75
-10
lines changed

5 files changed

+75
-10
lines changed

ava.config.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module.exports = {
2+
compileEnhancements: false,
3+
extensions: ['ts'],
4+
require: ['ts-node/register'],
5+
files: ['src/test'],
6+
}

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
"prettier": "1.13.7",
3333
"prettier-check": "2.0.0",
3434
"semantic-release": "15.5.2",
35+
"ts-node": "^7.0.0",
3536
"tslint": "5.10.0",
3637
"tslint-config-prettier": "1.13.0",
3738
"tslint-config-standard": "7.0.0",

src/index.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -207,13 +207,19 @@ export function processor<T>(uploadHandler: IUploadHandler<T>) {
207207
upload,
208208
}: IUploadArgument): Maybe<Promise<IProcessedUploadArgument<T>>> {
209209
if (Array.isArray(upload)) {
210-
const uploads = upload.map(file => file.then(uploadHandler))
210+
const uploads = upload.reduce((acc, file) => {
211+
if (file !== undefined && file !== null && file.then) {
212+
return [...acc, file.then(uploadHandler)]
213+
} else {
214+
return acc
215+
}
216+
}, [])
211217

212218
return Promise.all(uploads).then(res => ({
213219
argumentName: argumentName,
214220
upload: res,
215221
}))
216-
} else if (upload !== undefined && upload !== null) {
222+
} else if (upload !== undefined && upload !== null && upload.then) {
217223
return upload.then(uploadHandler).then(res => ({
218224
argumentName: argumentName,
219225
upload: res,
@@ -241,8 +247,8 @@ export function processor<T>(uploadHandler: IUploadHandler<T>) {
241247
*/
242248
export function upload<T>({ uploadHandler }: IConfig<T>): IMiddlewareFunction {
243249
return async (resolve, parent, args, ctx, info) => {
244-
const files = extractUploadArguments(args, info)
245-
const uploads = filterMap(processor(uploadHandler), files)
250+
const uploadArguments = extractUploadArguments(args, info)
251+
const uploads = filterMap(processor(uploadHandler), uploadArguments)
246252

247253
const uploaded = await Promise.all(uploads)
248254
const argsUploaded = normaliseArguments(uploaded)

test.js renamed to src/test/index.test.ts

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ import test from 'ava'
22
import { makeExecutableSchema } from 'graphql-tools'
33
import { applyMiddleware } from 'graphql-middleware'
44
import { GraphQLUpload } from 'apollo-upload-server'
5-
import { graphql, GraphQLString, GraphQLInteger } from 'graphql'
5+
import { graphql, GraphQLString } from 'graphql'
66
import {
77
filterMapFieldArguments,
88
isGraphQLArgumentType,
99
uploadTypeIdentifier,
1010
normaliseArguments,
1111
processor as uploadPorcessor,
12-
} from './'
12+
IUpload,
13+
} from '../'
1314

1415
// Helpers
1516

@@ -468,7 +469,7 @@ test('Processor handles multiple files correctly', async t => {
468469
),
469470
)
470471

471-
const file = x =>
472+
const file = (x): Promise<IUpload> =>
472473
new Promise(resolve =>
473474
resolve({
474475
stream: `s${x}`,
@@ -489,6 +490,36 @@ test('Processor handles multiple files correctly', async t => {
489490
})
490491
})
491492

493+
test('Processor handles empty files correctly', async t => {
494+
const uploadHandler = ({ stream, filename, mimetype, encoding }) =>
495+
new Promise(resolve =>
496+
setTimeout(
497+
() => resolve(`${stream}${filename}${mimetype}${encoding}`),
498+
10,
499+
),
500+
)
501+
502+
const file = (x): Promise<IUpload> =>
503+
new Promise(resolve =>
504+
resolve({
505+
stream: `s${x}`,
506+
filename: `f${x}`,
507+
mimetype: `m${x}`,
508+
encoding: `e${x}`,
509+
}),
510+
)
511+
512+
const res = await uploadPorcessor(uploadHandler)({
513+
argumentName: 'test',
514+
upload: [file(1), null, undefined],
515+
})
516+
517+
t.deepEqual(res, {
518+
argumentName: 'test',
519+
upload: ['s1f1m1e1'],
520+
})
521+
})
522+
492523
test('Processor handles no file correctly', async t => {
493524
const uploadHandler = ({ stream, filename, mimetype, encoding }) =>
494525
new Promise(resolve =>

yarn.lock

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -852,7 +852,7 @@ buf-compare@^1.0.0:
852852
version "1.0.1"
853853
resolved "https://registry.yarnpkg.com/buf-compare/-/buf-compare-1.0.1.tgz#fef28da8b8113a0a0db4430b0b6467b69730b34a"
854854

855-
buffer-from@^1.0.0:
855+
buffer-from@^1.0.0, buffer-from@^1.1.0:
856856
version "1.1.0"
857857
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04"
858858

@@ -1419,7 +1419,7 @@ [email protected]:
14191419
version "3.3.1"
14201420
resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75"
14211421

1422-
diff@^3.2.0:
1422+
diff@^3.1.0, diff@^3.2.0:
14231423
version "3.5.0"
14241424
resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
14251425

@@ -2705,6 +2705,10 @@ make-dir@^1.0.0:
27052705
dependencies:
27062706
pify "^3.0.0"
27072707

2708+
make-error@^1.1.1:
2709+
version "1.3.4"
2710+
resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535"
2711+
27082712
map-cache@^0.2.2:
27092713
version "0.2.2"
27102714
resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
@@ -3882,7 +3886,7 @@ source-map-support@^0.4.15:
38823886
dependencies:
38833887
source-map "^0.5.6"
38843888

3885-
source-map-support@^0.5.0:
3889+
source-map-support@^0.5.0, source-map-support@^0.5.6:
38863890
version "0.5.6"
38873891
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13"
38883892
dependencies:
@@ -4187,6 +4191,19 @@ trim-right@^1.0.1:
41874191
version "1.0.1"
41884192
resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
41894193

4194+
ts-node@^7.0.0:
4195+
version "7.0.0"
4196+
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.0.tgz#a94a13c75e5e1aa6b82814b84c68deb339ba7bff"
4197+
dependencies:
4198+
arrify "^1.0.0"
4199+
buffer-from "^1.1.0"
4200+
diff "^3.1.0"
4201+
make-error "^1.1.1"
4202+
minimist "^1.2.0"
4203+
mkdirp "^0.5.1"
4204+
source-map-support "^0.5.6"
4205+
yn "^2.0.0"
4206+
41904207
tslib@^1.0.0, tslib@^1.8.0, tslib@^1.8.1:
41914208
version "1.9.2"
41924209
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.2.tgz#8be0cc9a1f6dc7727c38deb16c2ebd1a2892988e"
@@ -4498,6 +4515,10 @@ yargs@~3.10.0:
44984515
decamelize "^1.0.0"
44994516
window-size "0.1.0"
45004517

4518+
yn@^2.0.0:
4519+
version "2.0.0"
4520+
resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a"
4521+
45014522
zen-observable-ts@^0.8.6, zen-observable-ts@^0.8.9:
45024523
version "0.8.9"
45034524
resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.9.tgz#d3c97af08c0afdca37ebcadf7cc3ee96bda9bab1"

0 commit comments

Comments
 (0)