UNPKG

@angular/http

Version:
146 lines 6.11 kB
/** * @license * Copyright Google Inc. All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs/Observable'; import { ResponseOptions } from '../base_response_options'; import { ReadyState, RequestMethod, ResponseType } from '../enums'; import { StringWrapper, isPresent } from '../facade/lang'; import { ConnectionBackend } from '../interfaces'; import { Response } from '../static_response'; import { BrowserJsonp } from './browser_jsonp'; var JSONP_ERR_NO_CALLBACK = 'JSONP injected script did not invoke callback.'; var JSONP_ERR_WRONG_METHOD = 'JSONP requests must use GET request method.'; /** * Abstract base class for an in-flight JSONP request. * * @experimental */ export var JSONPConnection = (function () { function JSONPConnection() { } return JSONPConnection; }()); export var JSONPConnection_ = (function (_super) { __extends(JSONPConnection_, _super); function JSONPConnection_(req, _dom, baseResponseOptions) { var _this = this; _super.call(this); this._dom = _dom; this.baseResponseOptions = baseResponseOptions; this._finished = false; if (req.method !== RequestMethod.Get) { throw new TypeError(JSONP_ERR_WRONG_METHOD); } this.request = req; this.response = new Observable(function (responseObserver) { _this.readyState = ReadyState.Loading; var id = _this._id = _dom.nextRequestID(); _dom.exposeConnection(id, _this); // Workaround Dart // url = url.replace(/=JSONP_CALLBACK(&|$)/, `generated method`); var callback = _dom.requestCallback(_this._id); var 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); } var script = _this._script = _dom.build(url); var onLoad = function (event) { if (_this.readyState === ReadyState.Cancelled) return; _this.readyState = ReadyState.Done; _dom.cleanup(script); if (!_this._finished) { var responseOptions_1 = new ResponseOptions({ body: JSONP_ERR_NO_CALLBACK, type: ResponseType.Error, url: url }); if (isPresent(baseResponseOptions)) { responseOptions_1 = baseResponseOptions.merge(responseOptions_1); } responseObserver.error(new Response(responseOptions_1)); return; } var responseOptions = new ResponseOptions({ body: _this._responseData, url: url }); if (isPresent(_this.baseResponseOptions)) { responseOptions = _this.baseResponseOptions.merge(responseOptions); } responseObserver.next(new Response(responseOptions)); responseObserver.complete(); }; var onError = function (error) { if (_this.readyState === ReadyState.Cancelled) return; _this.readyState = ReadyState.Done; _dom.cleanup(script); var 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 function () { _this.readyState = ReadyState.Cancelled; script.removeEventListener('load', onLoad); script.removeEventListener('error', onError); if (isPresent(script)) { _this._dom.cleanup(script); } }; }); } JSONPConnection_.prototype.finished = function (data) { // Don't leak connections this._finished = true; this._dom.removeConnection(this._id); if (this.readyState === ReadyState.Cancelled) return; this._responseData = data; }; return JSONPConnection_; }(JSONPConnection)); /** * A {@link ConnectionBackend} that uses the JSONP strategy of making requests. * * @experimental */ export var JSONPBackend = (function (_super) { __extends(JSONPBackend, _super); function JSONPBackend() { _super.apply(this, arguments); } return JSONPBackend; }(ConnectionBackend)); export var JSONPBackend_ = (function (_super) { __extends(JSONPBackend_, _super); function JSONPBackend_(_browserJSONP, _baseResponseOptions) { _super.call(this); this._browserJSONP = _browserJSONP; this._baseResponseOptions = _baseResponseOptions; } JSONPBackend_.prototype.createConnection = function (request) { return new JSONPConnection_(request, this._browserJSONP, this._baseResponseOptions); }; JSONPBackend_.decorators = [ { type: Injectable }, ]; /** @nocollapse */ JSONPBackend_.ctorParameters = [ { type: BrowserJsonp, }, { type: ResponseOptions, }, ]; return JSONPBackend_; }(JSONPBackend)); //# sourceMappingURL=jsonp_backend.js.map