in src/server/file-manager.ts [53:94]
async uploadFile(
fileData: string | Buffer,
fileMetadata: FileMetadata,
): Promise<UploadFileResponse> {
const file = fileData instanceof Buffer ? fileData : readFileSync(fileData);
const url = new FilesRequestUrl(
RpcTask.UPLOAD,
this.apiKey,
this._requestOptions,
);
const uploadHeaders = getHeaders(url);
const boundary = generateBoundary();
uploadHeaders.append("X-Goog-Upload-Protocol", "multipart");
uploadHeaders.append(
"Content-Type",
`multipart/related; boundary=${boundary}`,
);
const uploadMetadata = getUploadMetadata(fileMetadata);
// Multipart formatting code taken from @firebase/storage
const metadataString = JSON.stringify({ file: uploadMetadata });
const preBlobPart =
"--" +
boundary +
"\r\n" +
"Content-Type: application/json; charset=utf-8\r\n\r\n" +
metadataString +
"\r\n--" +
boundary +
"\r\n" +
"Content-Type: " +
fileMetadata.mimeType +
"\r\n\r\n";
const postBlobPart = "\r\n--" + boundary + "--";
const blob = new Blob([preBlobPart, file, postBlobPart]);
const response = await makeServerRequest(url, uploadHeaders, blob);
return response.json();
}