1+ import * as Utils from "./utils.js" ;
2+ import fetch from "runtime/http.js" ;
3+
4+ //JS SDK version
5+ let version = '{{VERSION}}' ;
6+ let environment ,
7+ api_key ;
8+ export default function Request ( options , fetchOptions ) {
9+ return new Promise ( function ( resolve , reject ) {
10+ let queryParams ;
11+ let serialize = function ( obj , prefix ) {
12+
13+ let str = [ ] ,
14+ p ;
15+ if ( typeof obj === "object" && obj . length !== undefined ) {
16+ for ( var i = 0 , _i = obj . length ; i < _i ; i ++ ) {
17+ str . push ( prefix + '[]=' + obj [ i ] ) ;
18+ }
19+ } else {
20+ for ( p in obj ) {
21+ let k = prefix ? prefix + "[" + p + "]" : p ,
22+ v = obj [ p ] ;
23+ str . push ( ( v !== null && typeof v === "object" && p !== 'query' ) ?
24+ serialize ( v , k ) :
25+ k + "=" + encodeURIComponent ( p !== 'query' ? v : JSON . stringify ( v ) ) ) ;
26+ }
27+ }
28+ return str . join ( "&" ) ;
29+ } ;
30+
31+ let url = options . url ,
32+ headers = options . headers ;
33+
34+ // setting headers
35+ headers [ 'Content-Type' ] = 'application/json; charset=UTF-8' ;
36+ headers [ 'X-User-Agent' ] = 'contentstack-{{PLATFORM}}/' + version ;
37+
38+ if ( options . body && typeof options . body === 'object' ) {
39+ delete options . body . _method ;
40+ if ( typeof options . body . query === "object" && Object . keys ( options . body . query ) . length === 0 ) delete options . body . query ;
41+ queryParams = serialize ( options . body ) ;
42+ }
43+
44+ return fetchRetry ( url + '?' + queryParams ,
45+ headers ,
46+ fetchOptions ,
47+ resolve ,
48+ reject ,
49+ fetchOptions . retryDelay ,
50+ fetchOptions . retryLimit )
51+
52+ } ) ;
53+ }
54+
55+ function wait ( retryDelay ) {
56+ return new Promise ( ( resolve ) => {
57+ setTimeout ( resolve , retryDelay )
58+ } ) ;
59+ }
60+
61+ function fetchRetry ( url , headers , fetchOptions , resolve , reject , retryDelay = 300 , retryLimit = 5 ) {
62+ var option = Utils . mergeDeep ( {
63+ method : 'GET' ,
64+ headers : headers ,
65+ timeout : 30000 ,
66+ } ,
67+ fetchOptions ) ;
68+
69+ function onError ( error ) {
70+ if ( retryLimit === 0 ) {
71+ reject ( error ) ;
72+ } else {
73+ var msDelay = retryDelay
74+ retryLimit = retryLimit - 1
75+ var retryCount = ( fetchOptions . retryLimit - retryLimit )
76+ if ( fetchOptions . retryDelayOptions ) {
77+ if ( fetchOptions . retryDelayOptions . base ) {
78+ msDelay = fetchOptions . retryDelayOptions . base * retryCount
79+ } else if ( fetchOptions . retryDelayOptions . customBackoff ) {
80+ msDelay = fetchOptions . retryDelayOptions . customBackoff ( retryCount , error )
81+ }
82+ }
83+ wait ( msDelay )
84+ . then ( ( ) => {
85+ return fetchRetry ( url , headers , retryDelay , retryLimit , fetchOptions , resolve , reject )
86+ } )
87+ }
88+ }
89+ fetch ( url , option )
90+ . then ( function ( response ) {
91+ let data = response . json ( ) ;
92+ if ( response . ok && response . status === 200 ) {
93+ resolve ( data ) ;
94+ } else {
95+ data . then ( ( json ) => {
96+ if ( fetchOptions . retryCondition && fetchOptions . retryCondition ( response ) ) {
97+ onError ( json )
98+ } else {
99+ reject ( json )
100+ }
101+ } ) . catch ( ( ) => {
102+ reject ( { status : response . status , statusText : response . statusText } )
103+ } ) ;
104+ }
105+ } ) . catch ( ( error ) => {
106+ reject ( error )
107+ } ) ;
108+ }
0 commit comments