async uploadFile()

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();
  }