@microsoft/microsoft-graph-client
を使ってファイルをダウンロードするときにめんどくさかったのでメモ。
const fs = require('fs').promises;
const Blob = require('cross-blob');
const zlib = require('zlib');
const { PassThrough } = require('stream');
async main () => {
/**
* 大きいファイル、小さいファイル、テキストファイルなど、ファイルの種類によって返ってくるクラスが変わる
* @type {PassThrough|Blob|zlib.Gunzip}
*/
const content = await client.api('/drives/{drive-id}/items/{item-id}/content').get();
let data;
if (content instanceof PassThrough) {
let chunks = [];
for await (const chunk of content) {
chunks.push(chunk);
}
data = Buffer.concat(chunks);
} else if (content instanceof Blob) {
data = Buffer.from(await content.text());
} else if (content instanceof zlib.Gunzip) {
data = await new Promise((resolve, reject) => {
let chunks = [];
content
.on('data', (chunk) => chunks.push(chunk))
.on('error', reject)
.on('end', () => {
resolve(Buffer.concat(chunks));
});
});
} else {
throw new Error(`Unrecognize type of the content. '${content.constructor.name}'.`);
}
await fs.writeFile('filename', data);
}