@datocms/cma-client-node
Version:
NodeJS client for DatoCMS REST Content Management API
74 lines (63 loc) • 2.04 kB
text/typescript
import { Resources, type SimpleSchemaTypes } from '@datocms/cma-client';
import {
type CancelablePromise,
CanceledPromiseError,
makeCancelablePromise,
} from '@datocms/rest-client-utils';
import {
type OnProgressInfo,
uploadLocalFileAndReturnPath,
} from '../utils/uploadLocalFileAndReturnPath';
export type OnProgressCreatingUploadTrackObjectInfo = {
type: 'CREATING_UPLOAD_TRACK_OBJECT';
};
export type OnUploadTrackProgressInfo =
| OnProgressInfo
| OnProgressCreatingUploadTrackObjectInfo;
export type CreateUploadTrackFromLocalFileSchema = Omit<
SimpleSchemaTypes.UploadTrackCreateSchema,
'url_or_upload_request_id'
> & {
localPath: string;
onProgress?: (info: OnUploadTrackProgressInfo) => void;
};
export default class Upload extends Resources.UploadTrack {
/**
* Create a new upload track from a local file path
*
* Read more: https://www.datocms.com/docs/content-management-api/resources/upload-track/create
*/
createFromLocalFile(
uploadId: string | SimpleSchemaTypes.UploadData,
body: CreateUploadTrackFromLocalFileSchema,
): CancelablePromise<SimpleSchemaTypes.UploadTrack> {
let isCanceledBeforeUpload = false;
let runningPromise: CancelablePromise<string> | undefined;
return makeCancelablePromise<SimpleSchemaTypes.UploadTrack>(
async () => {
if (isCanceledBeforeUpload) {
throw new CanceledPromiseError();
}
const { localPath, onProgress, ...other } = body;
runningPromise = uploadLocalFileAndReturnPath(this.client, localPath, {
onProgress,
});
const path = await runningPromise;
if (onProgress) {
onProgress({ type: 'CREATING_UPLOAD_TRACK_OBJECT' });
}
return await this.create(uploadId, {
...other,
url_or_upload_request_id: path,
});
},
() => {
if (runningPromise) {
runningPromise.cancel();
} else {
isCanceledBeforeUpload = true;
}
},
);
}
}