diff --git a/package-lock.json b/package-lock.json index 2564c51..48f05cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -396,11 +396,6 @@ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, "ava": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ava/-/ava-3.9.0.tgz", @@ -906,14 +901,6 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, "common-path-prefix": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", @@ -1206,11 +1193,6 @@ } } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -1793,14 +1775,27 @@ "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "formdata-node": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-2.4.0.tgz", + "integrity": "sha512-eikLJEYMMtrc8/tRjUOhwJYoxQVb4R3X+Qlj1gv7tDgihpL8HMnsLLhUyjV8Y2iUm03RmpGmn/o4LyzGX396Uw==", "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "mime-types": "2.1.27" + }, + "dependencies": { + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + } } }, "forwarded": { @@ -2466,19 +2461,6 @@ "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", "dev": true }, - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" - }, - "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "requires": { - "mime-db": "1.43.0" - } - }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", diff --git a/package.json b/package.json index b36753c..e71dc46 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ }, "license": "MIT", "dependencies": { - "form-data": "^2.5.0", + "formdata-node": "^2.4.0", "got": "^11.8.1", "query-string": "^6.13.1" }, diff --git a/src/index.js b/src/index.js index c17a29f..ecc008c 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,6 @@ const got = require("got"); const queryString = require("query-string"); -const FormData = require("form-data"); +const FormData = require("formdata-node").default; const fs = require("fs"); const { augmentGenerator } = require("./utils"); @@ -114,17 +114,18 @@ module.exports = class CanvasAPI { } async sendSis(endpoint, attachment, body = {}) { - const form = new FormData(); + const fd = new FormData(); for (const key in body) { - form.append(key, body[key]); + fd.set(key, body[key]); } - form.append("attachment", fs.createReadStream(attachment)); + fd.set("attachment", fs.createReadStream(attachment)); return this.gotClient .post(endpoint, { - body: form, + body: fd.stream, + headers: fd.headers, }) .then((response) => { return response; diff --git a/src/index.test.js b/src/index.test.js index 335b39c..ea46506 100644 --- a/src/index.test.js +++ b/src/index.test.js @@ -161,6 +161,26 @@ test("sendSis returns a parsed JSON object upon success", async (t) => { t.deepEqual(response.body, { key: "value" }); }); +test("sendSis throws an error if timeout is over", async (t) => { + const server = await createTestServer(); + + server.post("/file", (req, res) => { + setTimeout(() => { + res.send({ key: "value" }); + }, 2000); + }); + + const canvas = new Canvas(server.url, "", { timeout: 1 }); + const tmp = tempy.file(); + fs.writeFileSync(tmp, "hello world"); + + try { + await canvas.sendSis("file", tmp); + } catch (err) { + t.pass(); + } +}); + test("List throws an error if the endpoint response is not an array", async (t) => { const server = await createTestServer();