UNPKG

filestack-js

Version:

Official JavaScript library for Filestack

229 lines (188 loc) 5.85 kB
/* * Copyright (c) 2019 by Filestack. * Some rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import Debug from 'debug'; import EventEmitter from 'eventemitter3'; import { File, UploadTags } from './../file'; import { StoreUploadOptions } from './../types'; import { Security } from './../../../client'; import { FsRetryConfig } from './../../../request'; import { isMobile } from './../../../utils'; import { FilestackError } from './../../../../filestack_error'; // regular part size export const DEFAULT_PART_SIZE = 6 * 1024 * 1024; // Minimum part size for upload by multipart export const MIN_PART_SIZE = 5 * 1024 * 1024; // when mode is set to fallback or intelligent, this part size is required export const INTELLIGENT_CHUNK_SIZE = 8 * 1024 * 1024; // Mobile Chunk size for ii export const INTELLIGENT_MOBILE_CHUNK_SIZE = 1024 * 1024; // minimum intelligent chunk size export const MIN_CHUNK_SIZE = 32 * 1024; export const DEFAULT_STORE_LOCATION = 's3'; const debug = Debug('fs:upload:abstract'); export const enum UploadMode { DEFAULT = 'default', INTELLIGENT = 'intelligent', FALLBACK = 'fallback', } export abstract class UploaderAbstract extends EventEmitter { // Parts size options protected partSize: number = DEFAULT_PART_SIZE; // chunk size for ii uploads protected intelligentChunkSize: number = isMobile() ? INTELLIGENT_MOBILE_CHUNK_SIZE : INTELLIGENT_CHUNK_SIZE; // upload options protected url: string; protected timeout: number = 30 * 1000; protected uploadMode: UploadMode = UploadMode.DEFAULT; // application settings protected apikey: string; protected security: Security; protected isModeLocked: boolean = false; // if account does not support ii in fallback mode we should abort protected retryConfig: FsRetryConfig; protected integrityCheck: boolean = true; protected uploadTags: UploadTags = null; constructor(protected readonly storeOptions: StoreUploadOptions, protected readonly concurrency: number = 3) { super(); } public setSecurity(security: Security): void { debug('Set security %O', security); this.security = security; } public setApikey(apikey: string): void { debug(`Set apikey to ${apikey}`); this.apikey = apikey; } public setTimeout(timeout: number): void { debug(`Set request timeout to ${timeout}`); this.timeout = timeout; } public setRetryConfig(cfg: FsRetryConfig) { debug(`Set retry config to ${cfg}`); this.retryConfig = cfg; } public setUrl(url: string): void { debug(`Set upload url to ${url}`); this.url = url; } public setUploadTags(tags: UploadTags) { debug(`Set tags to %O`, tags); this.uploadTags = tags; } /** * Set state of checking file integrity * @param state */ public setIntegrityCheck(state) { this.integrityCheck = state; } /** * Sets upload mode * * @param {UploadMode} mode * @param {boolean} [lock=false] * @returns * @memberof MultipartUploader */ public setUploadMode(mode: UploadMode, lock: boolean = false): void { // this shouldnt happend but for safety reasons if will stay /* istanbul ignore next */ if (this.isModeLocked === true) { debug(`Cannot switch mode to ${mode}. Locked! Probably mode is not supported at this apikey`); return; } this.isModeLocked = lock; debug(`Set upload mode to ${mode}`); this.uploadMode = mode; } /** * Set upload part size * if part size is smaller than minimum 5mb it will throw error * * @param {number} size * @returns {void} * @memberof S3Uploader */ public setPartSize(size: number): void { if (this.uploadMode !== UploadMode.DEFAULT) { debug('Cannot set part size because upload mode is other than default. '); return; } debug(`Set part size to ${size}`); if (size < MIN_PART_SIZE) { throw new FilestackError('Minimum part size is 5MB'); } this.partSize = size; } /** * Returns current part size */ public getPartSize() { return this.partSize; } /** * Set start part size for ii * * @param {number} size * @memberof S3Uploader */ public setIntelligentChunkSize(size: number): void { debug(`Set inteligent chunk size to ${size}`); if (size < MIN_CHUNK_SIZE) { throw new FilestackError(`Minimum intelligent chunk size is ${MIN_CHUNK_SIZE}`); } this.intelligentChunkSize = size; } /** * Returns intelligent chunk size */ public getIntelligentChunkSize(): number { return this.intelligentChunkSize; } /** * Returns filestack upload url * * @private * @returns * @memberof MultipartUploader */ public getUrl(): string { if (!this.url) { throw new FilestackError('Upload url not set'); } return this.url; } /** * Pause upload queue * * @memberof MultipartUploader */ public abstract pause(): void; /** * resume upload queue if its paused * * @memberof MultipartUploader */ public abstract resume(): void; /** * Aborts queue (all pending requests with will be aborted) * * @memberof MultipartUploader */ public abstract abort(msg?: string): void; public abstract addFile(file: File): string; public abstract execute(): Promise<any>; }