@itwin/core-backend
Version:
iTwin.js backend components
67 lines • 2.59 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
/** @packageDocumentation
* @module RpcInterface
*/
import { BentleyStatus } from "@itwin/core-bentley";
import { IModelError, RpcMultipart, RpcSerializedValue } from "@itwin/core-common";
import * as FormData from "form-data";
import * as multiparty from "multiparty";
/* eslint-disable @typescript-eslint/no-deprecated */
/** @internal */
export function createMultipartStream(value) {
const form = new FormData();
RpcMultipart.writeValueToForm(form, value);
// Type information for FormData is lying. It actually extends Stream but not Readable, although it appears to work
// fine for now.
return form;
}
/** @internal */
export async function parseMultipartRequest(req) {
return new Promise((resolve, reject) => {
const form = new multiparty.Form({ maxFieldsSize: Infinity });
form.on("error", (err) => {
reject(err);
});
const value = RpcSerializedValue.create();
const data = {};
form.on("part", (part) => {
part.on("data", (chunk) => {
if (part.name === "objects") {
value.objects += chunk.toString();
}
else if (Buffer.isBuffer(chunk)) {
if (!data[part.name]) {
data[part.name] = { size: 0, chunks: [] };
}
data[part.name].size += chunk.byteLength;
data[part.name].chunks.push(chunk);
}
else {
throw new IModelError(BentleyStatus.ERROR, "Unknown input.");
}
});
});
form.on("close", () => {
let i = 0;
for (;;) {
const part = data[`data-${i}`];
if (!part) {
break;
}
value.data.push(Buffer.concat(part.chunks, part.size));
++i;
}
resolve(value);
});
form.parse(req);
});
}
/** @internal */
export function appendToMultipartForm(i, form, value) {
const buf = value.data[i];
form.append(`data-${i}`, Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength));
}
//# sourceMappingURL=multipart.js.map