mirror of https://github.com/sundowndev/http.git
chore: basic migration of plugin
parent
e38838416a
commit
a493fee0fb
195
lib/plugin.js
195
lib/plugin.js
|
@ -1,202 +1,31 @@
|
||||||
import Axios from 'axios'
|
import KY from 'ky-universal'
|
||||||
<% if (options.retry) { %>import axiosRetry from 'axios-retry'<% } %>
|
|
||||||
|
|
||||||
// Axios.prototype cannot be modified
|
|
||||||
const axiosExtra = {
|
|
||||||
setHeader (name, value, scopes = 'common') {
|
|
||||||
for (let scope of Array.isArray(scopes) ? scopes : [ scopes ]) {
|
|
||||||
if (!value) {
|
|
||||||
delete this.defaults.headers[scope][name];
|
|
||||||
return
|
|
||||||
}
|
|
||||||
this.defaults.headers[scope][name] = value
|
|
||||||
}
|
|
||||||
},
|
|
||||||
setToken (token, type, scopes = 'common') {
|
|
||||||
const value = !token ? null : (type ? type + ' ' : '') + token
|
|
||||||
this.setHeader('Authorization', value, scopes)
|
|
||||||
},
|
|
||||||
onRequest(fn) {
|
|
||||||
this.interceptors.request.use(config => fn(config) || config)
|
|
||||||
},
|
|
||||||
onResponse(fn) {
|
|
||||||
this.interceptors.response.use(response => fn(response) || response)
|
|
||||||
},
|
|
||||||
onRequestError(fn) {
|
|
||||||
this.interceptors.request.use(undefined, error => fn(error) || Promise.reject(error))
|
|
||||||
},
|
|
||||||
onResponseError(fn) {
|
|
||||||
this.interceptors.response.use(undefined, error => fn(error) || Promise.reject(error))
|
|
||||||
},
|
|
||||||
onError(fn) {
|
|
||||||
this.onRequestError(fn)
|
|
||||||
this.onResponseError(fn)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Request helpers ($get, $post, ...)
|
|
||||||
for (let method of ['request', 'delete', 'get', 'head', 'options', 'post', 'put', 'patch']) {
|
|
||||||
axiosExtra['$' + method] = function () { return this[method].apply(this, arguments).then(res => res && res.data) }
|
|
||||||
}
|
|
||||||
|
|
||||||
const extendAxiosInstance = axios => {
|
|
||||||
for (let key in axiosExtra) {
|
|
||||||
axios[key] = axiosExtra[key].bind(axios)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
<% if (options.debug) { %>
|
|
||||||
const log = (level, ...messages) => console[level]('[Axios]', ...messages)
|
|
||||||
|
|
||||||
const setupDebugInterceptor = axios => {
|
|
||||||
// request
|
|
||||||
axios.onRequestError(error => {
|
|
||||||
log('error', 'Request error:', error)
|
|
||||||
})
|
|
||||||
|
|
||||||
// response
|
|
||||||
axios.onResponseError(error => {
|
|
||||||
log('error', 'Response error:', error)
|
|
||||||
})
|
|
||||||
axios.onResponse(res => {
|
|
||||||
log(
|
|
||||||
'info',
|
|
||||||
'[' + (res.status + ' ' + res.statusText) + ']',
|
|
||||||
'[' + res.config.method.toUpperCase() + ']',
|
|
||||||
res.config.url)
|
|
||||||
|
|
||||||
if (process.browser) {
|
|
||||||
console.log(res)
|
|
||||||
} else {
|
|
||||||
console.log(JSON.stringify(res.data, undefined, 2))
|
|
||||||
}
|
|
||||||
|
|
||||||
return res
|
|
||||||
})
|
|
||||||
}<% } %>
|
|
||||||
|
|
||||||
<% if (options.credentials) { %>
|
|
||||||
const setupCredentialsInterceptor = axios => {
|
|
||||||
// Send credentials only to relative and API Backend requests
|
|
||||||
axios.onRequest(config => {
|
|
||||||
if (config.withCredentials === undefined) {
|
|
||||||
if (!/^https?:\/\//i.test(config.url) || config.url.indexOf(config.baseURL) === 0) {
|
|
||||||
config.withCredentials = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}<% } %>
|
|
||||||
|
|
||||||
<% if (options.progress) { %>
|
|
||||||
const setupProgress = (axios, ctx) => {
|
|
||||||
if (process.server) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// A noop loading inteterface for when $nuxt is not yet ready
|
|
||||||
const noopLoading = {
|
|
||||||
finish: () => { },
|
|
||||||
start: () => { },
|
|
||||||
fail: () => { },
|
|
||||||
set: () => { }
|
|
||||||
}
|
|
||||||
|
|
||||||
const $loading = () => (window.$nuxt && window.$nuxt.$loading && window.$nuxt.$loading.set) ? window.$nuxt.$loading : noopLoading
|
|
||||||
|
|
||||||
let currentRequests = 0
|
|
||||||
|
|
||||||
axios.onRequest(config => {
|
|
||||||
if (config && config.progress === false) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
currentRequests++
|
|
||||||
})
|
|
||||||
|
|
||||||
axios.onResponse(response => {
|
|
||||||
if (response && response.config && response.config.progress === false) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
currentRequests--
|
|
||||||
if (currentRequests <= 0) {
|
|
||||||
currentRequests = 0
|
|
||||||
$loading().finish()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
axios.onError(error => {
|
|
||||||
if (error && error.config && error.config.progress === false) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
currentRequests--
|
|
||||||
$loading().fail()
|
|
||||||
$loading().finish()
|
|
||||||
})
|
|
||||||
|
|
||||||
const onProgress = e => {
|
|
||||||
if (!currentRequests) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const progress = ((e.loaded * 100) / (e.total * currentRequests))
|
|
||||||
$loading().set(Math.min(100, progress))
|
|
||||||
}
|
|
||||||
|
|
||||||
axios.defaults.onUploadProgress = onProgress
|
|
||||||
axios.defaults.onDownloadProgress = onProgress
|
|
||||||
}<% } %>
|
|
||||||
|
|
||||||
export default (ctx, inject) => {
|
export default (ctx, inject) => {
|
||||||
// baseURL
|
// Set baseURL
|
||||||
const baseURL = process.browser
|
const baseURL = process.browser
|
||||||
? '<%= options.browserBaseURL %>'
|
? '<%= options.browserBaseURL %>'
|
||||||
: (process.env._AXIOS_BASE_URL_ || '<%= options.baseURL %>')
|
: (process.env._HTTP_BASE_URL_ || '<%= options.baseURL %>')
|
||||||
|
|
||||||
// Create fresh objects for all default header scopes
|
const kyDefaults = {
|
||||||
// Axios creates only one which is shared across SSR requests!
|
|
||||||
// https://github.com/mzabriskie/axios/blob/master/lib/defaults.js
|
|
||||||
const headers = {
|
|
||||||
common : {
|
|
||||||
'Accept': 'application/json, text/plain, */*'
|
|
||||||
},
|
|
||||||
delete: {},
|
|
||||||
get: {},
|
|
||||||
head: {},
|
|
||||||
post: {},
|
|
||||||
put: {},
|
|
||||||
patch: {}
|
|
||||||
}
|
|
||||||
|
|
||||||
const axiosOptions = {
|
|
||||||
baseURL,
|
baseURL,
|
||||||
headers
|
headers
|
||||||
}
|
}
|
||||||
|
|
||||||
<% if (options.proxyHeaders) { %>
|
<% if (options.proxyHeaders) { %>
|
||||||
// Proxy SSR request headers headers
|
// Proxy SSR request headers headers
|
||||||
axiosOptions.headers.common = (ctx.req && ctx.req.headers) ? Object.assign({}, ctx.req.headers) : {}
|
kyDefaults.headers = (ctx.req && ctx.req.headers) ? { ...ctx.req.headers } : {}
|
||||||
<% for (let h of options.proxyHeadersIgnore) { %>delete axiosOptions.headers.common['<%= h %>']
|
<% for (let h of options.proxyHeadersIgnore) { %> delete kyDefaults.headers['<%= h %>']
|
||||||
<% } %><% } %>
|
<% } %><% } %>
|
||||||
|
|
||||||
if (process.server) {
|
if (process.server) {
|
||||||
// Don't accept brotli encoding because Node can't parse it
|
// Don't accept brotli encoding because Node can't parse it
|
||||||
axiosOptions.headers.common['Accept-Encoding'] = 'gzip, deflate'
|
kyDefaults.headers['Accept-Encoding'] = 'gzip, deflate'
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create new axios instance
|
// Extend ky with defaults
|
||||||
const axios = Axios.create(axiosOptions)
|
const ky = KY.extend(kyDefaults)
|
||||||
|
|
||||||
// Extend axios proto
|
// Inject http to the context as $http
|
||||||
extendAxiosInstance(axios)
|
ctx.$http = ky
|
||||||
|
inject('http', http)
|
||||||
// Setup interceptors
|
|
||||||
<% if (options.debug) { %>setupDebugInterceptor(axios) <% } %>
|
|
||||||
<% if (options.credentials) { %>setupCredentialsInterceptor(axios)<% } %>
|
|
||||||
<% if (options.progress) { %>setupProgress(axios, ctx) <% } %>
|
|
||||||
<% if (options.retry) { %>axiosRetry(axios, <%= serialize(options.retry) %>)<% } %>
|
|
||||||
|
|
||||||
// Inject axios to the context as $axios
|
|
||||||
ctx.$axios = axios
|
|
||||||
inject('axios', axios)
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue