/** * @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 */ import {Subject} from 'rxjs'; export const patchDecodeBase64 = (proto: {decodeBase64: typeof atob}) => { let unpatch: () => void = () => undefined; if ((typeof atob === 'undefined') && (typeof Buffer === 'function')) { const oldDecodeBase64 = proto.decodeBase64; const newDecodeBase64 = (input: string) => Buffer.from(input, 'base64').toString('binary'); proto.decodeBase64 = newDecodeBase64; unpatch = () => { proto.decodeBase64 = oldDecodeBase64; }; } return unpatch; }; export class MockServiceWorkerContainer { private onControllerChange: Function[] = []; private onMessage: Function[] = []; mockRegistration: MockServiceWorkerRegistration|null = null; controller: MockServiceWorker|null = null; messages = new Subject(); notificationClicks = new Subject<{}>(); addEventListener(event: 'controllerchange'|'message', handler: Function) { if (event === 'controllerchange') { this.onControllerChange.push(handler); } else if (event === 'message') { this.onMessage.push(handler); } } removeEventListener(event: 'controllerchange', handler: Function) { if (event === 'controllerchange') { this.onControllerChange = this.onControllerChange.filter(h => h !== handler); } else if (event === 'message') { this.onMessage = this.onMessage.filter(h => h !== handler); } } async register(url: string): Promise { return; } async getRegistration(): Promise { return this.mockRegistration as any; } setupSw(url: string = '/ngsw-worker.js'): void { this.mockRegistration = new MockServiceWorkerRegistration(); this.controller = new MockServiceWorker(this, url); this.onControllerChange.forEach(onChange => onChange(this.controller)); } sendMessage(value: Object): void { this.onMessage.forEach(onMessage => onMessage({ data: value, })); } } export class MockServiceWorker { constructor(private mock: MockServiceWorkerContainer, readonly scriptURL: string) {} postMessage(value: Object) { this.mock.messages.next(value); } } export class MockServiceWorkerRegistration { pushManager: PushManager = new MockPushManager() as any; } export class MockPushManager { private subscription: PushSubscription|null = null; getSubscription(): Promise { return Promise.resolve(this.subscription); } subscribe(options?: PushSubscriptionOptionsInit): Promise { this.subscription = new MockPushSubscription() as any; return Promise.resolve(this.subscription!); } } export class MockPushSubscription { unsubscribe(): Promise { return Promise.resolve(true); } }