Updated apollo-upload-server to v4.0.0-alpha.2.

Also updated server-side error handling accordingly.
This commit is contained in:
Jayden Seric 2018-01-03 20:07:38 +11:00
parent f152afe74f
commit ee32d8ced7
3 changed files with 63 additions and 21 deletions

50
api/package-lock.json generated
View File

@ -3,6 +3,15 @@
"requires": true, "requires": true,
"lockfileVersion": 1, "lockfileVersion": 1,
"dependencies": { "dependencies": {
"@babel/runtime": {
"version": "7.0.0-beta.36",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0-beta.36.tgz",
"integrity": "sha512-M76nk/SBqgICwp/QnL2ju7YrHHGjkKO1WwzqujFAdwIpf5RdZ7Q9Qt9kkGv0bOGj1h2Ki+LdfvMTJH0JhQi8sw==",
"requires": {
"core-js": "2.5.3",
"regenerator-runtime": "0.11.1"
}
},
"@std/esm": { "@std/esm": {
"version": "0.18.0", "version": "0.18.0",
"resolved": "https://registry.npmjs.org/@std/esm/-/esm-0.18.0.tgz", "resolved": "https://registry.npmjs.org/@std/esm/-/esm-0.18.0.tgz",
@ -24,9 +33,9 @@
} }
}, },
"acorn": { "acorn": {
"version": "5.2.1", "version": "5.3.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz",
"integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==", "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==",
"dev": true "dev": true
}, },
"acorn-jsx": { "acorn-jsx": {
@ -147,10 +156,11 @@
} }
}, },
"apollo-upload-server": { "apollo-upload-server": {
"version": "4.0.0-alpha.1", "version": "4.0.0-alpha.2",
"resolved": "https://registry.npmjs.org/apollo-upload-server/-/apollo-upload-server-4.0.0-alpha.1.tgz", "resolved": "https://registry.npmjs.org/apollo-upload-server/-/apollo-upload-server-4.0.0-alpha.2.tgz",
"integrity": "sha512-uW0TtcSXDkOoJD6NlMwD4I4deMaZO61GpnouvCLiDRm4FwpeEVLVUVpSk4/s++La+TXXgzoKNb8ixfPwUAjiGw==", "integrity": "sha512-iUBgiAWrrOXI8pN9mVVIFr2BnVRw7prP5eInMeTPru8C9LZ82IdI8FHE37+NzCZVLCDK0gsgNOcYPl7cjXqELg==",
"requires": { "requires": {
"@babel/runtime": "7.0.0-beta.36",
"busboy": "0.2.14", "busboy": "0.2.14",
"object-path": "0.11.4" "object-path": "0.11.4"
} }
@ -264,6 +274,11 @@
"integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
"dev": true "dev": true
}, },
"bluebird": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
"integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
},
"boxen": { "boxen": {
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
@ -922,7 +937,7 @@
"integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"acorn": "5.2.1", "acorn": "5.3.0",
"acorn-jsx": "3.0.1" "acorn-jsx": "3.0.1"
} }
}, },
@ -2389,9 +2404,9 @@
"dev": true "dev": true
}, },
"is-generator-function": { "is-generator-function": {
"version": "1.0.6", "version": "1.0.7",
"resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.6.tgz", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz",
"integrity": "sha1-nnFlPNFf/zQcecQVFGChMdMen8Q=" "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw=="
}, },
"is-glob": { "is-glob": {
"version": "2.0.1", "version": "2.0.1",
@ -2602,7 +2617,7 @@
"fresh": "0.5.2", "fresh": "0.5.2",
"http-assert": "1.3.0", "http-assert": "1.3.0",
"http-errors": "1.6.2", "http-errors": "1.6.2",
"is-generator-function": "1.0.6", "is-generator-function": "1.0.7",
"koa-compose": "4.0.0", "koa-compose": "4.0.0",
"koa-convert": "1.2.0", "koa-convert": "1.2.0",
"koa-is-json": "1.0.0", "koa-is-json": "1.0.0",
@ -3241,6 +3256,14 @@
"integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
"dev": true "dev": true
}, },
"promises-all": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/promises-all/-/promises-all-1.0.0.tgz",
"integrity": "sha1-pDGMuNRWifZzkE4hVg8DI5cCgg8=",
"requires": {
"bluebird": "3.5.1"
}
},
"ps-tree": { "ps-tree": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz", "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz",
@ -3429,6 +3452,11 @@
} }
} }
}, },
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
},
"regex-cache": { "regex-cache": {
"version": "0.4.4", "version": "0.4.4",
"resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",

View File

@ -7,7 +7,7 @@
}, },
"dependencies": { "dependencies": {
"@std/esm": "^0.18.0", "@std/esm": "^0.18.0",
"apollo-upload-server": "^4.0.0-alpha.1", "apollo-upload-server": "^4.0.0-alpha.2",
"dotenv": "^4.0.0", "dotenv": "^4.0.0",
"graphql": "^0.11.7", "graphql": "^0.11.7",
"graphql-server-koa": "^1.3.2", "graphql-server-koa": "^1.3.2",
@ -19,6 +19,7 @@
"koa-router": "^7.3.0", "koa-router": "^7.3.0",
"lowdb": "^1.0.0", "lowdb": "^1.0.0",
"mkdirp": "^0.5.1", "mkdirp": "^0.5.1",
"promises-all": "^1.0.0",
"shortid": "^2.2.8" "shortid": "^2.2.8"
}, },
"devDependencies": { "devDependencies": {

View File

@ -1,4 +1,5 @@
import { createWriteStream } from 'fs' import { createWriteStream, unlinkSync } from 'fs'
import { all } from 'promises-all'
import mkdirp from 'mkdirp' import mkdirp from 'mkdirp'
import shortid from 'shortid' import shortid from 'shortid'
import lowdb from 'lowdb' import lowdb from 'lowdb'
@ -14,19 +15,23 @@ db.defaults({ uploads: [] }).write()
// Ensure upload directory exists // Ensure upload directory exists
mkdirp.sync(uploadDir) mkdirp.sync(uploadDir)
const storeUpload = async ({ stream, filename }) => { const storeFS = ({ stream, filename }) => {
const id = shortid.generate() const id = shortid.generate()
const path = `${uploadDir}/${id}-${filename}` const path = `${uploadDir}/${id}-${filename}`
return new Promise((resolve, reject) => return new Promise((resolve, reject) =>
stream stream
.on('error', error => {
if (stream.truncated)
// Delete the truncated file
unlinkSync(path)
reject(error)
})
.on('end', () => resolve({ id, path }))
.pipe(createWriteStream(path)) .pipe(createWriteStream(path))
.on('finish', () => resolve({ id, path }))
.on('error', reject)
) )
} }
const recordFile = file => const storeDB = file =>
db db
.get('uploads') .get('uploads')
.push(file) .push(file)
@ -35,8 +40,8 @@ const recordFile = file =>
const processUpload = async upload => { const processUpload = async upload => {
const { stream, filename, mimetype, encoding } = await upload const { stream, filename, mimetype, encoding } = await upload
const { id, path } = await storeUpload({ stream, filename }) const { id, path } = await storeFS({ stream, filename })
return recordFile({ id, filename, mimetype, encoding, path }) return storeDB({ id, filename, mimetype, encoding, path })
} }
export default { export default {
@ -46,6 +51,14 @@ export default {
}, },
Mutation: { Mutation: {
singleUpload: (obj, { file }) => processUpload(file), singleUpload: (obj, { file }) => processUpload(file),
multipleUpload: (obj, { files }) => Promise.all(files.map(processUpload)) multipleUpload: async (obj, { files }) => {
const { resolve, reject } = await all(files.map(processUpload))
if (reject.length)
reject.forEach(({ name, message }) =>
// eslint-disable-next-line no-console
console.error(`${name}: ${message}`)
)
return resolve
}
} }
} }