-
Notifications
You must be signed in to change notification settings - Fork 26
/
request.ts
129 lines (121 loc) · 4.46 KB
/
request.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import respond from "../utils/respond";
import errorMessages from "../constants/errorMessages"
import { ImageKitOptions, UploadResponse } from "../interfaces";
import IKResponse from "../interfaces/IKResponse";
interface SignatureResponse {
signature: string
expire: number
token: string
}
function getResponseHeaderMap(xhr: XMLHttpRequest) {
const headers: Record<string, string | number | boolean> = {};
const responseHeaders = xhr.getAllResponseHeaders();
if (Object.keys(responseHeaders).length) {
responseHeaders
.trim()
.split(/[\r\n]+/)
.map(value => value.split(/: /))
.forEach(keyValue => {
headers[keyValue[0].trim()] = keyValue[1].trim();
});
}
return headers;
}
const addResponseHeadersAndBody = (body: any, xhr: XMLHttpRequest): IKResponse<UploadResponse> => {
let response = { ...body };
const responseMetadata = {
statusCode: xhr.status,
headers: getResponseHeaderMap(xhr)
}
Object.defineProperty(response, "$ResponseMetadata", {
value: responseMetadata,
enumerable: false,
writable: false
});
return response as IKResponse<UploadResponse>;
}
export const request = (
uploadFileXHR: XMLHttpRequest,
formData: FormData,
options: ImageKitOptions & { authenticationEndpoint: string },
callback?: (err: Error | null, response: UploadResponse | null) => void) => {
generateSignatureToken(options.authenticationEndpoint).then((signaturObj) => {
formData.append("signature", signaturObj.signature);
formData.append("expire", String(signaturObj.expire));
formData.append("token", signaturObj.token);
uploadFile(uploadFileXHR, formData).then((result) => {
return respond(false, result, callback);
}, (ex) => {
return respond(true, ex, callback);
});
}, (ex) => {
return respond(true, ex, callback);
});
}
export const generateSignatureToken = (
authenticationEndpoint: string
): Promise<SignatureResponse> => {
return new Promise((resolve, reject) => {
var xhr = new XMLHttpRequest();
xhr.timeout = 60000;
xhr.open('GET', authenticationEndpoint);
xhr.ontimeout = function (e) {
return reject(errorMessages.AUTH_ENDPOINT_TIMEOUT);
};
xhr.onerror = function () {
return reject(errorMessages.AUTH_ENDPOINT_NETWORK_ERROR);
}
xhr.onload = function () {
if (xhr.status === 200) {
try {
var body = JSON.parse(xhr.responseText);
var obj = {
signature: body.signature,
expire: body.expire,
token: body.token
}
if (!obj.signature || !obj.expire || !obj.token) {
return reject(errorMessages.AUTH_INVALID_RESPONSE);
}
return resolve(obj);
} catch (ex) {
return reject(errorMessages.AUTH_INVALID_RESPONSE);
}
} else {
return reject(errorMessages.AUTH_INVALID_RESPONSE);
}
};
xhr.send();
});
}
export const uploadFile = (
uploadFileXHR: XMLHttpRequest,
formData: FormData
): Promise<IKResponse<UploadResponse> | Error> => {
return new Promise((resolve, reject) => {
uploadFileXHR.open('POST', 'https://upload.imagekit.io/api/v1/files/upload');
uploadFileXHR.onerror = function (e) {
return reject(errorMessages.UPLOAD_ENDPOINT_NETWORK_ERROR);
}
uploadFileXHR.onload = function () {
if (uploadFileXHR.status === 200) {
try {
var body = JSON.parse(uploadFileXHR.responseText);
var uploadResponse = addResponseHeadersAndBody(body, uploadFileXHR);
return resolve(uploadResponse);
} catch (ex: any) {
return reject(ex);
}
} else {
try {
var body = JSON.parse(uploadFileXHR.responseText);
var uploadError = addResponseHeadersAndBody(body, uploadFileXHR);
return reject(uploadError)
} catch (ex: any) {
return reject(ex);
}
}
};
uploadFileXHR.send(formData);
});
}