mphttpx 1.2.0-beta.1 → 1.2.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/AbortControllerP.js +31 -0
- package/dist/cjs/AbortSignalP.js +126 -0
- package/dist/cjs/BlobP.js +131 -0
- package/dist/cjs/BodyImpl.js +142 -0
- package/dist/cjs/CloseEventP.js +38 -0
- package/dist/cjs/CustomEventP.js +35 -0
- package/dist/cjs/EventP.js +173 -0
- package/dist/cjs/EventTargetP.js +176 -0
- package/dist/cjs/FileP.js +36 -0
- package/dist/cjs/FileReaderP.js +151 -0
- package/dist/cjs/FormDataP.js +250 -0
- package/dist/cjs/HeadersP.js +184 -0
- package/dist/cjs/MessageEventP.js +64 -0
- package/dist/cjs/ProgressEventP.js +69 -0
- package/dist/cjs/RequestP.js +150 -0
- package/dist/cjs/ResponseP.js +102 -0
- package/dist/cjs/TextDecoderP.js +186 -0
- package/dist/cjs/TextEncoderP.js +122 -0
- package/dist/cjs/URLSearchParamsP.js +230 -0
- package/dist/cjs/WebSocketP.js +238 -0
- package/dist/cjs/XMLHttpRequestP.js +563 -0
- package/dist/cjs/convertor.js +83 -0
- package/dist/cjs/fetchP.js +115 -0
- package/dist/cjs/index.js +80 -0
- package/dist/cjs/isPolyfill.js +56 -0
- package/dist/cjs/platform.js +33 -0
- package/dist/esm/AbortControllerP.js +28 -0
- package/dist/esm/AbortSignalP.js +121 -0
- package/dist/esm/BlobP.js +124 -0
- package/dist/esm/BodyImpl.js +137 -0
- package/dist/esm/CloseEventP.js +35 -0
- package/dist/esm/CustomEventP.js +32 -0
- package/dist/esm/EventP.js +165 -0
- package/dist/esm/EventTargetP.js +168 -0
- package/dist/esm/FileP.js +33 -0
- package/dist/esm/FileReaderP.js +148 -0
- package/dist/esm/FormDataP.js +245 -0
- package/dist/esm/HeadersP.js +177 -0
- package/dist/esm/MessageEventP.js +61 -0
- package/dist/esm/ProgressEventP.js +65 -0
- package/dist/esm/RequestP.js +146 -0
- package/dist/esm/ResponseP.js +98 -0
- package/dist/esm/TextDecoderP.js +183 -0
- package/dist/esm/TextEncoderP.js +119 -0
- package/dist/esm/URLSearchParamsP.js +227 -0
- package/dist/esm/WebSocketP.js +234 -0
- package/dist/esm/XMLHttpRequestP.js +559 -0
- package/dist/esm/convertor.js +80 -0
- package/dist/esm/fetchP.js +111 -0
- package/dist/esm/index.js +25 -0
- package/dist/esm/isPolyfill.js +48 -0
- package/dist/esm/platform.js +31 -0
- package/dist/index.d.ts +1 -5
- package/package.json +7 -10
- package/dist/index.cjs.js +0 -3252
- package/dist/index.cjs.min.js +0 -1
- package/dist/index.esm.js +0 -3212
- package/dist/index.esm.min.js +0 -1
|
@@ -0,0 +1,559 @@
|
|
|
1
|
+
import { convert, convertBack } from './convertor.js';
|
|
2
|
+
import { Uint8Array_toBase64, encode } from './BlobP.js';
|
|
3
|
+
import { normalizeMethod, HeadersP } from './HeadersP.js';
|
|
4
|
+
import { EventTargetP, attachFn, executeFn, EventTargetState, eventTargetState as state$2, EventTarget_fire } from './EventTargetP.js';
|
|
5
|
+
import { createInnerEvent } from './EventP.js';
|
|
6
|
+
import { emitProcessEvent } from './ProgressEventP.js';
|
|
7
|
+
import { mp as mp$1 } from './platform.js';
|
|
8
|
+
import { polyfill, checkArgsLength, MPException } from './isPolyfill.js';
|
|
9
|
+
import './FormDataP.js';
|
|
10
|
+
import './FileP.js';
|
|
11
|
+
import './TextEncoderP.js';
|
|
12
|
+
import './TextDecoderP.js';
|
|
13
|
+
|
|
14
|
+
const request = mp$1 ? mp$1.request : function errorRequest(options) {
|
|
15
|
+
const errMsg = "NOT_SUPPORTED_ERR";
|
|
16
|
+
const errno = 9;
|
|
17
|
+
const err = {
|
|
18
|
+
errMsg,
|
|
19
|
+
errno,
|
|
20
|
+
exception: {
|
|
21
|
+
retryCount: 0,
|
|
22
|
+
reasons: [{ errMsg, errno }],
|
|
23
|
+
},
|
|
24
|
+
useHttpDNS: false,
|
|
25
|
+
};
|
|
26
|
+
Promise.resolve(err)
|
|
27
|
+
.then(err => { try {
|
|
28
|
+
if (options.fail) {
|
|
29
|
+
options.fail(err);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
console.error(e);
|
|
34
|
+
} })
|
|
35
|
+
.then(() => { if (options.complete) {
|
|
36
|
+
options.complete(err);
|
|
37
|
+
} });
|
|
38
|
+
throw new ReferenceError("request is not defined");
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
var _a$1;
|
|
42
|
+
/** @internal */ const state$1 = Symbol( /* "XMLHttpRequestEventTargetState" */);
|
|
43
|
+
class XMLHttpRequestEventTargetP extends EventTargetP {
|
|
44
|
+
/** @internal */
|
|
45
|
+
constructor() {
|
|
46
|
+
if (new.target === XMLHttpRequestEventTargetP) {
|
|
47
|
+
throw new TypeError("Failed to construct 'XMLHttpRequestEventTarget': Illegal constructor");
|
|
48
|
+
}
|
|
49
|
+
super();
|
|
50
|
+
this[state$1] = new XMLHttpRequestEventTargetState(this);
|
|
51
|
+
}
|
|
52
|
+
get onabort() { return this[state$1].onabort; }
|
|
53
|
+
set onabort(value) { this[state$1].onabort = value; attach(this, "abort"); }
|
|
54
|
+
get onerror() { return this[state$1].onerror; }
|
|
55
|
+
set onerror(value) { this[state$1].onerror = value; attach(this, "error"); }
|
|
56
|
+
get onload() { return this[state$1].onload; }
|
|
57
|
+
set onload(value) { this[state$1].onload = value; attach(this, "load"); }
|
|
58
|
+
get onloadend() { return this[state$1].onloadend; }
|
|
59
|
+
set onloadend(value) { this[state$1].onloadend = value; attach(this, "loadend"); }
|
|
60
|
+
get onloadstart() { return this[state$1].onloadstart; }
|
|
61
|
+
set onloadstart(value) { this[state$1].onloadstart = value; attach(this, "loadstart"); }
|
|
62
|
+
get onprogress() { return this[state$1].onprogress; }
|
|
63
|
+
set onprogress(value) { this[state$1].onprogress = value; attach(this, "progress"); }
|
|
64
|
+
get ontimeout() { return this[state$1].ontimeout; }
|
|
65
|
+
set ontimeout(value) { this[state$1].ontimeout = value; attach(this, "timeout"); }
|
|
66
|
+
/** @internal */ toString() { return "[object XMLHttpRequestEventTarget]"; }
|
|
67
|
+
/** @internal */ get [Symbol.toStringTag]() { return "XMLHttpRequestEventTarget"; }
|
|
68
|
+
/** @internal */ get isPolyfill() { return { symbol: polyfill, hierarchy: ["XMLHttpRequestEventTarget", "EventTarget"] }; }
|
|
69
|
+
}
|
|
70
|
+
/** @internal */
|
|
71
|
+
const _handlers$1 = Symbol();
|
|
72
|
+
/** @internal */
|
|
73
|
+
class XMLHttpRequestEventTargetState {
|
|
74
|
+
/**
|
|
75
|
+
* @param _target XMLHttpRequestEventTarget
|
|
76
|
+
*/
|
|
77
|
+
constructor(_target) {
|
|
78
|
+
this[_a$1] = getHandlers$1(this);
|
|
79
|
+
this.onabort = null;
|
|
80
|
+
this.onerror = null;
|
|
81
|
+
this.onload = null;
|
|
82
|
+
this.onloadend = null;
|
|
83
|
+
this.onloadstart = null;
|
|
84
|
+
this.onprogress = null;
|
|
85
|
+
this.ontimeout = null;
|
|
86
|
+
this.target = _target;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
_a$1 = _handlers$1;
|
|
90
|
+
function attach(target, type) {
|
|
91
|
+
const s = target[state$1];
|
|
92
|
+
const fnName = ("on" + type);
|
|
93
|
+
const cb = s[fnName];
|
|
94
|
+
const listener = s[_handlers$1][fnName];
|
|
95
|
+
attachFn(target, type, cb, listener);
|
|
96
|
+
}
|
|
97
|
+
function getHandlers$1(s) {
|
|
98
|
+
return {
|
|
99
|
+
onabort: (ev) => { executeFn(s.target, s.onabort, ev); },
|
|
100
|
+
onerror: (ev) => { executeFn(s.target, s.onerror, ev); },
|
|
101
|
+
onload: (ev) => { executeFn(s.target, s.onload, ev); },
|
|
102
|
+
onloadend: (ev) => { executeFn(s.target, s.onloadend, ev); },
|
|
103
|
+
onloadstart: (ev) => { executeFn(s.target, s.onloadstart, ev); },
|
|
104
|
+
onprogress: (ev) => { executeFn(s.target, s.onprogress, ev); },
|
|
105
|
+
ontimeout: (ev) => { executeFn(s.target, s.ontimeout, ev); },
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const responseTypes = ["", "text", "json", "arraybuffer", "blob", "document"];
|
|
109
|
+
/** @internal */
|
|
110
|
+
function normalizeResponseType(responseType) {
|
|
111
|
+
return responseTypes.indexOf(responseType) > -1 ? responseType : "";
|
|
112
|
+
}
|
|
113
|
+
const statusMessages = {
|
|
114
|
+
100: "Continue",
|
|
115
|
+
101: "Switching Protocols",
|
|
116
|
+
102: "Processing",
|
|
117
|
+
103: "Early Hints",
|
|
118
|
+
200: "OK",
|
|
119
|
+
201: "Created",
|
|
120
|
+
202: "Accepted",
|
|
121
|
+
203: "Non-Authoritative Information",
|
|
122
|
+
204: "No Content",
|
|
123
|
+
205: "Reset Content",
|
|
124
|
+
206: "Partial Content",
|
|
125
|
+
207: "Multi-Status",
|
|
126
|
+
208: "Already Reported",
|
|
127
|
+
226: "IM Used",
|
|
128
|
+
300: "Multiple Choices",
|
|
129
|
+
301: "Moved Permanently",
|
|
130
|
+
302: "Found",
|
|
131
|
+
303: "See Other",
|
|
132
|
+
304: "Not Modified",
|
|
133
|
+
307: "Temporary Redirect",
|
|
134
|
+
308: "Permanent Redirect",
|
|
135
|
+
400: "Bad Request",
|
|
136
|
+
401: "Unauthorized",
|
|
137
|
+
402: "Payment Required",
|
|
138
|
+
403: "Forbidden",
|
|
139
|
+
404: "Not Found",
|
|
140
|
+
405: "Method Not Allowed",
|
|
141
|
+
406: "Not Acceptable",
|
|
142
|
+
407: "Proxy Authentication Required",
|
|
143
|
+
408: "Request Timeout",
|
|
144
|
+
409: "Conflict",
|
|
145
|
+
410: "Gone",
|
|
146
|
+
411: "Length Required",
|
|
147
|
+
412: "Precondition Failed",
|
|
148
|
+
413: "Content Too Large",
|
|
149
|
+
414: "URI Too Long",
|
|
150
|
+
415: "Unsupported Media Type",
|
|
151
|
+
416: "Range Not Satisfiable",
|
|
152
|
+
417: "Expectation Failed",
|
|
153
|
+
418: "I'm a teapot",
|
|
154
|
+
421: "Misdirected Request",
|
|
155
|
+
422: "Unprocessable Entity",
|
|
156
|
+
423: "Locked",
|
|
157
|
+
424: "Failed Dependency",
|
|
158
|
+
425: "Too Early",
|
|
159
|
+
426: "Upgrade Required",
|
|
160
|
+
428: "Precondition Required",
|
|
161
|
+
429: "Too Many Requests",
|
|
162
|
+
431: "Request Header Fields Too Large",
|
|
163
|
+
451: "Unavailable For Legal Reasons",
|
|
164
|
+
500: "Internal Server Error",
|
|
165
|
+
501: "Not Implemented",
|
|
166
|
+
502: "Bad Gateway",
|
|
167
|
+
503: "Service Unavailable",
|
|
168
|
+
504: "Gateway Timeout",
|
|
169
|
+
505: "HTTP Version Not Supported",
|
|
170
|
+
506: "Variant Also Negotiates",
|
|
171
|
+
507: "Insufficient Storage",
|
|
172
|
+
508: "Loop Detected",
|
|
173
|
+
510: "Not Extended",
|
|
174
|
+
511: "Network Authentication Required"
|
|
175
|
+
};
|
|
176
|
+
/** @internal */
|
|
177
|
+
function statusTextMap(val) {
|
|
178
|
+
return statusMessages[val] || "unknown";
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
class XMLHttpRequestUploadP extends XMLHttpRequestEventTargetP {
|
|
182
|
+
/** @internal */
|
|
183
|
+
constructor() {
|
|
184
|
+
if (new.target === XMLHttpRequestUploadP) {
|
|
185
|
+
throw new TypeError("Failed to construct 'XMLHttpRequestUpload': Illegal constructor");
|
|
186
|
+
}
|
|
187
|
+
super();
|
|
188
|
+
}
|
|
189
|
+
/** @internal */ toString() { return "[object XMLHttpRequestUpload]"; }
|
|
190
|
+
/** @internal */ get [Symbol.toStringTag]() { return "XMLHttpRequestUpload"; }
|
|
191
|
+
/** @internal */ get isPolyfill() { return { symbol: polyfill, hierarchy: ["XMLHttpRequestUpload", "XMLHttpRequestEventTarget", "EventTarget"] }; }
|
|
192
|
+
}
|
|
193
|
+
/** @internal */
|
|
194
|
+
function createXMLHttpRequestUpload() {
|
|
195
|
+
let upload = Object.create(XMLHttpRequestUploadP.prototype);
|
|
196
|
+
upload[state$2] = new EventTargetState(upload);
|
|
197
|
+
upload[state$1] = new XMLHttpRequestEventTargetState(upload);
|
|
198
|
+
return upload;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
202
|
+
const mp = { request: request };
|
|
203
|
+
const setRequest = (request) => { mp.request = request; };
|
|
204
|
+
/** @internal */ const state = Symbol( /* "XMLHttpRequestState" */);
|
|
205
|
+
class XMLHttpRequestImpl extends XMLHttpRequestEventTargetP {
|
|
206
|
+
static get UNSENT() { return 0; }
|
|
207
|
+
static get OPENED() { return 1; }
|
|
208
|
+
static get HEADERS_RECEIVED() { return 2; }
|
|
209
|
+
static get LOADING() { return 3; }
|
|
210
|
+
static get DONE() { return 4; }
|
|
211
|
+
constructor() {
|
|
212
|
+
super();
|
|
213
|
+
this[state] = new XMLHttpRequestState(this);
|
|
214
|
+
}
|
|
215
|
+
get UNSENT() { return 0; }
|
|
216
|
+
get OPENED() { return 1; }
|
|
217
|
+
get HEADERS_RECEIVED() { return 2; }
|
|
218
|
+
get LOADING() { return 3; }
|
|
219
|
+
get DONE() { return 4; }
|
|
220
|
+
get readyState() { return this[state].readyState; }
|
|
221
|
+
get response() { return this[state].response; }
|
|
222
|
+
get responseText() { return (!this.responseType || this.responseType === "text") ? this.response : ""; }
|
|
223
|
+
get responseType() { return this[state].responseType; }
|
|
224
|
+
set responseType(value) { this[state].responseType = normalizeResponseType(value); }
|
|
225
|
+
get responseURL() { return this[state].responseURL; }
|
|
226
|
+
get responseXML() { return null; }
|
|
227
|
+
get status() { return this[state].status; }
|
|
228
|
+
get statusText() {
|
|
229
|
+
if (this.readyState === 0 /* UNSENT */ || this.readyState === 1 /* OPENED */)
|
|
230
|
+
return "";
|
|
231
|
+
return this[state].statusText || statusTextMap(this.status);
|
|
232
|
+
}
|
|
233
|
+
get timeout() { return this[state].timeout; }
|
|
234
|
+
set timeout(value) { this[state].timeout = value > 0 ? value : 0; }
|
|
235
|
+
get upload() {
|
|
236
|
+
const s = this[state];
|
|
237
|
+
if (!s.upload) {
|
|
238
|
+
s.upload = createXMLHttpRequestUpload();
|
|
239
|
+
}
|
|
240
|
+
return s.upload;
|
|
241
|
+
}
|
|
242
|
+
get withCredentials() { return this[state].withCredentials; }
|
|
243
|
+
set withCredentials(value) { this[state].withCredentials = !!value; }
|
|
244
|
+
abort() {
|
|
245
|
+
clearRequest(this);
|
|
246
|
+
}
|
|
247
|
+
getAllResponseHeaders() {
|
|
248
|
+
const headers = this[state][_responseHeaders];
|
|
249
|
+
if (!headers)
|
|
250
|
+
return "";
|
|
251
|
+
let result = [];
|
|
252
|
+
headers.forEach((value, name) => { result.push(`${name}: ${value}\r\n`); });
|
|
253
|
+
return result.join("");
|
|
254
|
+
}
|
|
255
|
+
getResponseHeader(...args) {
|
|
256
|
+
const [name] = args;
|
|
257
|
+
checkArgsLength(args, 1, "XMLHttpRequest", "getResponseHeader");
|
|
258
|
+
if (!this[state][_responseHeaders])
|
|
259
|
+
return null;
|
|
260
|
+
return this[state][_responseHeaders].get(name);
|
|
261
|
+
}
|
|
262
|
+
open(...args) {
|
|
263
|
+
const [method, url, async = true, username = null, password = null] = args;
|
|
264
|
+
checkArgsLength(args, 2, "XMLHttpRequest", "open");
|
|
265
|
+
if (!async) {
|
|
266
|
+
console.warn("Synchronous XMLHttpRequest is not supported because of its detrimental effects to the end user's experience.");
|
|
267
|
+
}
|
|
268
|
+
const s = this[state];
|
|
269
|
+
clearRequest(this, false);
|
|
270
|
+
s[_method] = normalizeMethod(method);
|
|
271
|
+
s[_requestURL] = "" + url;
|
|
272
|
+
if (username !== null || password !== null) {
|
|
273
|
+
let _username = "" + (username !== null && username !== void 0 ? username : "");
|
|
274
|
+
let _password = "" + (password !== null && password !== void 0 ? password : "");
|
|
275
|
+
if (_username.length > 0 || _password.length > 0) {
|
|
276
|
+
let auth = `Basic ${Uint8Array_toBase64(encode(_username + ":" + _password))}`;
|
|
277
|
+
this.setRequestHeader("Authorization", auth);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
s[_inAfterOpenBeforeSend] = true;
|
|
281
|
+
setReadyStateAndNotify(this, 1 /* OPENED */);
|
|
282
|
+
}
|
|
283
|
+
overrideMimeType(...args) {
|
|
284
|
+
const [mime] = args;
|
|
285
|
+
checkArgsLength(args, 1, "XMLHttpRequest", "overrideMimeType");
|
|
286
|
+
if (this[state][_inAfterOpenBeforeSend]) {
|
|
287
|
+
console.error(`TypeError: Failed to execute 'overrideMimeType' on 'XMLHttpRequest': mimeType ('${mime}') not implemented.`);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
send(body) {
|
|
291
|
+
const s = this[state];
|
|
292
|
+
if (!s[_inAfterOpenBeforeSend] || s.readyState !== 1 /* OPENED */) {
|
|
293
|
+
throw new MPException("Failed to execute 'send' on 'XMLHttpRequest': The object's state must be OPENED.", "InvalidStateError");
|
|
294
|
+
}
|
|
295
|
+
s[_inAfterOpenBeforeSend] = false;
|
|
296
|
+
const allowsRequestBody = s[_method] !== "GET" && s[_method] !== "HEAD";
|
|
297
|
+
const processHeaders = allowsRequestBody && !s[_requestHeaders].has("Content-Type");
|
|
298
|
+
const processContentLength = allowsRequestBody && !!body;
|
|
299
|
+
let headers = () => { let dict = {}; s[_requestHeaders].forEach((value, name) => { dict[name] = value; }); return dict; };
|
|
300
|
+
let contentLength = () => 0;
|
|
301
|
+
const processHeadersFn = processHeaders ? (v) => { s[_requestHeaders].set("Content-Type", v); } : void 0;
|
|
302
|
+
const processContentLengthFn = processContentLength ? (v) => { contentLength = v; } : void 0;
|
|
303
|
+
let data = body;
|
|
304
|
+
try {
|
|
305
|
+
data = convert(body, false, processHeadersFn, processContentLengthFn);
|
|
306
|
+
}
|
|
307
|
+
catch (e) {
|
|
308
|
+
console.warn(e);
|
|
309
|
+
}
|
|
310
|
+
let options = {
|
|
311
|
+
url: s[_requestURL],
|
|
312
|
+
method: s[_method],
|
|
313
|
+
header: headers(),
|
|
314
|
+
data: data !== "" ? data : void 0,
|
|
315
|
+
dataType: s.responseType === "json" ? "json" : normalizeDataType(s.responseType),
|
|
316
|
+
responseType: normalizeDataType(s.responseType),
|
|
317
|
+
withCredentials: s.withCredentials,
|
|
318
|
+
success: requestSuccess.bind(this),
|
|
319
|
+
fail: requestFail.bind(this),
|
|
320
|
+
complete: requestComplete.bind(this),
|
|
321
|
+
};
|
|
322
|
+
// Alipay Mini Program
|
|
323
|
+
options.headers = options.header;
|
|
324
|
+
s[_requestTask] = mp.request(options);
|
|
325
|
+
emitProcessEvent(this, "loadstart");
|
|
326
|
+
if (processContentLength && s.upload) {
|
|
327
|
+
emitProcessEvent(this.upload, "loadstart", 0, contentLength);
|
|
328
|
+
}
|
|
329
|
+
setTimeout(() => {
|
|
330
|
+
if (s.upload) {
|
|
331
|
+
const _aborted = s[_inAfterOpenBeforeSend] || s.readyState !== 1 /* OPENED */;
|
|
332
|
+
const _contentLength = _aborted ? 0 : contentLength;
|
|
333
|
+
if (_aborted) {
|
|
334
|
+
emitProcessEvent(this.upload, "abort");
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
if (processContentLength) {
|
|
338
|
+
emitProcessEvent(this.upload, "load", _contentLength, _contentLength);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
if (_aborted || processContentLength) {
|
|
342
|
+
emitProcessEvent(this.upload, "loadend", _contentLength, _contentLength);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
checkRequestTimeout(this);
|
|
347
|
+
}
|
|
348
|
+
setRequestHeader(...args) {
|
|
349
|
+
const [name, value] = args;
|
|
350
|
+
checkArgsLength(args, 2, "XMLHttpRequest", "setRequestHeader");
|
|
351
|
+
const s = this[state];
|
|
352
|
+
if (!s[_inAfterOpenBeforeSend] || s.readyState !== 1 /* OPENED */) {
|
|
353
|
+
throw new MPException("Failed to execute 'setRequestHeader' on 'XMLHttpRequest': The object's state must be OPENED.", "InvalidStateError");
|
|
354
|
+
}
|
|
355
|
+
let _name = "" + name;
|
|
356
|
+
let _value = "" + value;
|
|
357
|
+
try {
|
|
358
|
+
s[_requestHeaders].append(_name, _value);
|
|
359
|
+
}
|
|
360
|
+
catch (e) {
|
|
361
|
+
throw new SyntaxError(`Failed to execute 'setRequestHeader' on 'XMLHttpRequest': '${_name}' is not a valid HTTP header field name.`);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
get onreadystatechange() { return this[state].onreadystatechange; }
|
|
365
|
+
set onreadystatechange(value) {
|
|
366
|
+
this[state].onreadystatechange = value;
|
|
367
|
+
attachFn(this, "readystatechange", value, this[state][_handlers].onreadystatechange);
|
|
368
|
+
}
|
|
369
|
+
/** @internal */ toString() { return "[object XMLHttpRequest]"; }
|
|
370
|
+
/** @internal */ get [Symbol.toStringTag]() { return "XMLHttpRequest"; }
|
|
371
|
+
/** @internal */ get isPolyfill() { return { symbol: polyfill, hierarchy: ["XMLHttpRequest", "XMLHttpRequestEventTarget", "EventTarget"] }; }
|
|
372
|
+
}
|
|
373
|
+
/** @internal */ const _handlers = Symbol();
|
|
374
|
+
/** @internal */ const _inAfterOpenBeforeSend = Symbol();
|
|
375
|
+
/** @internal */ const _resetPending = Symbol();
|
|
376
|
+
/** @internal */ const _timeoutId = Symbol();
|
|
377
|
+
/** @internal */ const _requestURL = Symbol();
|
|
378
|
+
/** @internal */ const _method = Symbol();
|
|
379
|
+
/** @internal */ const _requestHeaders = Symbol();
|
|
380
|
+
/** @internal */ const _responseHeaders = Symbol();
|
|
381
|
+
/** @internal */ const _responseContentLength = Symbol();
|
|
382
|
+
/** @internal */ const _requestTask = Symbol();
|
|
383
|
+
/** @internal */
|
|
384
|
+
class XMLHttpRequestState {
|
|
385
|
+
constructor(target) {
|
|
386
|
+
this.readyState = 0 /* UNSENT */;
|
|
387
|
+
this.response = "";
|
|
388
|
+
this.responseType = "";
|
|
389
|
+
this.responseURL = "";
|
|
390
|
+
this.status = 0;
|
|
391
|
+
this.statusText = "";
|
|
392
|
+
this.timeout = 0;
|
|
393
|
+
this.withCredentials = false;
|
|
394
|
+
this[_a] = getHandlers(this);
|
|
395
|
+
this.onreadystatechange = null;
|
|
396
|
+
this[_b] = false;
|
|
397
|
+
this[_c] = false;
|
|
398
|
+
this[_d] = 0;
|
|
399
|
+
this[_e] = "";
|
|
400
|
+
this[_f] = "GET";
|
|
401
|
+
this[_g] = new HeadersP();
|
|
402
|
+
this[_h] = null;
|
|
403
|
+
this[_j] = () => 0;
|
|
404
|
+
this[_k] = null;
|
|
405
|
+
this.target = target;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
_a = _handlers, _b = _inAfterOpenBeforeSend, _c = _resetPending, _d = _timeoutId, _e = _requestURL, _f = _method, _g = _requestHeaders, _h = _responseHeaders, _j = _responseContentLength, _k = _requestTask;
|
|
409
|
+
function getHandlers(s) {
|
|
410
|
+
return {
|
|
411
|
+
onreadystatechange: (ev) => { executeFn(s.target, s.onreadystatechange, ev); },
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
function normalizeDataType(responseType) {
|
|
415
|
+
return (responseType === "blob" || responseType === "arraybuffer") ? "arraybuffer" : "text";
|
|
416
|
+
}
|
|
417
|
+
function requestSuccess(res) {
|
|
418
|
+
const s = this[state];
|
|
419
|
+
s.responseURL = s[_requestURL];
|
|
420
|
+
s.status = "statusCode" in res ? res.statusCode : "status" in res ? res.status : 200;
|
|
421
|
+
s[_responseHeaders] = new HeadersP(("header" in res ? res.header : "headers" in res ? res.headers : {}));
|
|
422
|
+
let lengthStr = s[_responseHeaders].get("Content-Length");
|
|
423
|
+
s[_responseContentLength] = () => { return lengthStr ? parseInt(lengthStr) : 0; };
|
|
424
|
+
if (s.readyState === 1 /* OPENED */) {
|
|
425
|
+
setReadyStateAndNotify(this, 2 /* HEADERS_RECEIVED */);
|
|
426
|
+
setReadyStateAndNotify(this, 3 /* LOADING */);
|
|
427
|
+
setTimeout(() => {
|
|
428
|
+
if (!s[_inAfterOpenBeforeSend]) {
|
|
429
|
+
let l = s[_responseContentLength];
|
|
430
|
+
try {
|
|
431
|
+
s.response = convertBack(s.responseType, res.data);
|
|
432
|
+
emitProcessEvent(this, "load", l, l);
|
|
433
|
+
}
|
|
434
|
+
catch (e) {
|
|
435
|
+
console.error(e);
|
|
436
|
+
emitProcessEvent(this, "error");
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
function requestFail(err) {
|
|
443
|
+
// Alipay Mini Program
|
|
444
|
+
// error: 14 --- JSON parse data error
|
|
445
|
+
// error: 19 --- http status error
|
|
446
|
+
// At this point, the error data object will contain three pieces of information
|
|
447
|
+
// returned from the server: status, headers, and data.
|
|
448
|
+
// In the browser's XMLHttpRequest, these two errors (Error 14 and Error 19)
|
|
449
|
+
// differ from those in Alipay Mini Programs and should instead return normally.
|
|
450
|
+
// Therefore, this scenario is also handled here as a successful request response.
|
|
451
|
+
if (("header" in err && "statusCode" in err) || ("headers" in err && "status" in err)) {
|
|
452
|
+
requestSuccess.call(this, {
|
|
453
|
+
statusCode: "statusCode" in err ? err.statusCode : err.status || 0,
|
|
454
|
+
header: "header" in err ? err.header : err.headers || {},
|
|
455
|
+
data: "data" in err ? err.data || "" : "",
|
|
456
|
+
});
|
|
457
|
+
return;
|
|
458
|
+
}
|
|
459
|
+
const s = this[state];
|
|
460
|
+
s.status = 0;
|
|
461
|
+
s.statusText = "errMsg" in err ? err.errMsg : "errorMessage" in err ? err.errorMessage : "";
|
|
462
|
+
if (!s[_inAfterOpenBeforeSend] && s.readyState !== 0 /* UNSENT */ && s.readyState !== 4 /* DONE */) {
|
|
463
|
+
emitProcessEvent(this, "error");
|
|
464
|
+
resetRequestTimeout(this);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
function requestComplete() {
|
|
468
|
+
const s = this[state];
|
|
469
|
+
s[_requestTask] = null;
|
|
470
|
+
if (!s[_inAfterOpenBeforeSend] && (s.readyState === 1 /* OPENED */ || s.readyState === 3 /* LOADING */)) {
|
|
471
|
+
setReadyStateAndNotify(this, 4 /* DONE */);
|
|
472
|
+
}
|
|
473
|
+
setTimeout(() => {
|
|
474
|
+
if (!s[_inAfterOpenBeforeSend]) {
|
|
475
|
+
let l = s[_responseContentLength];
|
|
476
|
+
emitProcessEvent(this, "loadend", l, l);
|
|
477
|
+
}
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
// Alipay Mini Program
|
|
481
|
+
function safeAbort(task) {
|
|
482
|
+
if ("abort" in task && typeof task.abort === "function") {
|
|
483
|
+
task.abort();
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
function clearRequest(xhr, delay = true) {
|
|
487
|
+
const s = xhr[state];
|
|
488
|
+
const timerFn = delay ? setTimeout : (f) => { f(); };
|
|
489
|
+
s[_resetPending] = true;
|
|
490
|
+
if (s[_requestTask] && s.readyState !== 4 /* DONE */) {
|
|
491
|
+
if (delay) {
|
|
492
|
+
setReadyStateAndNotify(xhr, 4 /* DONE */);
|
|
493
|
+
}
|
|
494
|
+
timerFn(() => {
|
|
495
|
+
const requestTask = s[_requestTask];
|
|
496
|
+
if (requestTask) {
|
|
497
|
+
safeAbort(requestTask);
|
|
498
|
+
}
|
|
499
|
+
if (delay) {
|
|
500
|
+
emitProcessEvent(xhr, "abort");
|
|
501
|
+
}
|
|
502
|
+
if (delay && !requestTask) {
|
|
503
|
+
emitProcessEvent(xhr, "loadend");
|
|
504
|
+
}
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
timerFn(() => {
|
|
508
|
+
if (s[_resetPending]) {
|
|
509
|
+
if (delay) {
|
|
510
|
+
s.readyState = 0 /* UNSENT */;
|
|
511
|
+
}
|
|
512
|
+
resetXHR(xhr);
|
|
513
|
+
}
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
function checkRequestTimeout(xhr) {
|
|
517
|
+
const s = xhr[state];
|
|
518
|
+
if (s.timeout) {
|
|
519
|
+
s[_timeoutId] = setTimeout(() => {
|
|
520
|
+
if (!s.status && s.readyState !== 4 /* DONE */) {
|
|
521
|
+
if (s[_requestTask])
|
|
522
|
+
safeAbort(s[_requestTask]);
|
|
523
|
+
setReadyStateAndNotify(xhr, 4 /* DONE */);
|
|
524
|
+
emitProcessEvent(xhr, "timeout");
|
|
525
|
+
}
|
|
526
|
+
}, s.timeout);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
function resetXHR(xhr) {
|
|
530
|
+
const s = xhr[state];
|
|
531
|
+
s[_resetPending] = false;
|
|
532
|
+
resetRequestTimeout(xhr);
|
|
533
|
+
s.response = "";
|
|
534
|
+
s.responseURL = "";
|
|
535
|
+
s.status = 0;
|
|
536
|
+
s.statusText = "";
|
|
537
|
+
s[_requestHeaders] = new HeadersP();
|
|
538
|
+
s[_responseHeaders] = null;
|
|
539
|
+
s[_responseContentLength] = () => 0;
|
|
540
|
+
}
|
|
541
|
+
function resetRequestTimeout(xhr) {
|
|
542
|
+
const s = xhr[state];
|
|
543
|
+
if (s[_timeoutId]) {
|
|
544
|
+
clearTimeout(s[_timeoutId]);
|
|
545
|
+
s[_timeoutId] = 0;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
function setReadyStateAndNotify(xhr, value) {
|
|
549
|
+
const s = xhr[state];
|
|
550
|
+
let hasChanged = value !== s.readyState;
|
|
551
|
+
s.readyState = value;
|
|
552
|
+
if (hasChanged) {
|
|
553
|
+
let evt = createInnerEvent(xhr, "readystatechange");
|
|
554
|
+
EventTarget_fire(xhr, evt);
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
const XMLHttpRequestE = (typeof XMLHttpRequest !== "undefined" && XMLHttpRequest) || XMLHttpRequestImpl;
|
|
558
|
+
|
|
559
|
+
export { XMLHttpRequestE as XMLHttpRequest, XMLHttpRequestImpl, setRequest };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Blob_toUint8Array, decode, encode, BlobP } from './BlobP.js';
|
|
2
|
+
import { FormData_toBlob } from './FormDataP.js';
|
|
3
|
+
import { isObjectType, isPolyfillType, isArrayBuffer } from './isPolyfill.js';
|
|
4
|
+
import './TextEncoderP.js';
|
|
5
|
+
import './TextDecoderP.js';
|
|
6
|
+
import './FileP.js';
|
|
7
|
+
|
|
8
|
+
/** @internal */
|
|
9
|
+
function convert(body, cloneArrayBuffer = true, setContentType, setContentLength) {
|
|
10
|
+
let result;
|
|
11
|
+
if (typeof body === "string") {
|
|
12
|
+
result = body;
|
|
13
|
+
if (setContentType) {
|
|
14
|
+
setContentType("text/plain;charset=UTF-8");
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
else if (isObjectType("URLSearchParams", body) || isPolyfillType("URLSearchParams", body)) {
|
|
18
|
+
result = body.toString();
|
|
19
|
+
if (setContentType) {
|
|
20
|
+
setContentType("application/x-www-form-urlencoded;charset=UTF-8");
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
else if (isArrayBuffer(body)) {
|
|
24
|
+
result = cloneArrayBuffer ? body.slice(0) : body;
|
|
25
|
+
}
|
|
26
|
+
else if (ArrayBuffer.isView(body)) {
|
|
27
|
+
result = body.buffer.slice(body.byteOffset, body.byteOffset + body.byteLength);
|
|
28
|
+
}
|
|
29
|
+
else if (isPolyfillType("Blob", body)) {
|
|
30
|
+
result = Blob_toUint8Array(body).buffer.slice(0);
|
|
31
|
+
if (setContentType && body.type) {
|
|
32
|
+
setContentType(body.type);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else if (isPolyfillType("FormData", body)) {
|
|
36
|
+
let blob = FormData_toBlob(body);
|
|
37
|
+
result = Blob_toUint8Array(blob).buffer;
|
|
38
|
+
if (setContentType) {
|
|
39
|
+
setContentType(blob.type);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else if (!body) {
|
|
43
|
+
result = "";
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
result = "" + body;
|
|
47
|
+
}
|
|
48
|
+
if (setContentLength) {
|
|
49
|
+
let calculated = false, contentLength = 0;
|
|
50
|
+
setContentLength(() => {
|
|
51
|
+
if (!calculated) {
|
|
52
|
+
calculated = true;
|
|
53
|
+
contentLength = (typeof result === "string" ? encode(result).buffer : result).byteLength;
|
|
54
|
+
}
|
|
55
|
+
return contentLength;
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
/** @internal */
|
|
61
|
+
function convertBack(type, data) {
|
|
62
|
+
let temp = !!data ? (typeof data !== "string" && !isArrayBuffer(data) ? JSON.stringify(data) : data) : "";
|
|
63
|
+
if (!type || type === "text") {
|
|
64
|
+
return typeof temp === "string" ? temp : decode(temp);
|
|
65
|
+
}
|
|
66
|
+
else if (type === "json") {
|
|
67
|
+
return JSON.parse(typeof temp === "string" ? temp : decode(temp));
|
|
68
|
+
}
|
|
69
|
+
else if (type === "arraybuffer") {
|
|
70
|
+
return isArrayBuffer(temp) ? temp.slice(0) : encode(temp).buffer;
|
|
71
|
+
}
|
|
72
|
+
else if (type === "blob") {
|
|
73
|
+
return new BlobP([temp]);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
return temp;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export { convert, convertBack };
|