Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(blob): Add multipart option #517

Merged
merged 33 commits into from
Jan 12, 2024
Merged
Show file tree
Hide file tree
Changes from 17 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
e28492a
rebase me
vvo Nov 14, 2023
dda24be
Merge remote-tracking branch 'origin/main' into feat/blob/multipart
vvo Nov 21, 2023
999906d
Merge remote-tracking branch 'origin/main' into feat/blob/multipart
vvo Dec 4, 2023
9dba617
update
vvo Dec 7, 2023
17b42aa
update
vvo Dec 7, 2023
ae9d415
update
vvo Dec 7, 2023
864d97f
Merge remote-tracking branch 'origin/main' into feat/blob/multipart
vvo Dec 7, 2023
ad5410d
update
vvo Dec 7, 2023
570536b
update
vvo Dec 7, 2023
c98bf5c
update
vvo Dec 7, 2023
3fdc504
Merge remote-tracking branch 'origin/main' into feat/blob/multipart
vvo Dec 8, 2023
d5a1780
Merge remote-tracking branch 'origin/main' into feat/blob/multipart
vvo Dec 8, 2023
580edfa
review CORS, stream parsing, tests
vvo Dec 12, 2023
539bf9d
ensure we cancel the upload when an error occurs in upload
vvo Dec 14, 2023
9dcb8ce
Merge remote-tracking branch 'origin/main' into feat/blob/multipart
vvo Dec 14, 2023
f9df71d
adjust API given new edge functions changes
vvo Dec 14, 2023
43e13f0
use 8mb as s3
vvo Dec 14, 2023
a2120e5
Abort all fetch requests when one fails
vvo Dec 15, 2023
75c9074
add examples in script
vvo Dec 15, 2023
885f03d
Add simple retries
vvo Dec 15, 2023
6ad8d42
Merge branch 'main' into feat/blob/multipart
vvo Dec 15, 2023
81f48c5
update
vvo Dec 18, 2023
1db55bf
update
vvo Dec 18, 2023
c2239f4
Create six-melons-doubt.md
vvo Dec 18, 2023
6eef250
update
vvo Jan 11, 2024
b36fa56
update changelog
vvo Jan 11, 2024
1b9e60d
DX types
vvo Jan 11, 2024
5b69d2e
precise changelog
vvo Jan 11, 2024
f3b423e
remove console.log
vvo Jan 11, 2024
71cbd16
retry on 5xx, error messages, changelog
vvo Jan 12, 2024
e605df5
remove console.log
vvo Jan 12, 2024
e4e95ed
more error handling
vvo Jan 12, 2024
1b7a841
Merge remote-tracking branch 'origin/main' into feat/blob/multipart
vvo Jan 12, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions packages/blob/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
"module": "./dist/index.js",
"browser": {
"undici": "./dist/undici-browser.js",
"crypto": "./dist/crypto-browser.js"
"crypto": "./dist/crypto-browser.js",
"stream": "./dist/stream-browser.js"
},
"typesVersions": {
"*": {
Expand All @@ -39,7 +40,7 @@
],
"scripts": {
"build": "tsup && pnpm run copy-shims",
"copy-shims": "cp src/undici-browser.js dist/undici-browser.js && cp src/crypto-browser.js dist/crypto-browser.js",
"copy-shims": "cp src/*-browser.js dist/",
"dev": "pnpm run copy-shims && tsup --watch --clean=false",
"lint": "eslint --max-warnings=0 .",
"prepublishOnly": "pnpm run build",
Expand Down
38 changes: 29 additions & 9 deletions packages/blob/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ export interface UploadOptions {
* Additional data which will be sent to your `handleUpload` route.
*/
clientPayload?: string;
multipart?: boolean;
}

/**
Expand Down Expand Up @@ -103,7 +104,8 @@ export const upload = createPutMethod<UploadOptions>({
const clientToken = await retrieveClientToken({
handleUploadUrl: options.handleUploadUrl,
pathname,
clientPayload: options.clientPayload,
clientPayload: options.clientPayload ?? null,
multipart: options.multipart ?? false,
});
return clientToken;
},
Expand Down Expand Up @@ -211,13 +213,18 @@ const EventTypes = {

interface GenerateClientTokenEvent {
type: (typeof EventTypes)['generateClientToken'];
payload: { pathname: string; callbackUrl: string; clientPayload?: string };
payload: {
pathname: string;
callbackUrl: string;
multipart: boolean;
clientPayload: string | null;
};
}
interface UploadCompletedEvent {
type: (typeof EventTypes)['uploadCompleted'];
payload: {
blob: PutBlobResult;
tokenPayload?: string;
tokenPayload?: string | null;
};
}

Expand All @@ -229,7 +236,8 @@ export interface HandleUploadOptions {
body: HandleUploadBody;
onBeforeGenerateToken: (
pathname: string,
clientPayload?: string,
clientPayload: string | null,
multipart: boolean,
) => Promise<
Pick<
GenerateClientTokenOptions,
Expand All @@ -238,7 +246,7 @@ export interface HandleUploadOptions {
| 'validUntil'
| 'addRandomSuffix'
| 'cacheControlMaxAge'
> & { tokenPayload?: string }
> & { tokenPayload?: string | null }
>;
onUploadCompleted: (body: UploadCompletedEvent['payload']) => Promise<void>;
token?: string;
Expand All @@ -260,9 +268,18 @@ export async function handleUpload({
const type = body.type;
switch (type) {
case 'blob.generate-client-token': {
const { pathname, callbackUrl, clientPayload } = body.payload;
const payload = await onBeforeGenerateToken(pathname, clientPayload);
const { pathname, callbackUrl, clientPayload, multipart } = body.payload;
const payload = await onBeforeGenerateToken(
pathname,
clientPayload,
multipart,
);
const tokenPayload = payload.tokenPayload ?? clientPayload;
const defaultTokenDurationInSeconds = multipart ? 60 * 60 : 10 * 60;
vvo marked this conversation as resolved.
Show resolved Hide resolved
const now = new Date();
const validUntil =
payload.validUntil ??
now.setSeconds(now.getSeconds() + defaultTokenDurationInSeconds);

return {
type,
Expand All @@ -274,6 +291,7 @@ export async function handleUpload({
callbackUrl,
tokenPayload,
},
validUntil,
}),
};
}
Expand Down Expand Up @@ -309,7 +327,8 @@ export async function handleUpload({
async function retrieveClientToken(options: {
pathname: string;
handleUploadUrl: string;
clientPayload?: string;
clientPayload: string | null;
multipart: boolean;
}): Promise<string> {
const { handleUploadUrl, pathname } = options;
const url = isAbsoluteUrl(handleUploadUrl)
Expand All @@ -322,6 +341,7 @@ async function retrieveClientToken(options: {
pathname,
callbackUrl: url,
clientPayload: options.clientPayload,
multipart: options.multipart,
},
};

Expand Down Expand Up @@ -400,7 +420,7 @@ export interface GenerateClientTokenOptions extends BlobCommandOptions {
pathname: string;
onUploadCompleted?: {
callbackUrl: string;
tokenPayload?: string;
tokenPayload?: string | null;
};
maximumSizeInBytes?: number;
allowedContentTypes?: string[];
Expand Down
1 change: 1 addition & 0 deletions packages/blob/src/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ export interface CreateBlobCommandOptions extends BlobCommandOptions {
* @defaultvalue 365 * 24 * 60 * 60 (1 Year)
*/
cacheControlMaxAge?: number;
multipart?: boolean;
}

export function getTokenFromOptionsOrEnv(options?: BlobCommandOptions): string {
Expand Down
Loading
Loading