From 0ff67ee9ffa05d0552fc1fd47856ba78645b849f Mon Sep 17 00:00:00 2001 From: Benjamin Borowski Date: Thu, 22 May 2025 13:43:42 -0700 Subject: [PATCH 1/3] (deps) upgrades notion sdk --- package-lock.json | 15 ++++++++------- package.json | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index eeb9002..f327763 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "@notionhq/client": "^3.0.1", + "@notionhq/client": "^3.1.1", "@notionhq/notion-mcp-server": "^1.8.0", "async-sema": "^3.1.1", "axios": "^1.4.0", @@ -330,9 +330,10 @@ } }, "node_modules/@notionhq/client": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@notionhq/client/-/client-3.0.1.tgz", - "integrity": "sha512-vHtFKrRKQg2PZSky1A9fTe+L9/WxNYRJWHmD6ZiBNgeN5jnFmv27ootRl9ROzEm/N+mOxfTo37EnuCHsaPgETg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@notionhq/client/-/client-3.1.1.tgz", + "integrity": "sha512-sAFNjrW5IVX1jgVRxn83mtLNphWsp4qj1koW5YKx9w0qH1pJLfJyAjedwvIFjWG2VNzPuXxVrXpQaRnxSUt5aQ==", + "license": "MIT", "engines": { "node": ">=18" } @@ -2137,9 +2138,9 @@ } }, "@notionhq/client": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@notionhq/client/-/client-3.0.1.tgz", - "integrity": "sha512-vHtFKrRKQg2PZSky1A9fTe+L9/WxNYRJWHmD6ZiBNgeN5jnFmv27ootRl9ROzEm/N+mOxfTo37EnuCHsaPgETg==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@notionhq/client/-/client-3.1.1.tgz", + "integrity": "sha512-sAFNjrW5IVX1jgVRxn83mtLNphWsp4qj1koW5YKx9w0qH1pJLfJyAjedwvIFjWG2VNzPuXxVrXpQaRnxSUt5aQ==" }, "@notionhq/notion-mcp-server": { "version": "1.8.0", diff --git a/package.json b/package.json index 111effd..5c669ce 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "author": "Benjamin Borowski ", "license": "MIT", "dependencies": { - "@notionhq/client": "^3.0.1", + "@notionhq/client": "^3.1.1", "@notionhq/notion-mcp-server": "^1.8.0", "async-sema": "^3.1.1", "axios": "^1.4.0", From 3dd1ca92c21100540b982801c4238db7ef132330 Mon Sep 17 00:00:00 2001 From: Benjamin Borowski Date: Thu, 22 May 2025 13:50:18 -0700 Subject: [PATCH 2/3] Use fileUploads object to create FileUpload --- examples/shared/files.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/examples/shared/files.js b/examples/shared/files.js index 68ea827..35d2788 100644 --- a/examples/shared/files.js +++ b/examples/shared/files.js @@ -25,14 +25,7 @@ const JSON_HEADERS = { async function createFileUpload(options = { mode: 'single_part' }) { try { - const response = await axios({ - method: 'POST', - url: NOTION_FILE_UPLOAD_URL, - headers: JSON_HEADERS, - data: options, - }); - - return response.data; + return await notion.fileUploads.create(options); } catch (error) { console.error('Error creating file upload:', error); throw error; From 44afcfb7a1400eeec2edbb87e3c101f539aaa5da Mon Sep 17 00:00:00 2001 From: Benjamin Borowski Date: Thu, 22 May 2025 16:44:25 -0700 Subject: [PATCH 3/3] Use blobs over streams MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also removes form-data dep as it’s no longer necessary --- examples/shared/files.js | 52 ++++++++++++++++------------------------ package-lock.json | 1 - package.json | 1 - 3 files changed, 21 insertions(+), 33 deletions(-) diff --git a/examples/shared/files.js b/examples/shared/files.js index 35d2788..663b408 100644 --- a/examples/shared/files.js +++ b/examples/shared/files.js @@ -1,5 +1,3 @@ -const axios = require('axios'); -const FormData = require('form-data'); const fs = require('fs'); const path = require('path'); const splitFile = require('split-file'); @@ -118,45 +116,35 @@ async function getFileSize(filePath) { return stats.size; } -async function uploadPart(fileId, partBuffer, partNumber = null) { - const formData = new FormData(); - formData.append('file', partBuffer); +async function uploadPart(file, blob, partNumber = null) { + const params = { + file_upload_id: file.id, + file: { + data: blob, + filename: file.filename, + }, + }; if (partNumber) { console.log('uploading part', partNumber); - formData.append('part_number', partNumber.toString()); + // Minor issue with the API, part_number must be a string + params.part_number = partNumber.toString(); } - const response = await axios({ - method: 'POST', - url: `${NOTION_FILE_UPLOAD_URL}/${fileId}/send`, - data: formData, - headers: { - ...NOTION_HEADERS, - 'Content-Type': 'multipart/form-data', - }, - ...(!partNumber && { maxContentLength: SINGLE_PART_LIMIT }), - }); - - return response.data; + return await notion.fileUploads.send(params); } -async function completeMultiPartUpload(fileId) { +async function completeMultiPartUpload(file) { console.log('completing upload'); - const response = await axios({ - method: 'POST', - url: `${NOTION_FILE_UPLOAD_URL}/${fileId}/complete`, - headers: JSON_HEADERS, + return await notion.fileUploads.complete({ + file_upload_id: file.id, }); - - return response.data; } async function uploadFile(filePath, fileName = path.basename(filePath)) { const fileSize = await getFileSize(filePath); const needsMultiPart = fileSize > SINGLE_PART_LIMIT; - const contentType = getContentType(fileName); if (!contentType) { @@ -184,17 +172,19 @@ async function uploadFile(filePath, fileName = path.basename(filePath)) { }); for (let i = 1; i <= parts.length; i++) { - const fileStream = fs.createReadStream(parts[i - 1]); - upload = await uploadPart(file.id, fileStream, i); + const buffer = await fs.promises.readFile(parts[i - 1]); + const blob = new Blob([buffer], { type: contentType }); + upload = await uploadPart(file, blob, i); } // Complete the upload - upload = await completeMultiPartUpload(file.id); + upload = await completeMultiPartUpload(file); } else { // Single-part upload - const fileStream = fs.createReadStream(filePath); + const buffer = await fs.promises.readFile(filePath); + const blob = new Blob([buffer], { type: contentType }); file = await createFileUpload(); - upload = await uploadPart(file.id, fileStream); + upload = await uploadPart(file, blob); } return { file, upload }; diff --git a/package-lock.json b/package-lock.json index f327763..05d9c70 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,6 @@ "date-fns": "^2.28.0", "date-fns-tz": "^1.3.5", "dotenv": "^16.3.1", - "form-data": "^4.0.2", "lodash": "^4.17.21", "split-file": "^2.3.0", "yargs": "^17.5.1" diff --git a/package.json b/package.json index 5c669ce..aa400bf 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,6 @@ "date-fns": "^2.28.0", "date-fns-tz": "^1.3.5", "dotenv": "^16.3.1", - "form-data": "^4.0.2", "lodash": "^4.17.21", "split-file": "^2.3.0", "yargs": "^17.5.1"