angular2-platform-node
Version:
Universal (isomorphic) javascript support for Angular2
381 lines • 16.4 kB
JavaScript
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 __());
};
var core_1 = require('@angular/core');
var http_1 = require('@angular/http');
var Observable_1 = require('rxjs/Observable');
require('rxjs/add/operator/map');
var http = require('http');
var https = require('https');
var url = require('url');
var tokens_1 = require('./tokens');
var helper_1 = require('./helper');
var JSONP_ERR_WRONG_METHOD = 'JSONP requests must use GET request method.';
var PreloadHttp = (function (_super) {
__extends(PreloadHttp, _super);
function PreloadHttp(_backend, _defaultOptions) {
_super.call(this, _backend, _defaultOptions);
this._backend = _backend;
this._defaultOptions = _defaultOptions;
this._async = 0;
}
PreloadHttp.prototype.preload = function (_url, factory) {
var _this = this;
var obs = new core_1.EventEmitter(false);
this._async += 1;
var request = factory();
request
.subscribe({
next: function (response) {
obs.next(response);
},
error: function (e) {
obs.error(e);
_this._async -= 1;
},
complete: function () {
obs.complete();
_this._async -= 1;
}
});
return obs;
};
PreloadHttp.prototype.request = function (url, options) {
var _this = this;
return this.preload(url, function () { return _super.prototype.request.call(_this, url, options); });
};
PreloadHttp.prototype.get = function (url, options) {
var _this = this;
return this.preload(url, function () { return _super.prototype.get.call(_this, url, options); });
};
PreloadHttp.prototype.post = function (url, body, options) {
var _this = this;
return this.preload(url, function () { return _super.prototype.post.call(_this, url, body, options); });
};
PreloadHttp.prototype.put = function (url, body, options) {
var _this = this;
return this.preload(url, function () { return _super.prototype.put.call(_this, url, body, options); });
};
PreloadHttp.prototype.delete = function (url, options) {
var _this = this;
return this.preload(url, function () { return _super.prototype.delete.call(_this, url, options); });
};
PreloadHttp.prototype.patch = function (url, body, options) {
var _this = this;
return this.preload(url, function () { return _super.prototype.patch.call(_this, url, body, options); });
};
PreloadHttp.prototype.head = function (url, options) {
var _this = this;
return this.preload(url, function () { return _super.prototype.head.call(_this, url, options); });
};
return PreloadHttp;
}(http_1.Http));
exports.PreloadHttp = PreloadHttp;
var NodeConnection = (function () {
function NodeConnection(req, baseResponseOptions, originUrl, baseUrl) {
if (originUrl === void 0) { originUrl = ''; }
this.setDetectedContentType = http_1.XHRConnection.prototype.setDetectedContentType;
this.request = req;
baseUrl = baseUrl || '/';
if (originUrl === null) {
throw new Error('ERROR: Please move ORIGIN_URL to platformProviders');
}
var _reqInfo = url.parse(url.resolve(url.resolve(originUrl, baseUrl), req.url));
_reqInfo.method = http_1.RequestMethod[req.method].toUpperCase();
if (helper_1.isPresent(req.headers)) {
_reqInfo.headers = {};
req.headers.forEach(function (values, name) { return _reqInfo.headers[name] = values.join(','); });
}
_reqInfo.headers = _reqInfo.headers || {};
_reqInfo.headers['user-agent'] = _reqInfo.headers['user-agent'] || 'Angular 2 Universal';
this.response = new Observable_1.Observable(function (responseObserver) {
var nodeReq;
var xhrHttp = http;
if (_reqInfo.protocol === 'https:') {
xhrHttp = https;
}
nodeReq = xhrHttp.request(_reqInfo, function (res) {
var body = '';
res.on('data', function (chunk) { return body += chunk; });
var status = res.statusCode;
var headers = new http_1.Headers(res.headers);
var url = res.url;
res.on('end', function () {
var responseOptions = new http_1.ResponseOptions({ body: body, status: status, headers: headers, url: url });
var response = new http_1.Response(responseOptions);
if (helper_1.isSuccess(status)) {
responseObserver.next(response);
responseObserver.complete();
return;
}
responseObserver.error(response);
});
});
var onError = function (err) {
var responseOptions = new http_1.ResponseOptions({ body: err, type: http_1.ResponseType.Error });
if (helper_1.isPresent(baseResponseOptions)) {
responseOptions = baseResponseOptions.merge(responseOptions);
}
responseObserver.error(new http_1.Response(responseOptions));
};
nodeReq.on('error', onError);
nodeReq.write(req.text());
nodeReq.end();
return function () {
nodeReq.removeListener('error', onError);
nodeReq.abort();
};
});
}
NodeConnection.decorators = [
{ type: core_1.Injectable },
];
NodeConnection.ctorParameters = [
{ type: http_1.Request, },
{ type: http_1.ResponseOptions, },
{ type: undefined, decorators: [{ type: core_1.Inject, args: [tokens_1.ORIGIN_URL,] },] },
{ type: undefined, decorators: [{ type: core_1.Optional }, { type: core_1.Inject, args: [tokens_1.APP_BASE_HREF,] },] },
];
return NodeConnection;
}());
exports.NodeConnection = NodeConnection;
var NodeBackend = (function (_super) {
__extends(NodeBackend, _super);
function NodeBackend(baseResponseOptions, _browserXHR, _xsrfStrategy, _ngZone, _baseUrl, _originUrl) {
_super.call(this, _browserXHR, baseResponseOptions, _xsrfStrategy);
this.baseResponseOptions = baseResponseOptions;
this._baseUrl = _baseUrl;
this._originUrl = _originUrl;
}
NodeBackend.prototype.createConnection = function (request) {
return new NodeConnection(request, this.baseResponseOptions, this._baseUrl, this._originUrl);
};
NodeBackend.decorators = [
{ type: core_1.Injectable },
];
NodeBackend.ctorParameters = [
{ type: http_1.ResponseOptions, },
{ type: http_1.BrowserXhr, },
{ type: http_1.XSRFStrategy, },
{ type: core_1.NgZone, },
{ type: undefined, decorators: [{ type: core_1.Inject, args: [tokens_1.APP_BASE_HREF,] },] },
{ type: undefined, decorators: [{ type: core_1.Inject, args: [tokens_1.ORIGIN_URL,] },] },
];
return NodeBackend;
}(http_1.XHRBackend));
exports.NodeBackend = NodeBackend;
var NodeJSONPConnection = (function () {
function NodeJSONPConnection(req, baseResponseOptions, ngZone, originUrl, baseUrl) {
if (originUrl === void 0) { originUrl = ''; }
if (req.method !== http_1.RequestMethod.Get) {
throw new TypeError(JSONP_ERR_WRONG_METHOD);
}
this.request = req;
baseUrl = baseUrl || '/';
if (originUrl === null) {
throw new Error('ERROR: Please move ORIGIN_URL to platformProviders');
}
var _reqInfo = url.parse(url.resolve(url.resolve(originUrl, baseUrl), req.url));
_reqInfo.method = http_1.RequestMethod[req.method].toUpperCase();
if (helper_1.isPresent(req.headers)) {
_reqInfo.headers = {};
req.headers.forEach(function (values, name) { return _reqInfo.headers[name] = values.join(','); });
}
_reqInfo.headers = _reqInfo.headers || {};
_reqInfo.headers['user-agent'] = _reqInfo.headers['user-agent'] || 'Angular 2 Universal';
this.response = new Observable_1.Observable(function (responseObserver) {
var nodeReq;
var xhrHttp = http;
function DONE(response) {
responseObserver.next(response);
responseObserver.complete();
}
var __done = Zone.current.wrap(DONE, 'jsonp');
if (_reqInfo.protocol === 'https:') {
xhrHttp = https;
}
nodeReq = xhrHttp.request(_reqInfo, function (res) {
var body = '';
res.on('data', function (chunk) { return body += chunk; });
var status = res.statusCode;
var headers = new http_1.Headers(res.headers);
var url = res.url;
res.on('end', function () {
var responseJson;
try {
if (body.indexOf('JSONP_CALLBACK') === -1) {
throw new Error('Http request ' + req.url + ' did not return the response with JSONP_CALLBACK()');
}
var responseFactory = new Function('JSONP_CALLBACK', body);
responseFactory(function (json) {
responseJson = json;
});
}
catch (e) {
console.log('JSONP Error:', e);
return onError(e);
}
var responseOptions = new http_1.ResponseOptions({ body: responseJson, status: status, headers: headers, url: url });
var response = new http_1.Response(responseOptions);
if (helper_1.isSuccess(status)) {
__done(response);
return;
}
ngZone.run(function () {
responseObserver.error(response);
});
});
});
function onError(err) {
var responseOptions = new http_1.ResponseOptions({ body: err, type: http_1.ResponseType.Error });
if (helper_1.isPresent(baseResponseOptions)) {
responseOptions = baseResponseOptions.merge(responseOptions);
}
responseObserver.error(new http_1.Response(responseOptions));
}
;
nodeReq.on('error', onError);
nodeReq.end();
return function () {
nodeReq.removeListener('error', onError);
nodeReq.abort();
};
});
}
NodeJSONPConnection.ctorParameters = [
{ type: http_1.Request, },
{ type: http_1.ResponseOptions, },
{ type: core_1.NgZone, },
{ type: undefined, decorators: [{ type: core_1.Optional }, { type: core_1.Inject, args: [tokens_1.ORIGIN_URL,] },] },
{ type: undefined, decorators: [{ type: core_1.Optional }, { type: core_1.Inject, args: [tokens_1.APP_BASE_HREF,] },] },
];
return NodeJSONPConnection;
}());
exports.NodeJSONPConnection = NodeJSONPConnection;
var NodeJsonpBackend = (function (_super) {
__extends(NodeJsonpBackend, _super);
function NodeJsonpBackend() {
_super.apply(this, arguments);
}
return NodeJsonpBackend;
}(http_1.ConnectionBackend));
exports.NodeJsonpBackend = NodeJsonpBackend;
var NodeJsonpBackend_ = (function (_super) {
__extends(NodeJsonpBackend_, _super);
function NodeJsonpBackend_(_baseResponseOptions, _ngZone, _baseUrl, _originUrl) {
_super.call(this);
this._baseResponseOptions = _baseResponseOptions;
this._ngZone = _ngZone;
this._baseUrl = _baseUrl;
this._originUrl = _originUrl;
}
NodeJsonpBackend_.prototype.createConnection = function (request) {
return new NodeJSONPConnection(request, this._baseResponseOptions, this._ngZone, this._baseUrl, this._originUrl);
};
NodeJsonpBackend_.decorators = [
{ type: core_1.Injectable },
];
NodeJsonpBackend_.ctorParameters = [
{ type: http_1.ResponseOptions, },
{ type: core_1.NgZone, },
{ type: undefined, decorators: [{ type: core_1.Inject, args: [tokens_1.APP_BASE_HREF,] },] },
{ type: undefined, decorators: [{ type: core_1.Inject, args: [tokens_1.ORIGIN_URL,] },] },
];
return NodeJsonpBackend_;
}(NodeJsonpBackend));
exports.NodeJsonpBackend_ = NodeJsonpBackend_;
function _noop() {
}
exports._noop = _noop;
exports.NODE_HTTP_PROVIDERS_COMMON = [
{ provide: http_1.XSRFStrategy, useValue: _noop },
{ provide: http_1.BrowserXhr, useValue: _noop },
{ provide: http_1.RequestOptions, useClass: http_1.BaseRequestOptions },
{ provide: http_1.ResponseOptions, useClass: http_1.BaseResponseOptions }
];
exports.NODE_HTTP_PROVIDERS = exports.NODE_HTTP_PROVIDERS_COMMON.concat([
{ provide: http_1.Http, useFactory: httpFactory, deps: [http_1.XHRBackend, http_1.RequestOptions] },
{ provide: http_1.XHRBackend, useClass: NodeBackend },
]);
exports.NODE_JSONP_PROVIDERS = exports.NODE_HTTP_PROVIDERS_COMMON.concat([
{ provide: http_1.Jsonp, useFactory: jsonpFactory, deps: [http_1.JSONPBackend, http_1.RequestOptions] },
{ provide: http_1.JSONPBackend, useClass: NodeJsonpBackend_ },
]);
function httpFactory(xhrBackend, requestOptions) {
return new PreloadHttp(xhrBackend, requestOptions);
}
exports.httpFactory = httpFactory;
function jsonpFactory(jsonpBackend, requestOptions) {
return new PreloadHttp(jsonpBackend, requestOptions);
}
exports.jsonpFactory = jsonpFactory;
var NodeHttpModule = (function () {
function NodeHttpModule() {
}
NodeHttpModule.forRoot = function (config) {
if (config === void 0) { config = {}; }
return NodeHttpModule.withConfig(config);
};
NodeHttpModule.withConfig = function (config) {
if (config === void 0) { config = {}; }
var providers = [];
if (config.baseUrl) {
providers.push({ provide: tokens_1.APP_BASE_HREF, useValue: config.baseUrl });
}
if (config.requestUrl) {
providers.push({ provide: tokens_1.REQUEST_URL, useValue: config.requestUrl });
}
if (config.originUrl) {
providers.push({ provide: tokens_1.ORIGIN_URL, useValue: config.originUrl });
}
return {
ngModule: NodeHttpModule,
providers: providers
};
};
NodeHttpModule.decorators = [
{ type: core_1.NgModule, args: [{
providers: exports.NODE_HTTP_PROVIDERS
},] },
];
NodeHttpModule.ctorParameters = [];
return NodeHttpModule;
}());
exports.NodeHttpModule = NodeHttpModule;
var NodeJsonpModule = (function () {
function NodeJsonpModule() {
}
NodeJsonpModule.forRoot = function (config) {
if (config === void 0) { config = {}; }
return NodeJsonpModule.withConfig(config);
};
NodeJsonpModule.withConfig = function (config) {
if (config === void 0) { config = {}; }
var providers = [];
if (config.baseUrl) {
providers.push({ provide: tokens_1.APP_BASE_HREF, useValue: config.baseUrl });
}
if (config.requestUrl) {
providers.push({ provide: tokens_1.REQUEST_URL, useValue: config.requestUrl });
}
if (config.originUrl) {
providers.push({ provide: tokens_1.ORIGIN_URL, useValue: config.originUrl });
}
return {
ngModule: NodeJsonpModule,
providers: providers
};
};
NodeJsonpModule.decorators = [
{ type: core_1.NgModule, args: [{
providers: exports.NODE_JSONP_PROVIDERS
},] },
];
NodeJsonpModule.ctorParameters = [];
return NodeJsonpModule;
}());
exports.NodeJsonpModule = NodeJsonpModule;
//# sourceMappingURL=node-http.js.map
;