UNPKG

@portive/client

Version:

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

198 lines (197 loc) 7.52 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __exportStar = (this && this.__exportStar) || function(m, exports) { for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); }; 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; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.uploadFile = exports.fetchUploadPolicy = exports.getUploadPolicyFromClientFileInfo = void 0; const constants_1 = require("./constants"); const axios_1 = __importDefault(require("axios")); const create_client_file_1 = require("./create-client-file"); __exportStar(require("./create-client-file"), exports); __exportStar(require("../resize"), exports); __exportStar(require("./types"), exports); function getUploadPolicyFromClientFileInfo({ client, clientFileInfo, }) { return __awaiter(this, void 0, void 0, function* () { try { const response = yield client.post(constants_1.UPLOAD_PATH, { clientFileInfo }); return response; } catch (e) { return { status: "error", message: `Error during getUploadPolicyFromClientFileInfo. ${e}`, }; } }); } exports.getUploadPolicyFromClientFileInfo = getUploadPolicyFromClientFileInfo; function fetchUploadPolicy({ client, file, }) { return __awaiter(this, void 0, void 0, function* () { try { const clientFile = yield (0, create_client_file_1.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}`, }; } }); } exports.fetchUploadPolicy = fetchUploadPolicy; /** * 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. */ 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 (0, create_client_file_1.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_1.default.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; }); } exports.uploadFile = uploadFile;