@akanass/ng-universal-transfer-http
Version:
TransferHttpCacheModule installs a Http interceptor that avoids duplicate HttpClient requests on the client
1,041 lines • 87.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { isPlatformServer } from '@angular/common';
import { HttpErrorResponse, HttpHeaders, HttpResponse } from '@angular/common/http';
import { ApplicationRef, Inject, Injectable, PLATFORM_ID } from '@angular/core';
import { makeStateKey, TransferState } from '@angular/platform-browser';
import createHash from 'create-hash';
import { stringify } from 'flatted/esm';
import { from, merge, of, throwError } from 'rxjs';
import { defaultIfEmpty, filter, first, flatMap, map, tap, toArray } from 'rxjs/operators';
import { TransferHttpCacheConfigService } from '../transfer-http-cache-config/transfer-http-cache-config.service';
/**
* Response interface
* @record
*/
function TransferHttpResponse() { }
if (false) {
/** @type {?|undefined} */
TransferHttpResponse.prototype.body;
/** @type {?|undefined} */
TransferHttpResponse.prototype.error;
/** @type {?|undefined} */
TransferHttpResponse.prototype.headers;
/** @type {?|undefined} */
TransferHttpResponse.prototype.status;
/** @type {?|undefined} */
TransferHttpResponse.prototype.statusText;
/** @type {?|undefined} */
TransferHttpResponse.prototype.url;
}
/**
* Server state interface
* @record
*/
function ServerStateData() { }
if (false) {
/** @type {?} */
ServerStateData.prototype.id;
/** @type {?} */
ServerStateData.prototype.reqKey;
}
var TransferHttpCacheInterceptor = /** @class */ (function () {
/**
* Class constructor
*/
function TransferHttpCacheInterceptor(_appRef, _transferState, _platformId, _configService) {
this._appRef = _appRef;
this._transferState = _transferState;
this._platformId = _platformId;
this._configService = _configService;
this._id = 0;
this._serverStateDataStoreKey = makeStateKey('server_state_data');
this._lastIdStoreKey = makeStateKey('server_state_last_id');
this._isCacheActivatedStoreKey = makeStateKey('is_cache_activated');
this._initCacheProcess();
}
/**
* Initialize cache process
*/
/**
* Initialize cache process
* @private
* @return {?}
*/
TransferHttpCacheInterceptor.prototype._initCacheProcess = /**
* Initialize cache process
* @private
* @return {?}
*/
function () {
var _this = this;
// initialize cache flag for the current platform
of(of(isPlatformServer(this._platformId)))
.pipe(flatMap((/**
* @param {?} isServer
* @return {?}
*/
function (isServer) {
return merge(isServer
.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return !!_; })), tap((/**
* @param {?} _
* @return {?}
*/
function (_) { return _this._isCacheActivated = _; })), tap((/**
* @param {?} _
* @return {?}
*/
function (_) { return _this._transferState.set(_this._isCacheActivatedStoreKey, _); }))), isServer
.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return !_; })), tap((/**
* @param {?} _
* @return {?}
*/
function (_) {
return _this._transferState.hasKey(_this._isCacheActivatedStoreKey) ?
_this._isCacheActivated = _this._transferState.get(_this._isCacheActivatedStoreKey, true) :
_this._isCacheActivated = _;
}))));
})), flatMap((/**
* @return {?}
*/
function () {
// Stop using the cache if the application has stabilized, indicating initial rendering is complete
// or if we are in development mode.
return merge(of(_this._configService.config.prodMode)
.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return !_; })), tap((/**
* @return {?}
*/
function () {
return console.log('TransferHttpCacheModule is in the development mode. ' +
'Enable the production mode with Server Side Rendering.');
}))), _this._appRef.isStable
.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return !!_; }))))
.pipe(first());
}))).subscribe((/**
* @return {?}
*/
function () { return _this._isCacheActivated = false; }));
};
/**
* Interceptor process
*/
/**
* Interceptor process
* @param {?} req
* @param {?} next
* @return {?}
*/
TransferHttpCacheInterceptor.prototype.intercept = /**
* Interceptor process
* @param {?} req
* @param {?} next
* @return {?}
*/
function (req, next) {
var _this = this;
return of(of(this._isCacheActivated))
.pipe(flatMap((/**
* @param {?} isCacheActivated
* @return {?}
*/
function (isCacheActivated) {
return merge(isCacheActivated
.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return !_; })), flatMap((/**
* @return {?}
*/
function () { return next.handle(req)
.pipe(tap((/**
* @return {?}
*/
function () { return _this._cleanServerState(); }))); }))), isCacheActivated
.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return !!_; })), flatMap((/**
* @return {?}
*/
function () { return _this._transferStateProcess(req, next); }))));
})));
};
/**
* Function to clean all data in server state
*/
/**
* Function to clean all data in server state
* @private
* @return {?}
*/
TransferHttpCacheInterceptor.prototype._cleanServerState = /**
* Function to clean all data in server state
* @private
* @return {?}
*/
function () {
var _this = this;
merge(this._getLastId(false)
.pipe(tap((/**
* @return {?}
*/
function () { return _this._transferState.remove(_this._lastIdStoreKey); }))), this._getServerStateData(false)
.pipe(tap((/**
* @param {?} _
* @return {?}
*/
function (_) {
return _.forEach((/**
* @param {?} __
* @return {?}
*/
function (__) {
return _this._transferState.remove(makeStateKey(_this._createHash(__.reqKey + "_" + __.id)));
}));
})), tap((/**
* @return {?}
*/
function () { return _this._transferState.remove(_this._serverStateDataStoreKey); }))), of(of(this._transferState.hasKey(this._isCacheActivatedStoreKey)))
.pipe(flatMap((/**
* @param {?} hasKey
* @return {?}
*/
function (hasKey) {
return hasKey
.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return !!_; })), tap((/**
* @return {?}
*/
function () { return _this._transferState.remove(_this._isCacheActivatedStoreKey); })));
}))))
.subscribe((/**
* @return {?}
*/
function () { return undefined; }), (/**
* @param {?} e
* @return {?}
*/
function (e) {
throw (e);
}));
};
/**
* Transfer state process
*/
/**
* Transfer state process
* @private
* @param {?} req
* @param {?} next
* @return {?}
*/
TransferHttpCacheInterceptor.prototype._transferStateProcess = /**
* Transfer state process
* @private
* @param {?} req
* @param {?} next
* @return {?}
*/
function (req, next) {
var _this = this;
return this._createKey(req)
.pipe(flatMap((/**
* @param {?} storeKey
* @return {?}
*/
function (storeKey) {
return of(of(_this._transferState.hasKey(storeKey)))
.pipe(flatMap((/**
* @param {?} hasKey
* @return {?}
*/
function (hasKey) {
return merge(_this._hasKeyProcess(hasKey, storeKey), _this._hasNotKeyProcess(req, next, hasKey, storeKey));
})));
})));
};
/**
* Creates transfer state key's store
*/
/**
* Creates transfer state key's store
* @private
* @param {?} req
* @return {?}
*/
TransferHttpCacheInterceptor.prototype._createKey = /**
* Creates transfer state key's store
* @private
* @param {?} req
* @return {?}
*/
function (req) {
var _this = this;
this._id++;
return of(of(isPlatformServer(this._platformId)))
.pipe(flatMap((/**
* @param {?} isServer
* @return {?}
*/
function (isServer) {
return merge(isServer
.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return !!_; })), flatMap((/**
* @return {?}
*/
function () { return _this._serverKey(req); }))), isServer
.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return !_; })), flatMap((/**
* @return {?}
*/
function () { return _this._clientKey(req); }))));
})));
};
/**
* Function to get state data and create client key for current request
*/
/**
* Function to get state data and create client key for current request
* @private
* @param {?} req
* @return {?}
*/
TransferHttpCacheInterceptor.prototype._clientKey = /**
* Function to get state data and create client key for current request
* @private
* @param {?} req
* @return {?}
*/
function (req) {
var _this = this;
return this._requestFormatted(req)
.pipe(map((/**
* @param {?} _
* @return {?}
*/
function (_) { return _this._createHash(stringify(_)); })), flatMap((/**
* @param {?} reqKey
* @return {?}
*/
function (reqKey) {
return _this._getServerStateData()
.pipe(flatMap((/**
* @param {?} _
* @return {?}
*/
function (_) { return from(_); })), filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return _.reqKey === reqKey; })), defaultIfEmpty(undefined), flatMap((/**
* @param {?} _
* @return {?}
*/
function (_) {
return !!_ ?
of(_) :
throwError(new Error('Request missing in server state data'));
})), flatMap((/**
* @param {?} serverState
* @return {?}
*/
function (serverState) {
return _this._getLastId()
.pipe(flatMap((/**
* @param {?} _
* @return {?}
*/
function (_) {
return !_ || _this._id > _ ?
throwError(new Error('Wrong id for server state data')) :
of(_this._id);
})), map((/**
* @param {?} _
* @return {?}
*/
function (_) { return _ === serverState.id ? _ : serverState.id; })), map((/**
* @param {?} id
* @return {?}
*/
function (id) { return _this._createHash(reqKey + "_" + id); })), map((/**
* @param {?} key
* @return {?}
*/
function (key) { return makeStateKey(key); })));
})));
})));
};
/**
* Function to get last id from server
*/
/**
* Function to get last id from server
* @private
* @param {?=} _throwError
* @return {?}
*/
TransferHttpCacheInterceptor.prototype._getLastId = /**
* Function to get last id from server
* @private
* @param {?=} _throwError
* @return {?}
*/
function (_throwError) {
var _this = this;
if (_throwError === void 0) { _throwError = true; }
return of(this._lastIdStoreKey)
.pipe(flatMap((/**
* @param {?} storeKey
* @return {?}
*/
function (storeKey) {
return of(of(_this._transferState.hasKey(storeKey)))
.pipe(flatMap((/**
* @param {?} hasKey
* @return {?}
*/
function (hasKey) {
return merge(hasKey
.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return !_; })), flatMap((/**
* @return {?}
*/
function () {
return of(_throwError)
.pipe(filter((/**
* @param {?} __
* @return {?}
*/
function (__) { return !!__; })), flatMap((/**
* @return {?}
*/
function () { return throwError(new Error('Missing server state last id')); })));
}))), hasKey
.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return !!_; })), map((/**
* @return {?}
*/
function () { return _this._transferState.get(storeKey, 0); }))));
})));
})));
};
/**
* Function to get server state data
*/
/**
* Function to get server state data
* @private
* @param {?=} _throwError
* @return {?}
*/
TransferHttpCacheInterceptor.prototype._getServerStateData = /**
* Function to get server state data
* @private
* @param {?=} _throwError
* @return {?}
*/
function (_throwError) {
var _this = this;
if (_throwError === void 0) { _throwError = true; }
return of(this._serverStateDataStoreKey)
.pipe(flatMap((/**
* @param {?} storeKey
* @return {?}
*/
function (storeKey) {
return of(of(_this._transferState.hasKey(storeKey)))
.pipe(flatMap((/**
* @param {?} hasKey
* @return {?}
*/
function (hasKey) {
return merge(hasKey
.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return !_; })), flatMap((/**
* @return {?}
*/
function () {
return of(_throwError)
.pipe(filter((/**
* @param {?} __
* @return {?}
*/
function (__) { return !!__; })), flatMap((/**
* @return {?}
*/
function () { return throwError(new Error('Missing server state data')); })));
}))), hasKey
.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return !!_; })), map((/**
* @return {?}
*/
function () { return _this._transferState.get(storeKey, (/** @type {?} */ ([]))); }))));
})));
})));
};
/**
* Function to create server key and store state data for current request
*/
/**
* Function to create server key and store state data for current request
* @private
* @param {?} req
* @return {?}
*/
TransferHttpCacheInterceptor.prototype._serverKey = /**
* Function to create server key and store state data for current request
* @private
* @param {?} req
* @return {?}
*/
function (req) {
var _this = this;
return this._requestFormatted(req)
.pipe(map((/**
* @param {?} _
* @return {?}
*/
function (_) { return _this._createHash(stringify(_)); })), tap((/**
* @param {?} reqKey
* @return {?}
*/
function (reqKey) { return _this._storeServerStateData(reqKey); })), map((/**
* @param {?} reqKey
* @return {?}
*/
function (reqKey) { return _this._createHash(reqKey + "_" + _this._id); })), map((/**
* @param {?} key
* @return {?}
*/
function (key) { return makeStateKey(key); })));
};
/**
* Function to store server state data
*/
/**
* Function to store server state data
* @private
* @param {?} reqKey
* @return {?}
*/
TransferHttpCacheInterceptor.prototype._storeServerStateData = /**
* Function to store server state data
* @private
* @param {?} reqKey
* @return {?}
*/
function (reqKey) {
var _this = this;
of(this._serverStateDataStoreKey)
.pipe(flatMap((/**
* @param {?} storeKey
* @return {?}
*/
function (storeKey) {
return of(of(_this._transferState.hasKey(storeKey)))
.pipe(flatMap((/**
* @param {?} hasKey
* @return {?}
*/
function (hasKey) {
return merge(hasKey
.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return !_; })), map((/**
* @return {?}
*/
function () { return (/** @type {?} */ ([])); }))), hasKey
.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return !!_; })), map((/**
* @return {?}
*/
function () { return _this._transferState.get(storeKey, (/** @type {?} */ ([]))); })), flatMap((/**
* @param {?} serverStateData
* @return {?}
*/
function (serverStateData) {
return !!serverStateData.find((/**
* @param {?} _
* @return {?}
*/
function (_) { return _.reqKey === reqKey; })) ?
throwError(new Error('Request already stored in server state data')) :
of(serverStateData);
}))));
})), tap((/**
* @return {?}
*/
function () { return _this._transferState.set(_this._lastIdStoreKey, _this._id); })));
})))
.subscribe((/**
* @param {?} serverStateData
* @return {?}
*/
function (serverStateData) { return _this._transferState.set(_this._serverStateDataStoreKey, serverStateData.concat({
id: _this._id,
reqKey: reqKey
})); }), (/**
* @param {?} e
* @return {?}
*/
function (e) {
throw (e);
}));
};
/**
* Process when key exists in transfer state
*/
/**
* Process when key exists in transfer state
* @private
* @param {?} hasKey
* @param {?} storeKey
* @return {?}
*/
TransferHttpCacheInterceptor.prototype._hasKeyProcess = /**
* Process when key exists in transfer state
* @private
* @param {?} hasKey
* @param {?} storeKey
* @return {?}
*/
function (hasKey, storeKey) {
var _this = this;
return hasKey
.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return !!_; })), map((/**
* @return {?}
*/
function () { return of(_this._transferState.get(storeKey, (/** @type {?} */ ({})))); })), flatMap((/**
* @param {?} obs
* @return {?}
*/
function (obs) {
return merge(obs
.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return _.status < 400; })), map((/**
* @param {?} response
* @return {?}
*/
function (response) { return new HttpResponse({
body: response.body,
headers: new HttpHeaders(response.headers),
status: response.status,
statusText: response.statusText,
url: response.url,
}); }))), obs
.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return _.status >= 400; })), flatMap((/**
* @param {?} response
* @return {?}
*/
function (response) {
return throwError(new HttpErrorResponse({
error: response.error,
headers: new HttpHeaders(response.headers),
status: response.status,
statusText: response.statusText,
url: response.url,
}));
}))));
})));
};
/**
* Process when key doesn't exist in transfer state
*/
/**
* Process when key doesn't exist in transfer state
* @private
* @param {?} req
* @param {?} next
* @param {?} hasKey
* @param {?} storeKey
* @return {?}
*/
TransferHttpCacheInterceptor.prototype._hasNotKeyProcess = /**
* Process when key doesn't exist in transfer state
* @private
* @param {?} req
* @param {?} next
* @param {?} hasKey
* @param {?} storeKey
* @return {?}
*/
function (req, next, hasKey, storeKey) {
var _this = this;
return hasKey
.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return !_; })), flatMap((/**
* @return {?}
*/
function () {
return next.handle(req)
.pipe(tap((/**
* @param {?} event
* @return {?}
*/
function (event) {
return of(event)
.pipe(filter((/**
* @param {?} evt
* @return {?}
*/
function (evt) { return evt instanceof HttpResponse; })))
.subscribe((/**
* @param {?} evt
* @return {?}
*/
function (evt) { return _this._transferState.set(storeKey, {
body: evt.body,
headers: _this._getHeadersMap(evt.headers),
status: evt.status,
statusText: evt.statusText,
// tslint:disable-next-line:no-non-null-assertion
url: (/** @type {?} */ (evt.url)),
}); }));
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
return of(error)
.pipe(filter((/**
* @param {?} err
* @return {?}
*/
function (err) { return err instanceof HttpErrorResponse; })))
.subscribe((/**
* @param {?} err
* @return {?}
*/
function (err) { return _this._transferState.set(storeKey, {
error: err.error,
headers: _this._getHeadersMap(err.headers),
status: err.status,
statusText: err.statusText,
// tslint:disable-next-line:no-non-null-assertion
url: (/** @type {?} */ (err.url)),
}); }));
})));
})));
};
/**
* Creates Headers Map
*/
/**
* Creates Headers Map
* @private
* @param {?} headers
* @return {?}
*/
TransferHttpCacheInterceptor.prototype._getHeadersMap = /**
* Creates Headers Map
* @private
* @param {?} headers
* @return {?}
*/
function (headers) {
// tslint:disable-next-line:no-non-null-assertion
return headers.keys().reduce((/**
* @param {?} acc
* @param {?} curr
* @return {?}
*/
function (acc, curr) {
var _a;
return Object.assign(acc, (_a = {}, _a[curr] = (/** @type {?} */ (headers.getAll(curr))), _a));
}), {});
};
/**
* Function to create sha256 hash
*/
/**
* Function to create sha256 hash
* @private
* @param {?} data
* @return {?}
*/
TransferHttpCacheInterceptor.prototype._createHash = /**
* Function to create sha256 hash
* @private
* @param {?} data
* @return {?}
*/
function (data) {
return createHash('sha256').update(data).digest('hex');
};
/**
* Returns HttpRequest with value of header inside url & urlWithParams
*/
/**
* Returns HttpRequest with value of header inside url & urlWithParams
* @private
* @param {?} req
* @param {?} headerName
* @return {?}
*/
TransferHttpCacheInterceptor.prototype._replaceWithHeader = /**
* Returns HttpRequest with value of header inside url & urlWithParams
* @private
* @param {?} req
* @param {?} headerName
* @return {?}
*/
function (req, headerName) {
var _this = this;
return of(of(this._getHeadersMap(req.headers)[headerName]))
.pipe(flatMap((/**
* @param {?} obs
* @return {?}
*/
function (obs) {
return merge(obs.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return !!_ && !!_.length; })), map((/**
* @param {?} _
* @return {?}
*/
function (_) { return of(_[_.length - 1]); })), flatMap((/**
* @param {?} o
* @return {?}
*/
function (o) {
return merge(o.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return !!_; })), flatMap((/**
* @param {?} headerValue
* @return {?}
*/
function (headerValue) {
return merge(_this._formatUrlWithHeaderValue(req.url, headerValue), _this._formatUrlWithHeaderValue(req.urlWithParams, headerValue)).pipe(toArray(), map((/**
* @param {?} _
* @return {?}
*/
function (_) { return (/** @type {?} */ (Object.assign({}, req, {
url: _[0],
urlWithParams: _[1]
}))); })));
}))), o.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return !_; })), flatMap((/**
* @return {?}
*/
function () {
return throwError(new Error("Missing header '" + headerName + "' value inside request to generate state key"));
}))));
}))), obs.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return !_ || !_.length; })), flatMap((/**
* @return {?}
*/
function () {
return throwError(new Error("Missing header '" + headerName + "' value inside request to generate state key"));
}))));
})));
};
/**
* Replace url with header value
*/
/**
* Replace url with header value
* @private
* @param {?} url
* @param {?} headerValue
* @return {?}
*/
TransferHttpCacheInterceptor.prototype._formatUrlWithHeaderValue = /**
* Replace url with header value
* @private
* @param {?} url
* @param {?} headerValue
* @return {?}
*/
function (url, headerValue) {
return of(url)
.pipe(map((/**
* @param {?} _
* @return {?}
*/
function (_) { return _.split('://')[1].split('/'); })), map((/**
* @param {?} _
* @return {?}
*/
function (_) { return _.map((/**
* @param {?} s
* @param {?} i
* @return {?}
*/
function (s, i) { return i === 0 ? headerValue : s; })); })), map((/**
* @param {?} _
* @return {?}
*/
function (_) { return _.join('/'); })));
};
/**
* Returns the good request object to create hash
*/
/**
* Returns the good request object to create hash
* @private
* @param {?} req
* @return {?}
*/
TransferHttpCacheInterceptor.prototype._requestFormatted = /**
* Returns the good request object to create hash
* @private
* @param {?} req
* @return {?}
*/
function (req) {
var _this = this;
return of(of(this._configService.config.headerNameToOverrideUrlInKeyCachingGeneration))
.pipe(flatMap((/**
* @param {?} obs
* @return {?}
*/
function (obs) {
return merge(obs.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return !!_; })), flatMap((/**
* @param {?} _
* @return {?}
*/
function (_) { return _this._replaceWithHeader(req, _); }))), obs.pipe(filter((/**
* @param {?} _
* @return {?}
*/
function (_) { return !_; })), map((/**
* @return {?}
*/
function () { return req; }))));
})));
};
TransferHttpCacheInterceptor.decorators = [
{ type: Injectable }
];
/** @nocollapse */
TransferHttpCacheInterceptor.ctorParameters = function () { return [
{ type: ApplicationRef },
{ type: TransferState },
{ type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] },
{ type: TransferHttpCacheConfigService }
]; };
return TransferHttpCacheInterceptor;
}());
export { TransferHttpCacheInterceptor };
if (false) {
/**
* @type {?}
* @private
*/
TransferHttpCacheInterceptor.prototype._isCacheActivated;
/**
* @type {?}
* @private
*/
TransferHttpCacheInterceptor.prototype._id;
/**
* @type {?}
* @private
*/
TransferHttpCacheInterceptor.prototype._serverStateDataStoreKey;
/**
* @type {?}
* @private
*/
TransferHttpCacheInterceptor.prototype._lastIdStoreKey;
/**
* @type {?}
* @private
*/
TransferHttpCacheInterceptor.prototype._isCacheActivatedStoreKey;
/**
* @type {?}
* @private
*/
TransferHttpCacheInterceptor.prototype._appRef;
/**
* @type {?}
* @private
*/
TransferHttpCacheInterceptor.prototype._transferState;
/**
* @type {?}
* @private
*/
TransferHttpCacheInterceptor.prototype._platformId;
/**
* @type {?}
* @private
*/
TransferHttpCacheInterceptor.prototype._configService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXItaHR0cC1jYWNoZS5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bha2FuYXNzL25nLXVuaXZlcnNhbC10cmFuc2Zlci1odHRwLyIsInNvdXJjZXMiOlsibGliL3NoYXJlZC9zZXJ2aWNlcy90cmFuc2Zlci1odHRwLWNhY2hlLWludGVyY2VwdG9yL3RyYW5zZmVyLWh0dHAtY2FjaGUuaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFDSCxpQkFBaUIsRUFHakIsV0FBVyxFQUdYLFlBQVksRUFDZixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEYsT0FBTyxFQUFFLFlBQVksRUFBWSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVsRixPQUFPLFVBQVUsTUFBTSxhQUFhLENBQUM7QUFDckMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV4QyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBYyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxrRUFBa0UsQ0FBQzs7Ozs7QUFLbEgsbUNBT0M7OztJQU5HLG9DQUFrQjs7SUFDbEIscUNBQW1COztJQUNuQix1Q0FBc0M7O0lBQ3RDLHNDQUFnQjs7SUFDaEIsMENBQW9COztJQUNwQixtQ0FBYTs7Ozs7O0FBTWpCLDhCQUdDOzs7SUFGRyw2QkFBVzs7SUFD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