diff --git a/.yarn/install-state.gz b/.yarn/install-state.gz index 0fdf29c..ecb16c5 100644 Binary files a/.yarn/install-state.gz and b/.yarn/install-state.gz differ diff --git a/node-red-grist/document-export.html b/node-red-grist/document-export.html new file mode 100644 index 0000000..6aa260b --- /dev/null +++ b/node-red-grist/document-export.html @@ -0,0 +1,67 @@ + + + + + \ No newline at end of file diff --git a/node-red-grist/document-export.js b/node-red-grist/document-export.js new file mode 100644 index 0000000..8bbe824 --- /dev/null +++ b/node-red-grist/document-export.js @@ -0,0 +1,39 @@ +const fetch = (...args) => import('node-fetch').then(({ default: fetch }) => fetch(...args)); + +module.exports = function (RED) { + function DocumentExportNode(config) { + RED.nodes.createNode(this, config); + let node = this; + this.document = RED.nodes.getNode(config.document); + this.server = RED.nodes.getNode(config.server); + this.format = config.format + + node.on('input', async function (msg, send, done) { + const protocol = this.server.tlsEnabled === true ? "https" : "http"; + const url = protocol + "://" + this.server.hostname + ":" + this.server.port; + + var requestUrl; + switch (this.format) { + case "excel": requestUrl = `${url}/api/docs/${this.document.docid}/download` + break; + case "sqlite": requestUrl = `${url}/api/docs/${this.document.docid}/download/xlsx` + break; + default: + done("Unsupported format " + this.format); + } + + fetch(requestUrl, { + headers: { + 'authorization': `Bearer ${this.server.apiKey}` + } + }).then(async (response) => { + const blob = await response.blob() + const arrayBuffer = await blob.arrayBuffer(); + const buffer = Buffer.from(arrayBuffer); + node.send({ ...msg, payload: buffer }) + + }).catch(reason => done(reason, "Failed to perform grist request to " + url)); + }); + } + RED.nodes.registerType("grist-document-export", DocumentExportNode); +} \ No newline at end of file diff --git a/package.json b/package.json index 8365960..9065db7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@gorootde/node-red-grist", - "version": "2.0.1", + "version": "2.1.0", "description": "getgrist.com connectivity for NodeRed", "main": "index.js", "packageManager": "yarn@3.3.1", @@ -19,6 +19,7 @@ "node-red": { "version": ">=2.0.0", "nodes": { + "grist-document-export": "node-red-grist/document-export.js", "grist-add-records": "node-red-grist/add-records.js", "grist-get-records": "node-red-grist/get-records.js", "grist-update-records": "node-red-grist/update-records.js", @@ -31,6 +32,7 @@ }, "dependencies": { "grist-api": "^0.1.7", - "mustache": "^4.2.0" + "mustache": "^4.2.0", + "node-fetch": "^3.3.2" } } \ No newline at end of file