UNPKG

@portive/client

Version:

Client to connect to and use Portive's cloud services for open source components

175 lines (174 loc) 6.22 kB
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; import { UPLOAD_PATH } from "./constants"; import axios from "axios"; import { createClientFile } from "./create-client-file"; export * from "./create-client-file"; export * from "../resize"; export * from "./types"; export function getUploadPolicyFromClientFileInfo({ client, clientFileInfo, }) { return __awaiter(this, void 0, void 0, function* () { try { const response = yield client.post(UPLOAD_PATH, { clientFileInfo }); return response; } catch (e) { return { status: "error", message: `Error during getUploadPolicyFromClientFileInfo. ${e}`, }; } }); } export function fetchUploadPolicy({ client, file, }) { return __awaiter(this, void 0, void 0, function* () { try { const clientFile = yield createClientFile(file); // const apiGetPolicyUrl = `${client.apiOrigin}${UPLOAD_PATH}` const { // disable to allow eating a property // eslint-disable-next-line @typescript-eslint/no-unused-vars objectUrl: $1, // disable to allow eating a property // eslint-disable-next-line @typescript-eslint/no-unused-vars file: $2 } = clientFile, clientFileInfo = __rest(clientFile, ["objectUrl", "file"]); return yield getUploadPolicyFromClientFileInfo({ client, clientFileInfo }); } catch (e) { return { status: "error", message: `Error during getUploadPolicy. ${e}`, }; } }); } /** * This method can be used on its own for the entire upload process which * includes getting the upload policy and then sending the file to the * cloud servers on Amazon S3. */ export function uploadFile({ client, file, onBeforeFetch = () => { /* noop */ }, onBeforeSend = () => { /* noop */ }, onProgress = () => { /* noop */ }, onError = () => { /* noop */ }, onSuccess = () => { /* noop */ }, onFinish = () => { /* noop */ }, onUpdate = () => { /* noop */ }, }) { return __awaiter(this, void 0, void 0, function* () { const clientFile = yield createClientFile(file); const beforeFetchEvent = { type: "beforeFetch", file, clientFile, }; onBeforeFetch(beforeFetchEvent); onUpdate(beforeFetchEvent); const uploadPolicyResponse = yield fetchUploadPolicy({ client, file, }); if (uploadPolicyResponse.status === "error") { const errorEvent = { type: "error", file, clientFile, message: uploadPolicyResponse.message, }; onError(errorEvent); onFinish(errorEvent); onUpdate(errorEvent); return errorEvent; } const { formFields, apiUrl: uploadUrl, fileUrl } = uploadPolicyResponse.data; const hostedFile = clientFile.type === "image" ? { type: "image", url: fileUrl, width: clientFile.width, height: clientFile.height, } : { type: "generic", url: fileUrl }; /** * Execute `onStart` callback */ const beforeSendEvent = { type: "beforeSend", file, clientFile, hostedFile, }; onBeforeSend(beforeSendEvent); // upload file to Amazon const form = new FormData(); for (const [key, value] of Object.entries(formFields)) { form.append(key, value); } form.append("content-type", file.type); form.append("file", clientFile.file); /** * Post to S3 with a callback for returning progress */ const uploadResponse = yield axios.post(uploadUrl, form, { onUploadProgress(e) { const progressEvent = { type: "progress", file, clientFile, hostedFile, sentBytes: e.loaded, totalBytes: e.total, }; onProgress(progressEvent); onUpdate(progressEvent); }, }); if (uploadResponse.status !== 204) { const errorEvent = { type: "error", file, clientFile, message: `Error during upload ${JSON.stringify(uploadResponse.data, null, 2)}`, }; onError(errorEvent); onFinish(errorEvent); onUpdate(errorEvent); return errorEvent; } const successEvent = { type: "success", file, clientFile, hostedFile, }; onSuccess(successEvent); onFinish(successEvent); onUpdate(successEvent); return successEvent; }); }