Skip to content

Commit

Permalink
Handle firebaseStorageDownloadTokens for objects: rewrite / copy
Browse files Browse the repository at this point in the history
  • Loading branch information
rhodgkins committed Aug 25, 2021
1 parent 33c6b2f commit fb04288
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 2 deletions.
46 changes: 46 additions & 0 deletions scripts/storage-emulator-integration/tests.ts
Expand Up @@ -758,6 +758,52 @@ describe("Storage emulator", () => {
expect(metadata2).to.deep.equal(metadata1);
});

it("should preserve firebaseStorageDownloadTokens", async () => {
const firebaseStorageDownloadTokens = "token1,token2";
await testBucket.upload(smallFilePath, {
metadata: {
metadata: {
firebaseStorageDownloadTokens,
},
},
});

const file = testBucket.file(copyDestinationFile);
const [, { resource: metadata }] = await testBucket
.file(smallFilePath.split("/").slice(-1)[0])
.copy(file);

expect(metadata).to.deep.include({
metadata: {
firebaseStorageDownloadTokens,
},
});
});

it("should remove firebaseStorageDownloadTokens when overwriting custom metadata", async () => {
await testBucket.upload(smallFilePath, {
metadata: {
metadata: {
firebaseStorageDownloadTokens: "token1,token2",
},
},
});

const file = testBucket.file(copyDestinationFile);
const metadata = { foo: "bar" };
// Types for CopyOptions are wrong (@google-cloud/storage sub-dependency needs
// update to include https://github.com/googleapis/nodejs-storage/pull/1406
// and https://github.com/googleapis/nodejs-storage/pull/1426)
const copyOpts: CopyOptions & { [key: string]: unknown } = {
metadata,
};
const [, { resource: metadataOut }] = await testBucket
.file(smallFilePath.split("/").slice(-1)[0])
.copy(file, copyOpts);

expect(metadataOut).to.deep.include({ metadata });
});

it("should not support the use of a rewriteToken", async () => {
await testBucket.upload(smallFilePath);

Expand Down
11 changes: 9 additions & 2 deletions src/emulator/storage/files.ts
Expand Up @@ -333,11 +333,18 @@ export class StorageLayer {
return;
}

const newMetadata: IncomingMetadata = {
const newMetadata = {
...sourceMetadata,
metadata: sourceMetadata.customMetadata,
metadata: sourceMetadata.customMetadata ?? {},
...metadata,
};
if (
sourceMetadata.downloadTokens.length &&
// Only copy download tokens if we're not overwriting any custom metadata
!(metadata?.metadata && Object.keys(metadata?.metadata).length)
) {
newMetadata.metadata.firebaseStorageDownloadTokens = sourceMetadata.downloadTokens.join(",");
}
if (newMetadata.metadata) {
// Convert null metadata values to empty strings
for (const k of Object.keys(newMetadata.metadata)) {
Expand Down

0 comments on commit fb04288

Please sign in to comment.