filestack-js
Version:
Official JavaScript library for Filestack
119 lines (102 loc) • 3.15 kB
text/typescript
/*
* Copyright (c) 2018 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 { Security, Session } from '../client';
import { Filelink, StoreParams } from './../filelink';
import { FilestackError } from './../../filestack_error';
import { getValidator, StoreParamsSchema } from './../../schema';
import { FsRequest, FsCancelToken } from '../request';
import { UploadTags } from './upload/file';
export type StoreUrlParams = {
session: Session;
url?: string;
storeParams?: StoreParams;
token?: any;
security?: Security;
uploadTags?: UploadTags;
headers?: {[key: string]: string},
workflowIds?: string[]
};
/**
* Store given url with options and
*
* @param session
* @param url
* @param storeOpts
* @param token
* @param security
* @param uploadTags
* @param workflowIds
*/
export const storeURL = ({
session,
url,
storeParams,
token,
security,
uploadTags,
headers,
workflowIds,
}: StoreUrlParams): Promise<any> => {
if (!url || typeof url !== 'string') {
return Promise.reject(new FilestackError('url is required for storeURL'));
}
const validateRes = getValidator(StoreParamsSchema)(storeParams);
if (validateRes.errors.length) {
return Promise.reject(new FilestackError(`Invalid store params`, validateRes.errors));
}
session.policy = security && security.policy || session.policy;
session.signature = security && security.signature || session.signature;
const filelink = new Filelink(url, session.apikey);
filelink.store(storeParams);
if (session.policy && session.signature) {
filelink.security({
policy: session.policy,
signature: session.signature,
});
}
let options: any = {};
if (token) {
const cancelToken = new FsCancelToken();
token.cancel = cancelToken.cancel.bind(cancelToken);
options.cancelToken = cancelToken;
}
let sources: any = [ url ];
if (headers) {
sources = [{
source: url,
headers,
}];
}
if (workflowIds && workflowIds.length > 0) {
filelink.addTask('store', { workflows: workflowIds });
}
return FsRequest.post(`${session.urls.processUrl}/process`, {
apikey: session.apikey,
sources,
tasks: filelink.getTasks(),
upload_tags: uploadTags,
}, options).then((res) => {
if (res.data && res.data.handle) {
if (res.data.upload_tags) {
res.data.uploadTags = res.data.upload_tags;
delete res.data.upload_tags;
}
return { ...res.data, mimetype: res.data.type };
}
throw new FilestackError(`Invalid store response ${JSON.stringify(res.data)}`);
});
};