in src/directLineStreaming.ts [217:262]
private postMessageWithAttachments(message: Message) {
const { attachments, ...messageWithoutAttachments } = message;
return Observable.create( subscriber => {
const httpContentList = [];
(async () => {
try {
const arrayBuffers = await Promise.all(attachments.map(async attachment => {
const media = attachment as Media;
const res = await fetch(media.contentUrl);
if (res.ok) {
return { arrayBuffer: await res.arrayBuffer(), media };
} else {
throw new Error('...');
}
}));
arrayBuffers.forEach(({ arrayBuffer, media }) => {
const buffer = Buffer.from(arrayBuffer);
console.log(buffer);
const stream = new BFSE.SubscribableStream();
stream.write(buffer);
const httpContent = new BFSE.HttpContent({ type: media.contentType, contentLength: buffer.length }, stream);
httpContentList.push(httpContent);
});
const url = `/v3/directline/conversations/${this.conversationId}/users/${messageWithoutAttachments.from.id}/upload`;
const request = BFSE.StreamingRequest.create('PUT', url);
const activityStream = new BFSE.SubscribableStream();
activityStream.write(JSON.stringify(messageWithoutAttachments), 'utf-8');
request.addStream(new BFSE.HttpContent({ type: "application/vnd.microsoft.activity", contentLength: activityStream.length }, activityStream));
httpContentList.forEach(e => request.addStream(e));
const resp = await this.streamConnection.send(request);
if (resp.streams && resp.streams.length !== 1) {
subscriber.error(new Error(`Invalid stream count ${resp.streams.length}`));
} else {
const {Id: id} = await resp.streams[0].readAsJson();
subscriber.next(id);
}
} catch(e) {
subscriber.error(e);
}
})();
});
}