UNPKG

aurelia-http-client

Version:

A simple, restful, message-based wrapper around XMLHttpRequest.

92 lines (78 loc) 2.38 kB
import {DOM, PLATFORM} from 'aurelia-pal'; import {RequestMessage} from './request-message'; import {RequestMessageProcessor} from './request-message-processor'; import { timeoutTransformer, callbackParameterNameTransformer } from './xhr-transformers'; /** * Represents an JSONP request message. */ export class JSONPRequestMessage extends RequestMessage { /** * Creates an instance of JSONPRequestMessage. * @param url The url to submit the request to. * @param callbackParameterName The name of the callback parameter that the api expects. */ constructor(url: string, callbackParameterName: string) { super('JSONP', url); this.responseType = 'jsonp'; this.callbackParameterName = callbackParameterName; } } class JSONPXHR { open(method: string, url: string): void { this.method = method; this.url = url; this.callbackName = 'jsonp_callback_' + Math.round(100000 * Math.random()); } send(): void { let url = this.url + (this.url.indexOf('?') >= 0 ? '&' : '?') + encodeURIComponent(this.callbackParameterName) + '=' + this.callbackName; let script = DOM.createElement('script'); script.src = url; script.onerror = (e) => { cleanUp(); this.status = 0; this.onerror(new Error('error')); }; let cleanUp = () => { delete PLATFORM.global[this.callbackName]; DOM.removeNode(script); }; PLATFORM.global[this.callbackName] = (data) => { cleanUp(); if (this.status === undefined) { this.status = 200; this.statusText = 'OK'; this.response = data; this.onload(this); } }; DOM.appendNode(script); if (this.timeout !== undefined) { setTimeout(() => { if (this.status === undefined) { this.status = 0; this.ontimeout(new Error('timeout')); } }, this.timeout); } } abort() : void { if (this.status === undefined) { this.status = 0; this.onabort(new Error('abort')); } } setRequestHeader() {} } /** * Creates a RequestMessageProcessor for handling JSONP request messages. * @return A processor instance for JSONP request messages. */ export function createJSONPRequestMessageProcessor(): RequestMessageProcessor { return new RequestMessageProcessor(JSONPXHR, [ timeoutTransformer, callbackParameterNameTransformer ]); }