1
1
import Promise from 'bluebird' ;
2
2
import axios from 'axios' ;
3
3
4
- axios . interceptors . response . use (
5
- response => response . data ,
6
- error => {
7
- const { data } = error . response ;
8
- const message = typeof data === 'string' ? data : JSON . stringify ( data ) ;
9
- return Promise . reject ( new Error ( message ) ) ;
10
- } ,
11
- ) ;
4
+ axios . interceptors . response . use ( response => response . data ) ;
12
5
13
6
const request = ( url , process ) => {
14
7
const tokens = url . split ( '/' ) ;
15
8
const baseURL = / ^ h t t p s ? : \/ \/ / i. test ( url ) ? '' : '/api' ;
16
9
return ( ...args ) => {
17
- return new Promise ( ( resolve , reject ) => {
18
- const mappedURL = baseURL + tokens . map ( ( token , i ) => token . startsWith ( ':' ) ? args . shift ( ) : token ) . join ( '/' ) ;
19
- return resolve ( process ( mappedURL , args ) ) ;
20
- } ) ;
10
+ const mappedURL = baseURL + tokens . map ( ( token , i ) => token . startsWith ( ':' ) ? args . shift ( ) : token ) . join ( '/' ) ;
11
+ return Promise . resolve ( process ( mappedURL , args ) ) ;
21
12
} ;
22
13
} ;
23
14
24
15
const GET = URL => {
25
16
return request ( URL , ( mappedURL , args ) => {
26
- const [ params ] = args ;
27
- return axios . get ( mappedURL , { params } ) ;
17
+ const [ params , cancelToken ] = args ;
18
+ return axios . get ( mappedURL , { params, cancelToken } ) ;
28
19
} ) ;
29
20
} ;
30
21
31
22
const DELETE = URL => {
32
23
return request ( URL , ( mappedURL , args ) => {
33
- const [ params ] = args ;
34
- return axios . delete ( mappedURL , { params } ) ;
24
+ const [ params , cancelToken ] = args ;
25
+ return axios . delete ( mappedURL , { params, cancelToken } ) ;
35
26
} ) ;
36
27
} ;
37
28
38
29
const POST = URL => {
39
30
return request ( URL , ( mappedURL , args ) => {
40
- const [ body , params ] = args ;
41
- return axios . post ( mappedURL , body , { params } ) ;
31
+ const [ body , params , cancelToken ] = args ;
32
+ return axios . post ( mappedURL , body , { params, cancelToken } ) ;
42
33
} ) ;
43
34
} ;
44
35
45
36
const PUT = URL => {
46
37
return request ( URL , ( mappedURL , args ) => {
47
- const [ body , params ] = args ;
48
- return axios . put ( mappedURL , body , { params } ) ;
38
+ const [ body , params , cancelToken ] = args ;
39
+ return axios . put ( mappedURL , body , { params, cancelToken } ) ;
49
40
} ) ;
50
41
} ;
51
42
52
43
const PATCH = URL => {
53
44
return request ( URL , ( mappedURL , args ) => {
54
- const [ body , params ] = args ;
55
- return axios . patch ( mappedURL , body , { params } ) ;
45
+ const [ body , params , cancelToken ] = args ;
46
+ return axios . patch ( mappedURL , body , { params, cancelToken } ) ;
56
47
} ) ;
57
48
} ;
58
49
@@ -72,7 +63,6 @@ const GitHubApi = {
72
63
forkGist : POST ( 'https://api.github.com/gists/:id/forks' ) ,
73
64
} ;
74
65
75
- let jsWorker = null ;
76
66
const TracerApi = {
77
67
md : ( { code } ) => Promise . resolve ( [ {
78
68
tracerKey : '0-MarkdownTracer-Markdown' ,
@@ -83,12 +73,23 @@ const TracerApi = {
83
73
method : 'set' ,
84
74
args : [ code ] ,
85
75
} ] ) ,
86
- js : ( { code } ) => new Promise ( ( resolve , reject ) => {
87
- if ( jsWorker ) jsWorker . terminate ( ) ;
88
- jsWorker = new Worker ( '/api/tracers/js' ) ;
89
- jsWorker . onmessage = e => resolve ( e . data ) ;
90
- jsWorker . onerror = reject ;
91
- jsWorker . postMessage ( code ) ;
76
+ js : ( { code } , params , cancelToken ) => new Promise ( ( resolve , reject ) => {
77
+ const worker = new Worker ( '/api/tracers/js' ) ;
78
+ if ( cancelToken ) {
79
+ cancelToken . promise . then ( cancel => {
80
+ worker . terminate ( ) ;
81
+ reject ( cancel ) ;
82
+ } ) ;
83
+ }
84
+ worker . onmessage = e => {
85
+ worker . terminate ( ) ;
86
+ resolve ( e . data ) ;
87
+ } ;
88
+ worker . onerror = error => {
89
+ worker . terminate ( ) ;
90
+ reject ( error ) ;
91
+ } ;
92
+ worker . postMessage ( code ) ;
92
93
} ) ,
93
94
cpp : POST ( '/tracers/cpp' ) ,
94
95
java : POST ( '/tracers/java' ) ,
0 commit comments