UNPKG

ngx-pwa

Version:

Provides functionality around the progressive web app functionality in angular. Most notably the an approach to cache POST, UPDATE and DELETE requests.

66 lines 10.4 kB
import { Inject, Injectable } from '@angular/core'; import { NGX_PWA_OFFLINE_SERVICE } from './offline.service'; import { UuidUtilities } from '../encapsulation/uuid.utilities'; import { HttpMethod } from '../models/http-method.enum'; import { RequestMetadataInternal } from '../models/request-metadata-internal.model'; import { NGX_PWA_HTTP_CONTEXT_METADATA } from '../models/request-metadata.model'; import * as i0 from "@angular/core"; /** * An interceptor that caches any POST, UPDATE or DELETE requests when the user is offline. */ export class OfflineRequestInterceptor { offlineService; constructor(offlineService) { this.offlineService = offlineService; } // eslint-disable-next-line jsdoc/require-jsdoc intercept(req, next) { if (!this.requestShouldBeCached(req)) { return next.handle(req); } const metadata = this.getRequestMetadata(req); if (req.method === HttpMethod.POST && req.body != undefined) { req.body[metadata.idKey] = `${this.offlineService.OFFLINE_ID_PREFIX} ${UuidUtilities.generate()}`; } const cachedRequest = { request: req, metadata: metadata }; this.offlineService.cachedRequests = this.offlineService.cachedRequests.concat(cachedRequest); return next.handle(req); } getRequestMetadata(request) { const metadata = request.context.get(NGX_PWA_HTTP_CONTEXT_METADATA); if (!metadata) { // eslint-disable-next-line no-console console.error('No metadata for the request', request.urlWithParams, ' was found.\nUsing fallback default values.'); } const internalMetadata = new RequestMetadataInternal(request, metadata); return internalMetadata; } requestShouldBeCached(req) { return this.offlineService.isOffline && this.requestMethodIsPostPatchOrDelete(req) && !this.urlShouldNotBeCached(req.url); } requestMethodIsPostPatchOrDelete(req) { return req.method === HttpMethod.POST || req.method === HttpMethod.PATCH || req.method === HttpMethod.DELETE; } urlShouldNotBeCached(url) { return url.endsWith('/login') || url.endsWith('/register') || url.endsWith('/refresh-token') || url.endsWith('/request-reset-password') || url.endsWith('/confirm-reset-password') || url.endsWith('/verify-password-reset-token'); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: OfflineRequestInterceptor, deps: [{ token: NGX_PWA_OFFLINE_SERVICE }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: OfflineRequestInterceptor }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: OfflineRequestInterceptor, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: undefined, decorators: [{ type: Inject, args: [NGX_PWA_OFFLINE_SERVICE] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZmbGluZS1yZXF1ZXN0LmludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXB3YS9zcmMvc2VydmljZXMvb2ZmbGluZS1yZXF1ZXN0LmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR25ELE9BQU8sRUFBdUMsdUJBQXVCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3hELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSw2QkFBNkIsRUFBbUIsTUFBTSxrQ0FBa0MsQ0FBQzs7QUFFbEc7O0dBRUc7QUFFSCxNQUFNLE9BQU8seUJBQXlCO0lBSWI7SUFGckIsWUFFcUIsY0FBa0M7UUFBbEMsbUJBQWMsR0FBZCxjQUFjLENBQW9CO0lBQ25ELENBQUM7SUFFTCwrQ0FBK0M7SUFDL0MsU0FBUyxDQUFJLEdBQW1CLEVBQUUsSUFBaUI7UUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ25DLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQTRCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2RSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ3pELEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBdUIsR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLElBQUksYUFBYSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7UUFDN0gsQ0FBQztRQUNELE1BQU0sYUFBYSxHQUFxQjtZQUNwQyxPQUFPLEVBQUUsR0FBRztZQUNaLFFBQVEsRUFBRSxRQUFRO1NBQ3JCLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDOUYsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxPQUE2QjtRQUNwRCxNQUFNLFFBQVEsR0FBZ0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUNqRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDWixzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsRUFBRSxPQUFPLENBQUMsYUFBYSxFQUFFLDZDQUE2QyxDQUFDLENBQUM7UUFDdkgsQ0FBQztRQUNELE1BQU0sZ0JBQWdCLEdBQTRCLElBQUksdUJBQXVCLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2pHLE9BQU8sZ0JBQWdCLENBQUM7SUFDNUIsQ0FBQztJQUVPLHFCQUFxQixDQUFDLEdBQXlCO1FBQ25ELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTO2VBQzdCLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxHQUFHLENBQUM7ZUFDMUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFTyxnQ0FBZ0MsQ0FBQyxHQUF5QjtRQUM5RCxPQUFPLEdBQUcsQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxVQUFVLENBQUMsTUFBTSxDQUFDO0lBQ2pILENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxHQUFXO1FBQ3BDLE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7ZUFDdEIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7ZUFDekIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztlQUM5QixHQUFHLENBQUMsUUFBUSxDQUFDLHlCQUF5QixDQUFDO2VBQ3ZDLEdBQUcsQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUM7ZUFDdkMsR0FBRyxDQUFDLFFBQVEsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQ3hELENBQUM7d0dBbkRRLHlCQUF5QixrQkFHdEIsdUJBQXVCOzRHQUgxQix5QkFBeUI7OzRGQUF6Qix5QkFBeUI7a0JBRHJDLFVBQVU7OzBCQUlGLE1BQU07MkJBQUMsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEV2ZW50LCBIdHRwSGFuZGxlciwgSHR0cEludGVyY2VwdG9yLCBIdHRwUmVxdWVzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBDYWNoZWRSZXF1ZXN0LCBOZ3hQd2FPZmZsaW5lU2VydmljZSwgTkdYX1BXQV9PRkZMSU5FX1NFUlZJQ0UgfSBmcm9tICcuL29mZmxpbmUuc2VydmljZSc7XG5pbXBvcnQgeyBVdWlkVXRpbGl0aWVzIH0gZnJvbSAnLi4vZW5jYXBzdWxhdGlvbi91dWlkLnV0aWxpdGllcyc7XG5pbXBvcnQgeyBIdHRwTWV0aG9kIH0gZnJvbSAnLi4vbW9kZWxzL2h0dHAtbWV0aG9kLmVudW0nO1xuaW1wb3J0IHsgUmVxdWVzdE1ldGFkYXRhSW50ZXJuYWwgfSBmcm9tICcuLi9tb2RlbHMvcmVxdWVzdC1tZXRhZGF0YS1pbnRlcm5hbC5tb2RlbCc7XG5pbXBvcnQgeyBOR1hfUFdBX0hUVFBfQ09OVEVYVF9NRVRBREFUQSwgUmVxdWVzdE1ldGFkYXRhIH0gZnJvbSAnLi4vbW9kZWxzL3JlcXVlc3QtbWV0YWRhdGEubW9kZWwnO1xuXG4vKipcbiAqIEFuIGludGVyY2VwdG9yIHRoYXQgY2FjaGVzIGFueSBQT1NULCBVUERBVEUgb3IgREVMRVRFIHJlcXVlc3RzIHdoZW4gdGhlIHVzZXIgaXMgb2ZmbGluZS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9mZmxpbmVSZXF1ZXN0SW50ZXJjZXB0b3I8T2ZmbGluZVNlcnZpY2VUeXBlIGV4dGVuZHMgTmd4UHdhT2ZmbGluZVNlcnZpY2U+IGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KE5HWF9QV0FfT0ZGTElORV9TRVJWSUNFKVxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9mZmxpbmVTZXJ2aWNlOiBPZmZsaW5lU2VydmljZVR5cGVcbiAgICApIHsgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbiAgICBpbnRlcmNlcHQ8VD4ocmVxOiBIdHRwUmVxdWVzdDxUPiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxUPj4ge1xuICAgICAgICBpZiAoIXRoaXMucmVxdWVzdFNob3VsZEJlQ2FjaGVkKHJlcSkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhOiBSZXF1ZXN0TWV0YWRhdGFJbnRlcm5hbCA9IHRoaXMuZ2V0UmVxdWVzdE1ldGFkYXRhKHJlcSk7XG4gICAgICAgIGlmIChyZXEubWV0aG9kID09PSBIdHRwTWV0aG9kLlBPU1QgJiYgcmVxLmJvZHkgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAocmVxLmJvZHlbbWV0YWRhdGEuaWRLZXldIGFzIHVua25vd24gYXMgc3RyaW5nKSA9IGAke3RoaXMub2ZmbGluZVNlcnZpY2UuT0ZGTElORV9JRF9QUkVGSVh9ICR7VXVpZFV0aWxpdGllcy5nZW5lcmF0ZSgpfWA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FjaGVkUmVxdWVzdDogQ2FjaGVkUmVxdWVzdDxUPiA9IHtcbiAgICAgICAgICAgIHJlcXVlc3Q6IHJlcSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBtZXRhZGF0YVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm9mZmxpbmVTZXJ2aWNlLmNhY2hlZFJlcXVlc3RzID0gdGhpcy5vZmZsaW5lU2VydmljZS5jYWNoZWRSZXF1ZXN0cy5jb25jYXQoY2FjaGVkUmVxdWVzdCk7XG4gICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXEpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UmVxdWVzdE1ldGFkYXRhKHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PHVua25vd24+KTogUmVxdWVzdE1ldGFkYXRhSW50ZXJuYWwge1xuICAgICAgICBjb25zdCBtZXRhZGF0YTogUmVxdWVzdE1ldGFkYXRhIHwgdW5kZWZpbmVkID0gcmVxdWVzdC5jb250ZXh0LmdldChOR1hfUFdBX0hUVFBfQ09OVEVYVF9NRVRBREFUQSk7XG4gICAgICAgIGlmICghbWV0YWRhdGEpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyBtZXRhZGF0YSBmb3IgdGhlIHJlcXVlc3QnLCByZXF1ZXN0LnVybFdpdGhQYXJhbXMsICcgd2FzIGZvdW5kLlxcblVzaW5nIGZhbGxiYWNrIGRlZmF1bHQgdmFsdWVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGludGVybmFsTWV0YWRhdGE6IFJlcXVlc3RNZXRhZGF0YUludGVybmFsID0gbmV3IFJlcXVlc3RNZXRhZGF0YUludGVybmFsKHJlcXVlc3QsIG1ldGFkYXRhKTtcbiAgICAgICAgcmV0dXJuIGludGVybmFsTWV0YWRhdGE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXF1ZXN0U2hvdWxkQmVDYWNoZWQocmVxOiBIdHRwUmVxdWVzdDx1bmtub3duPik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5vZmZsaW5lU2VydmljZS5pc09mZmxpbmVcbiAgICAgICAgICAgICYmIHRoaXMucmVxdWVzdE1ldGhvZElzUG9zdFBhdGNoT3JEZWxldGUocmVxKVxuICAgICAgICAgICAgJiYgIXRoaXMudXJsU2hvdWxkTm90QmVDYWNoZWQocmVxLnVybCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXF1ZXN0TWV0aG9kSXNQb3N0UGF0Y2hPckRlbGV0ZShyZXE6IEh0dHBSZXF1ZXN0PHVua25vd24+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiByZXEubWV0aG9kID09PSBIdHRwTWV0aG9kLlBPU1QgfHwgcmVxLm1ldGhvZCA9PT0gSHR0cE1ldGhvZC5QQVRDSCB8fCByZXEubWV0aG9kID09PSBIdHRwTWV0aG9kLkRFTEVURTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVybFNob3VsZE5vdEJlQ2FjaGVkKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB1cmwuZW5kc1dpdGgoJy9sb2dpbicpXG4gICAgICAgICAgICB8fCB1cmwuZW5kc1dpdGgoJy9yZWdpc3RlcicpXG4gICAgICAgICAgICB8fCB1cmwuZW5kc1dpdGgoJy9yZWZyZXNoLXRva2VuJylcbiAgICAgICAgICAgIHx8IHVybC5lbmRzV2l0aCgnL3JlcXVlc3QtcmVzZXQtcGFzc3dvcmQnKVxuICAgICAgICAgICAgfHwgdXJsLmVuZHNXaXRoKCcvY29uZmlybS1yZXNldC1wYXNzd29yZCcpXG4gICAgICAgICAgICB8fCB1cmwuZW5kc1dpdGgoJy92ZXJpZnktcGFzc3dvcmQtcmVzZXQtdG9rZW4nKTtcbiAgICB9XG59Il19