1 | var middleware = require('./middleware')
|
2 | var randomString = require('random-string')
|
3 | var mergeQueryString = require('../mergeQueryString')
|
4 |
|
5 | function randomGlobal (value) {
|
6 | var name
|
7 |
|
8 | do {
|
9 | name = '_' + randomString({length: 20})
|
10 | } while (typeof window[name] !== 'undefined')
|
11 |
|
12 | window[name] = value
|
13 |
|
14 | return name
|
15 | }
|
16 |
|
17 | module.exports = middleware('jsonp', function (request, next) {
|
18 | var jsonp = request.options.jsonp
|
19 |
|
20 | if (jsonp) {
|
21 | request.options.querystring = request.options.querystring || {}
|
22 |
|
23 | return new Promise(function (resolve, reject) {
|
24 | var callbackName = randomGlobal(function (v) {
|
25 | delete window[callbackName]
|
26 | document.head.removeChild(script)
|
27 | resolve({
|
28 | statusCode: 200,
|
29 | headers: {},
|
30 | body: v
|
31 | })
|
32 | })
|
33 |
|
34 | request.options.querystring[jsonp] = callbackName
|
35 |
|
36 | mergeQueryString(request)
|
37 |
|
38 | var script = document.createElement('script')
|
39 | script.type = 'text/javascript'
|
40 | script.src = request.url
|
41 | script.onerror = function () {
|
42 | reject(new Error('could not load script tag for JSONP request: ' + request.url))
|
43 | }
|
44 | document.head.appendChild(script)
|
45 | })
|
46 | }
|
47 |
|
48 | return next()
|
49 | })
|