UNPKG

@itwin/core-backend

Version:
67 lines 2.59 kB
/*--------------------------------------------------------------------------------------------- * 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