Changeset View
Changeset View
Standalone View
Standalone View
keyserver/src/fetchers/upload-fetchers.js
Show First 20 Lines • Show All 117 Lines • ▼ Show 20 Lines | function makeUploadURI(holder: ?string, id: string, secret: string): string { | ||||
if (holder) { | if (holder) { | ||||
return makeBlobServiceURI(holder); | return makeBlobServiceURI(holder); | ||||
} | } | ||||
return getUploadURL(id, secret); | return getUploadURL(id, secret); | ||||
} | } | ||||
function imagesFromRow(row: Object): Image | EncryptedImage { | function imagesFromRow(row: Object): Image | EncryptedImage { | ||||
const uploadExtra = JSON.parse(row.uploadExtra); | const uploadExtra = JSON.parse(row.uploadExtra); | ||||
const { width, height, blobHolder } = uploadExtra; | const { width, height, blobHolder, thumbHash } = uploadExtra; | ||||
const { uploadType: type, uploadSecret: secret } = row; | const { uploadType: type, uploadSecret: secret } = row; | ||||
const id = row.uploadID.toString(); | const id = row.uploadID.toString(); | ||||
const dimensions = { width, height }; | const dimensions = { width, height }; | ||||
const uri = makeUploadURI(blobHolder, id, secret); | const uri = makeUploadURI(blobHolder, id, secret); | ||||
const isEncrypted = !!uploadExtra.encryptionKey; | const isEncrypted = !!uploadExtra.encryptionKey; | ||||
if (type !== 'photo') { | if (type !== 'photo') { | ||||
throw new ServerError('invalid_parameters'); | throw new ServerError('invalid_parameters'); | ||||
} | } | ||||
if (!isEncrypted) { | if (!isEncrypted) { | ||||
return { id, type: 'photo', uri, dimensions }; | return { id, type: 'photo', uri, dimensions, thumbHash }; | ||||
} | } | ||||
return { | return { | ||||
id, | id, | ||||
type: 'encrypted_photo', | type: 'encrypted_photo', | ||||
holder: uri, | holder: uri, | ||||
dimensions, | dimensions, | ||||
thumbHash, | |||||
encryptionKey: uploadExtra.encryptionKey, | encryptionKey: uploadExtra.encryptionKey, | ||||
}; | }; | ||||
} | } | ||||
async function fetchImages( | async function fetchImages( | ||||
viewer: Viewer, | viewer: Viewer, | ||||
mediaIDs: $ReadOnlyArray<string>, | mediaIDs: $ReadOnlyArray<string>, | ||||
): Promise<$ReadOnlyArray<Media>> { | ): Promise<$ReadOnlyArray<Media>> { | ||||
▲ Show 20 Lines • Show All 55 Lines • ▼ Show 20 Lines | const query = SQL` | ||||
ORDER BY creation_time DESC | ORDER BY creation_time DESC | ||||
LIMIT ${request.limit} OFFSET ${request.offset} | LIMIT ${request.limit} OFFSET ${request.offset} | ||||
`; | `; | ||||
const [uploads] = await dbQuery(query); | const [uploads] = await dbQuery(query); | ||||
const media = uploads.map(upload => { | const media = uploads.map(upload => { | ||||
const { uploadID, uploadType, uploadSecret, uploadExtra } = upload; | const { uploadID, uploadType, uploadSecret, uploadExtra } = upload; | ||||
const { width, height, encryptionKey, blobHolder } = | const { width, height, encryptionKey, blobHolder, thumbHash } = | ||||
JSON.parse(uploadExtra); | JSON.parse(uploadExtra); | ||||
const dimensions = { width, height }; | const dimensions = { width, height }; | ||||
const uri = makeUploadURI(blobHolder, uploadID, uploadSecret); | const uri = makeUploadURI(blobHolder, uploadID, uploadSecret); | ||||
if (uploadType === 'photo') { | if (uploadType === 'photo') { | ||||
if (encryptionKey) { | if (encryptionKey) { | ||||
return { | return { | ||||
type: 'encrypted_photo', | type: 'encrypted_photo', | ||||
id: uploadID.toString(), | id: uploadID.toString(), | ||||
holder: uri, | holder: uri, | ||||
encryptionKey, | encryptionKey, | ||||
dimensions, | dimensions, | ||||
thumbHash, | |||||
}; | }; | ||||
} | } | ||||
return { | return { | ||||
type: 'photo', | type: 'photo', | ||||
id: uploadID.toString(), | id: uploadID.toString(), | ||||
uri, | uri, | ||||
dimensions, | dimensions, | ||||
thumbHash, | |||||
}; | }; | ||||
} | } | ||||
const { thumbnailID, thumbnailUploadSecret, thumbnailUploadExtra } = upload; | const { thumbnailID, thumbnailUploadSecret, thumbnailUploadExtra } = upload; | ||||
const { | const { | ||||
encryptionKey: thumbnailEncryptionKey, | encryptionKey: thumbnailEncryptionKey, | ||||
blobHolder: thumbnailBlobHolder, | blobHolder: thumbnailBlobHolder, | ||||
thumbHash: thumbnailThumbHash, | |||||
} = JSON.parse(thumbnailUploadExtra); | } = JSON.parse(thumbnailUploadExtra); | ||||
const thumbnailURI = makeUploadURI( | const thumbnailURI = makeUploadURI( | ||||
thumbnailBlobHolder, | thumbnailBlobHolder, | ||||
thumbnailID, | thumbnailID, | ||||
thumbnailUploadSecret, | thumbnailUploadSecret, | ||||
); | ); | ||||
if (encryptionKey) { | if (encryptionKey) { | ||||
return { | return { | ||||
type: 'encrypted_video', | type: 'encrypted_video', | ||||
id: uploadID.toString(), | id: uploadID.toString(), | ||||
holder: uri, | holder: uri, | ||||
encryptionKey, | encryptionKey, | ||||
dimensions, | dimensions, | ||||
thumbnailID, | thumbnailID, | ||||
thumbnailHolder: thumbnailURI, | thumbnailHolder: thumbnailURI, | ||||
thumbnailEncryptionKey, | thumbnailEncryptionKey, | ||||
thumbnailThumbHash, | |||||
}; | }; | ||||
} | } | ||||
return { | return { | ||||
type: 'video', | type: 'video', | ||||
id: uploadID.toString(), | id: uploadID.toString(), | ||||
uri, | uri, | ||||
dimensions, | dimensions, | ||||
thumbnailID, | thumbnailID, | ||||
thumbnailURI, | thumbnailURI, | ||||
thumbnailThumbHash, | |||||
}; | }; | ||||
}); | }); | ||||
return { media }; | return { media }; | ||||
} | } | ||||
async function fetchUploadsForMessage( | async function fetchUploadsForMessage( | ||||
viewer: Viewer, | viewer: Viewer, | ||||
Show All 31 Lines | ): $ReadOnlyArray<Media> { | ||||
const uploadMap = _keyBy('uploadID')(uploadRows); | const uploadMap = _keyBy('uploadID')(uploadRows); | ||||
const media: Media[] = []; | const media: Media[] = []; | ||||
for (const mediaMessageContent of mediaMessageContents) { | for (const mediaMessageContent of mediaMessageContents) { | ||||
const primaryUploadID = mediaMessageContent.uploadID; | const primaryUploadID = mediaMessageContent.uploadID; | ||||
const primaryUpload = uploadMap[primaryUploadID]; | const primaryUpload = uploadMap[primaryUploadID]; | ||||
const uploadExtra = JSON.parse(primaryUpload.uploadExtra); | const uploadExtra = JSON.parse(primaryUpload.uploadExtra); | ||||
const { width, height, loop, blobHolder, encryptionKey } = uploadExtra; | const { width, height, loop, blobHolder, encryptionKey, thumbHash } = | ||||
uploadExtra; | |||||
const dimensions = { width, height }; | const dimensions = { width, height }; | ||||
const primaryUploadURI = makeUploadURI( | const primaryUploadURI = makeUploadURI( | ||||
blobHolder, | blobHolder, | ||||
primaryUploadID, | primaryUploadID, | ||||
primaryUpload.uploadSecret, | primaryUpload.uploadSecret, | ||||
); | ); | ||||
if (mediaMessageContent.type === 'photo') { | if (mediaMessageContent.type === 'photo') { | ||||
if (encryptionKey) { | if (encryptionKey) { | ||||
media.push({ | media.push({ | ||||
type: 'encrypted_photo', | type: 'encrypted_photo', | ||||
id: primaryUploadID, | id: primaryUploadID, | ||||
holder: primaryUploadURI, | holder: primaryUploadURI, | ||||
encryptionKey, | encryptionKey, | ||||
dimensions, | dimensions, | ||||
thumbHash, | |||||
}); | }); | ||||
} else { | } else { | ||||
media.push({ | media.push({ | ||||
type: 'photo', | type: 'photo', | ||||
id: primaryUploadID, | id: primaryUploadID, | ||||
uri: primaryUploadURI, | uri: primaryUploadURI, | ||||
dimensions, | dimensions, | ||||
thumbHash, | |||||
}); | }); | ||||
} | } | ||||
continue; | continue; | ||||
} | } | ||||
const thumbnailUploadID = mediaMessageContent.thumbnailUploadID; | const thumbnailUploadID = mediaMessageContent.thumbnailUploadID; | ||||
const thumbnailUpload = uploadMap[thumbnailUploadID]; | const thumbnailUpload = uploadMap[thumbnailUploadID]; | ||||
const thumbnailUploadExtra = JSON.parse(thumbnailUpload.uploadExtra); | const thumbnailUploadExtra = JSON.parse(thumbnailUpload.uploadExtra); | ||||
const { blobHolder: thumbnailBlobHolder } = thumbnailUploadExtra; | const { blobHolder: thumbnailBlobHolder, thumbHash: thumbnailThumbHash } = | ||||
thumbnailUploadExtra; | |||||
const thumbnailUploadURI = makeUploadURI( | const thumbnailUploadURI = makeUploadURI( | ||||
thumbnailBlobHolder, | thumbnailBlobHolder, | ||||
thumbnailUploadID, | thumbnailUploadID, | ||||
thumbnailUpload.uploadSecret, | thumbnailUpload.uploadSecret, | ||||
); | ); | ||||
if (encryptionKey) { | if (encryptionKey) { | ||||
const video = { | const video = { | ||||
type: 'encrypted_video', | type: 'encrypted_video', | ||||
id: primaryUploadID, | id: primaryUploadID, | ||||
holder: primaryUploadURI, | holder: primaryUploadURI, | ||||
encryptionKey, | encryptionKey, | ||||
dimensions, | dimensions, | ||||
thumbnailID: thumbnailUploadID, | thumbnailID: thumbnailUploadID, | ||||
thumbnailHolder: thumbnailUploadURI, | thumbnailHolder: thumbnailUploadURI, | ||||
thumbnailEncryptionKey: thumbnailUploadExtra.encryptionKey, | thumbnailEncryptionKey: thumbnailUploadExtra.encryptionKey, | ||||
thumbnailThumbHash, | |||||
}; | }; | ||||
media.push(loop ? { ...video, loop } : video); | media.push(loop ? { ...video, loop } : video); | ||||
} else { | } else { | ||||
const video = { | const video = { | ||||
type: 'video', | type: 'video', | ||||
id: primaryUploadID, | id: primaryUploadID, | ||||
uri: primaryUploadURI, | uri: primaryUploadURI, | ||||
dimensions, | dimensions, | ||||
thumbnailID: thumbnailUploadID, | thumbnailID: thumbnailUploadID, | ||||
thumbnailURI: thumbnailUploadURI, | thumbnailURI: thumbnailUploadURI, | ||||
thumbnailThumbHash, | |||||
}; | }; | ||||
media.push(loop ? { ...video, loop } : video); | media.push(loop ? { ...video, loop } : video); | ||||
} | } | ||||
} | } | ||||
return media; | return media; | ||||
} | } | ||||
Show All 12 Lines |