1 | var Client = module.exports
|
2 |
|
3 | var Promise = require("bluebird")
|
4 |
|
5 | var routes = require("../routes")
|
6 | var axios = require("axios")
|
7 |
|
8 | var d = require("debug")("raptorjs:client:http")
|
9 |
|
10 | Client.create = function (container) {
|
11 |
|
12 | var emit = function() {
|
13 | container.emit.apply(container, arguments)
|
14 | }
|
15 |
|
16 | var opts = container.config
|
17 |
|
18 | var addDefaultHeaders = function(opts, token) {
|
19 | if(!opts.headers) {
|
20 | opts.headers = { "Content-Type": "application/json" }
|
21 | }
|
22 | if(token) {
|
23 | opts.headers.Authorization = `Bearer ${token}`
|
24 | }
|
25 | }
|
26 |
|
27 | var defaultsOptions = {
|
28 | baseURL: opts.url
|
29 |
|
30 |
|
31 | }
|
32 |
|
33 | addDefaultHeaders(defaultsOptions)
|
34 |
|
35 |
|
36 | console.log('using axios')
|
37 | var client = axios.create(defaultsOptions)
|
38 |
|
39 | d("Created new client %s", defaultsOptions.baseURL)
|
40 |
|
41 | var instance = {}
|
42 |
|
43 | instance.baseRequest = (options) => {
|
44 | return new Promise(function (resolve, reject) {
|
45 |
|
46 | options.headers = Object.assign({}, defaultsOptions.headers || {}, options.headers || {})
|
47 |
|
48 | d("Performing request %j", options)
|
49 | client(options).then((res) => {
|
50 |
|
51 | var json
|
52 | try {
|
53 | json = JSON.parse(res.data)
|
54 | } catch(e) {
|
55 | json = res.data
|
56 | }
|
57 |
|
58 | if(res.status >= 400 || res.status < 200) {
|
59 |
|
60 | if (res.status === 0) {
|
61 | res.statusMessage = "Cannot perform request"
|
62 | }
|
63 |
|
64 | let error = {
|
65 | code: json ? json.code : res.status,
|
66 | message: json ? json.message : res.statusText
|
67 | }
|
68 |
|
69 | if (res.data) {
|
70 | d("Error body: \n %j", res.data)
|
71 | }
|
72 |
|
73 | d("Request error %s %s", error.code, error.message)
|
74 |
|
75 | emit("request.error", error)
|
76 | emit("request.complete", false)
|
77 |
|
78 | const err = new Error(error.message)
|
79 | err.code = error.code
|
80 |
|
81 | return reject(err)
|
82 | }
|
83 |
|
84 | d("Request response: %j", json)
|
85 |
|
86 | emit("request.complete", json)
|
87 | resolve(json)
|
88 | }).catch(function (error) {
|
89 | console.error(error.code)
|
90 | return reject(error)
|
91 | })
|
92 |
|
93 | })
|
94 | }
|
95 |
|
96 | instance.request = function (options) {
|
97 |
|
98 |
|
99 | var userReq = (
|
100 | options.url === routes.LOGIN ||
|
101 | options.url === routes.USER_GET_ME ||
|
102 | options.url === routes.REFRESH_TOKEN
|
103 | ) ?
|
104 | Promise.resolve() : container.Auth().loadUser()
|
105 |
|
106 | emit("request.start", options)
|
107 |
|
108 | return userReq.then(function () {
|
109 |
|
110 | if(container.Auth().getToken()) {
|
111 | addDefaultHeaders(options, container.Auth().getToken())
|
112 | }
|
113 |
|
114 | return instance.baseRequest(options)
|
115 | })
|
116 |
|
117 | }
|
118 |
|
119 | instance.get = function (url) {
|
120 | return instance.request({
|
121 | method: "GET",
|
122 | url: url
|
123 | })
|
124 | }
|
125 |
|
126 | instance.delete = function (url) {
|
127 | return instance.request({
|
128 | method: "DELETE",
|
129 | url: url
|
130 | })
|
131 | }
|
132 |
|
133 | instance.put = function (url, data) {
|
134 | return instance.request({
|
135 | method: "PUT",
|
136 | url: url,
|
137 | data: data
|
138 | })
|
139 | }
|
140 |
|
141 | instance.post = function (url, data) {
|
142 | return instance.request({
|
143 | method: "POST",
|
144 | url: url,
|
145 | data: data
|
146 | })
|
147 | }
|
148 |
|
149 | instance.client = client
|
150 |
|
151 | return instance
|
152 | }
|