UNPKG

angular2

Version:

Angular 2 - a web framework for modern web apps

123 lines (122 loc) 5.86 kB
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; import { ConnectionBackend } from '../interfaces'; import { ReadyState, RequestMethod, ResponseType } from '../enums'; import { Response } from '../static_response'; import { ResponseOptions } from '../base_response_options'; import { Injectable } from 'angular2/core'; import { BrowserJsonp } from './browser_jsonp'; import { makeTypeError } from 'angular2/src/facade/exceptions'; import { StringWrapper, isPresent } from 'angular2/src/facade/lang'; import { Observable } from 'rxjs/Observable'; const JSONP_ERR_NO_CALLBACK = 'JSONP injected script did not invoke callback.'; const JSONP_ERR_WRONG_METHOD = 'JSONP requests must use GET request method.'; /** * Abstract base class for an in-flight JSONP request. */ export class JSONPConnection { } export class JSONPConnection_ extends JSONPConnection { constructor(req, _dom, baseResponseOptions) { super(); this._dom = _dom; this.baseResponseOptions = baseResponseOptions; this._finished = false; if (req.method !== RequestMethod.Get) { throw makeTypeError(JSONP_ERR_WRONG_METHOD); } this.request = req; this.response = new Observable((responseObserver) => { this.readyState = ReadyState.Loading; let id = this._id = _dom.nextRequestID(); _dom.exposeConnection(id, this); // Workaround Dart // url = url.replace(/=JSONP_CALLBACK(&|$)/, `generated method`); let callback = _dom.requestCallback(this._id); let url = req.url; if (url.indexOf('=JSONP_CALLBACK&') > -1) { url = StringWrapper.replace(url, '=JSONP_CALLBACK&', `=${callback}&`); } else if (url.lastIndexOf('=JSONP_CALLBACK') === url.length - '=JSONP_CALLBACK'.length) { url = url.substring(0, url.length - '=JSONP_CALLBACK'.length) + `=${callback}`; } let script = this._script = _dom.build(url); let onLoad = (event) => { if (this.readyState === ReadyState.Cancelled) return; this.readyState = ReadyState.Done; _dom.cleanup(script); if (!this._finished) { let responseOptions = new ResponseOptions({ body: JSONP_ERR_NO_CALLBACK, type: ResponseType.Error, url }); if (isPresent(baseResponseOptions)) { responseOptions = baseResponseOptions.merge(responseOptions); } responseObserver.error(new Response(responseOptions)); return; } let responseOptions = new ResponseOptions({ body: this._responseData, url }); if (isPresent(this.baseResponseOptions)) { responseOptions = this.baseResponseOptions.merge(responseOptions); } responseObserver.next(new Response(responseOptions)); responseObserver.complete(); }; let onError = (error) => { if (this.readyState === ReadyState.Cancelled) return; this.readyState = ReadyState.Done; _dom.cleanup(script); let responseOptions = new ResponseOptions({ body: error.message, type: ResponseType.Error }); if (isPresent(baseResponseOptions)) { responseOptions = baseResponseOptions.merge(responseOptions); } responseObserver.error(new Response(responseOptions)); }; script.addEventListener('load', onLoad); script.addEventListener('error', onError); _dom.send(script); return () => { this.readyState = ReadyState.Cancelled; script.removeEventListener('load', onLoad); script.removeEventListener('error', onError); if (isPresent(script)) { this._dom.cleanup(script); } }; }); } finished(data) { // Don't leak connections this._finished = true; this._dom.removeConnection(this._id); if (this.readyState === ReadyState.Cancelled) return; this._responseData = data; } } /** * A {@link ConnectionBackend} that uses the JSONP strategy of making requests. */ export class JSONPBackend extends ConnectionBackend { } export let JSONPBackend_ = class JSONPBackend_ extends JSONPBackend { constructor(_browserJSONP, _baseResponseOptions) { super(); this._browserJSONP = _browserJSONP; this._baseResponseOptions = _baseResponseOptions; } createConnection(request) { return new JSONPConnection_(request, this._browserJSONP, this._baseResponseOptions); } }; JSONPBackend_ = __decorate([ Injectable(), __metadata('design:paramtypes', [BrowserJsonp, ResponseOptions]) ], JSONPBackend_);