1+ import axios from 'axios' ;
2+ import FormData from 'form-data' ;
3+ import logger from '@shared/Logger' ;
4+
5+ export async function post ( endpoint_url : string , data : FormData , extra : any ) {
6+ return await request ( {
7+ method : 'post' ,
8+ url : endpoint_url ,
9+ data : data ,
10+ headers : extra } , true ) ;
11+ }
12+
13+ export async function get ( endpoint_url : string , req_qry : any , token : string ) {
14+ return await request ( {
15+ method : 'get' ,
16+ url : endpoint_url ,
17+ params : req_qry ,
18+ headers : {
19+ 'Authorization' : `Bearer ${ token } `
20+ } } , true ) ;
21+ }
22+
23+ export async function request ( config : any , retry_flag : boolean ) {
24+ var resp = null
25+ try {
26+ resp = await axios ( config ) ;
27+ } catch ( error : any ) {
28+ // DEVELOPER NOTES:
29+ // here handle errors per errors.md
30+ console . log ( 'Error message: [' , error . message , ']' ) ;
31+ if ( error . response ) {
32+ console . log ( "response code: " + error . response . status )
33+ console . log ( "response text: " + error . response . data )
34+ // DEVELOPER NOTES:
35+ // check for retryable (e.g. 500 & fhir) errors and do retrying...
36+ if ( retry_flag && is_retryable ( error ) ) {
37+ console . log ( "Request failed and is retryable, entering retry process..." )
38+ var retry_resp = await do_retry ( config )
39+ if ( retry_resp ) {
40+ resp = retry_resp ;
41+ }
42+ }
43+ else {
44+ resp = error . response
45+ }
46+ }
47+ else if ( error . request ) {
48+ // something went wrong on sender side, not retryable
49+ // error.request is an instance of XMLHttpRequest in the browser and an instance of
50+ // http.ClientRequest in node.js
51+ console . log ( "error.request: " + error . request ) ;
52+ }
53+ // dump axios config for diagnosis
54+ console . log ( "config:" )
55+ console . log ( error . config ) ;
56+ }
57+ return resp
58+ }
59+
60+ function is_retryable ( error : any ) {
61+ if ( error . response && error . response . status === 500 ) {
62+ if ( error . request . path && error . request . path . match ( "^/v[12]/fhir/.*" ) ) {
63+ return true ;
64+ }
65+ }
66+ return false ;
67+ }
68+
69+ // for demo: retry init-interval = 5 sec, max attempt 3, with retry interval = init-interval * (2 ** n)
70+ // where n retry attempted
71+ async function do_retry ( config : any ) {
72+ const interval = 5
73+ const max_attempts = 3
74+ var resp = null
75+ for ( let i = 0 ; i < max_attempts ; i ++ ) {
76+ var wait_in_sec = interval * ( 2 ** i )
77+ console . log ( "wait " , wait_in_sec , " seconds..." )
78+ await sleep ( wait_in_sec * 1000 )
79+ console . log ( "retry attempts: " , i + 1 )
80+ try {
81+ resp = await axios ( config ) ;
82+ console . log ( "retry successful:" )
83+ console . log ( resp . data ) ;
84+ break ;
85+ } catch ( error : any ) {
86+ console . log ( "retry error: [" , error . message , "]" )
87+ if ( error . response ) {
88+ console . log ( "response code: " , error . response . status )
89+ console . log ( "response data: " , error . response . data )
90+ }
91+ }
92+ }
93+ return resp
94+ }
95+
96+ function sleep ( ms : any ) {
97+ return new Promise ( ( resolve ) => {
98+ setTimeout ( resolve , ms ) ;
99+ } ) ;
100+ }
101+
0 commit comments