This repository has been archived by the owner on Jul 15, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathWebClient.js
84 lines (71 loc) · 2.43 KB
/
WebClient.js
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
// @flow
import R from 'ramda'
import Rx from 'rxjs'
import createDebug from 'debug'
class WebClient {
ajax: (...rest: Array<any>) => Rx.Observable
debugAuth: (...rest: Array<any>) => void
constructor() {
this.ajax = Rx.Observable.ajax
this.debugAuth = createDebug('example:auth')
}
request(method: (...rest: Array<any>) => Rx.Observable, args: Array<any>, auth: ?boolean) {
const headers = args[args.length - 1] || {}
const devHeaders = localStorage.getItem('devHeaders')
if (devHeaders) {
R.forEachObjIndexed((value: any, key: string) => {
headers[key] = value
}, JSON.parse(devHeaders))
}
const authEnabled = auth === undefined || auth
if (authEnabled) {
const accessToken = localStorage.getItem('accessToken')
if (accessToken) {
headers.Authorization = `Bearer ${accessToken}`
}
}
return method(...[...args.slice(0, args.length - 1), headers])
}
tokenRefresh() {
this.debugAuth('refreshing token')
return Rx.Observable.create((observer: Rx.Observer) => {
const refreshToken = localStorage.getItem('refreshToken') || ''
this.post('/auth/refresh', { refreshToken }, null, false).subscribe(
(result: Object) => {
this.debugAuth('token refreshed')
const { accessToken } = result.response
localStorage.setItem('accessToken', accessToken)
observer.next(result.response)
},
(error: Object) => {
this.debugAuth(
'refreshing token failed',
R.pathOr(error, ['xhr', 'response', 'error'], error)
)
localStorage.removeItem('accessToken')
localStorage.removeItem('refreshToken')
observer.error(error)
},
() => {
observer.complete()
}
)
})
}
get(url: string, headers: ?Object, auth: ?boolean) {
return this.request(this.ajax.get, [url, headers], auth)
}
post(url: string, body: ?Object | ?FormData, headers: ?Object, auth: ?boolean) {
return this.request(this.ajax.post, [url, body, headers], auth)
}
delete(url: string, headers: ?Object, auth: ?boolean) {
return this.request(this.ajax.delete, [url, headers], auth)
}
put(url: string, body: ?Object | ?FormData, headers: ?Object, auth: ?boolean) {
return this.request(this.ajax.put, [url, body, headers], auth)
}
ajax(...args: Array<any>) {
return this.ajax(...args)
}
}
export default WebClient