{"version":3,"file":"ngx-multi-window.mjs","sources":["../../../projects/ngx-multi-window/src/lib/types/window-save-strategy.enum.ts","../../../projects/ngx-multi-window/src/lib/providers/config.provider.ts","../../../projects/ngx-multi-window/src/lib/types/message.type.ts","../../../projects/ngx-multi-window/src/lib/providers/storage.service.ts","../../../projects/ngx-multi-window/src/lib/providers/window.provider.ts","../../../projects/ngx-multi-window/src/lib/providers/multi-window.service.ts","../../../projects/ngx-multi-window/src/lib/multi-window.module.ts","../../../projects/ngx-multi-window/src/index.ts","../../../projects/ngx-multi-window/src/ngx-multi-window.ts"],"sourcesContent":["/**\n * A representation of a strategy on how to save the window id in the native window.name property.\n */\nexport enum WindowSaveStrategy {\n  /**\n   * Default behaviour. Window data will not be saved.\n   */\n  NONE,\n  /**\n   * Only save the window data when the storage (native window.name property) is empty/undefined, meaning nothing else is\n   * probably utilizing it\n   */\n  SAVE_WHEN_EMPTY,\n  /**\n   * Save the window data without checking whether the storage might be used by another script\n   */\n  SAVE_FORCE,\n  /**\n   * Save window data, but backup probable existing data in the storage and restore the original data after reading the window data.\n   * Restoring the original data might not happen \"on time\" for the script using it, which would require delaying it's execution.\n   */\n  SAVE_BACKUP,\n}\n","import { InjectionToken } from '@angular/core';\nimport { MultiWindowConfig } from '../types/multi-window.config';\nimport { WindowSaveStrategy } from '../types/window-save-strategy.enum';\n\nexport const NGXMW_CONFIG = new InjectionToken<MultiWindowConfig>('ngxmw_config');\n\nexport const defaultMultiWindowConfig: MultiWindowConfig = {\n  keyPrefix: 'ngxmw_',\n  heartbeat: 1000,\n  newWindowScan: 5000,\n  messageTimeout: 10000,\n  windowTimeout: 15000,\n  windowSaveStrategy: WindowSaveStrategy.NONE,\n};\n","export enum MessageType {\n  MESSAGE,\n  MESSAGE_RECEIVED,\n  PING,\n}\n\nexport interface MessageTemplate {\n  recipientId: string;\n  type: MessageType;\n  event: string;\n  data?: any;\n  payload?: any;\n}\n\nexport interface Message extends MessageTemplate {\n  send?: boolean;\n  messageId: string;\n  sendTime: number;\n  senderId: string;\n}\n","import { Injectable, Optional, SkipSelf } from '@angular/core';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class StorageService {\n\n  private window: Window;\n  private localStorage: Storage;\n  private sessionStorage: Storage;\n\n  constructor() {\n    this.window = window;\n    this.localStorage = window.localStorage;\n    this.sessionStorage = window.sessionStorage;\n  }\n\n  /*\n   Write methods\n   */\n  public setLocalObject(key: string, obj: any): boolean {\n    return this.setObject(this.localStorage, key, obj);\n  }\n\n  public setLocalItem(key: string, obj: string): void {\n    this.setItem(this.localStorage, key, obj);\n  }\n\n  public setSessionObject(key: string, obj: any): boolean {\n    return this.setObject(this.sessionStorage, key, obj);\n  }\n\n  public setSessionItem(key: string, obj: string): void {\n    this.setItem(this.sessionStorage, key, obj);\n  }\n\n  private setObject(storage: Storage, key: string, obj: any): boolean {\n    let jsonString: string;\n    try {\n      jsonString = JSON.stringify(obj);\n    } catch (ex) {\n      return false;\n    }\n    this.setItem(storage, key, jsonString);\n\n    return true;\n  }\n\n  private setItem(storage: Storage, key: string, obj: string): void {\n    storage.setItem(key, obj);\n  }\n\n  public setWindowName(value: string): void {\n    this.window.name = value;\n  }\n\n  /*\n   Read methods\n   */\n\n  public getLocalObject<T>(key: string): T | null {\n    return this.getObject<T>(this.localStorage, key);\n  }\n\n  public getLocalObjects<T>(keys: string[]): (T | null)[] {\n    return this.getObjects<T>(this.localStorage, keys);\n  }\n\n  public getLocalItem(key: string): string | null {\n    return this.getItem(this.localStorage, key);\n  }\n\n  public getSessionObject<T>(key: string): T | null {\n    return this.getObject<T>(this.sessionStorage, key);\n  }\n\n  public getSessionObjects<T>(keys: string[]): (T | null)[] {\n    return this.getObjects<T>(this.sessionStorage, keys);\n  }\n\n  public getSessionItem(key: string): string | null {\n    return this.getItem(this.sessionStorage, key);\n  }\n\n  public getObjects<T>(storage: Storage, keys: string[]): (T | null)[] {\n    return keys.map(key => this.getObject<T>(storage, key));\n  }\n\n  private getObject<T>(storage: Storage, key: string): T | null {\n    const jsonString = this.getItem(storage, key);\n    if (jsonString === null) {\n      return null;\n    }\n    try {\n      return JSON.parse(jsonString) as T;\n    } catch (ex) {\n      return null;\n    }\n  }\n\n  private getItem(storage: Storage, key: string): string | null {\n    return storage.getItem(key) || null;\n  }\n\n  public getWindowName(): string {\n    return this.window.name;\n  }\n\n  /*\n   Remove methods\n   */\n\n  public removeLocalItem(key: string): void {\n    this.removeItem(this.localStorage, key);\n  }\n\n  public removeSessionItem(key: string): void {\n    this.removeItem(this.sessionStorage, key);\n  }\n\n  private removeItem(storage: Storage, key: string): void {\n    storage.removeItem(key);\n  }\n\n  public clearLocalStorage(): void {\n    this.clearStorage(this.localStorage);\n  }\n\n  public clearSessionStorage(): void {\n    this.clearStorage(this.sessionStorage);\n  }\n\n  private clearStorage(storage: Storage): void {\n    storage.clear();\n  }\n\n  /*\n   Inspection methods\n   */\n\n  public getLocalItemKeys(): string[] {\n    return this.getStorageItemKeys(this.localStorage);\n  }\n\n  public getSessionItemKeys(): string[] {\n    return this.getStorageItemKeys(this.sessionStorage);\n  }\n\n  private getStorageItemKeys(storage: Storage): string[] {\n    const keys = [];\n    for (let i = 0; i < storage.length; i++) {\n      keys.push(storage.key(i));\n    }\n\n    return keys;\n  }\n}\n\n/* singleton pattern taken from https://github.com/angular/angular/issues/13854 */\nexport const StorageServiceProviderFactory = (parentDispatcher: StorageService) => {\n  return parentDispatcher || new StorageService();\n};\n\nexport const StorageServiceProvider = {\n  provide: StorageService,\n  deps: [[new Optional(), new SkipSelf(), StorageService]],\n  useFactory: StorageServiceProviderFactory,\n};\n","import { Injectable } from '@angular/core';\n\nconst _window: () => any = () => {\n  // return the global native browser window object\n  return window;\n};\n\n@Injectable()\nexport class WindowRef {\n  get nativeWindow(): any {\n    return _window();\n  }\n}\n","import { Inject, Injectable, Optional } from '@angular/core';\nimport { Location } from '@angular/common';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { ignoreElements } from 'rxjs/operators';\n\nimport { StorageService } from './storage.service';\nimport { defaultMultiWindowConfig, NGXMW_CONFIG } from './config.provider';\nimport { MultiWindowConfig } from '../types/multi-window.config';\nimport { AppWindow, KnownAppWindow, WindowData } from '../types/window.type';\nimport { Message, MessageTemplate, MessageType } from '../types/message.type';\nimport { WindowRef } from '../providers/window.provider';\nimport { WindowSaveStrategy } from '../types/window-save-strategy.enum';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class MultiWindowService {\n\n  private config: MultiWindowConfig;\n\n  private myWindow: WindowData;\n\n  private heartbeatId = null;\n  private windowScanId = null;\n\n  private knownWindows: KnownAppWindow[] = [];\n\n  /**\n   * A hash that keeps track of subjects for all send messages\n   */\n  private messageTracker: { [key: string]: Subject<string> } = {};\n\n  /**\n   * A copy of the outbox that is regularly written to the local storage\n   */\n  private outboxCache: { [key: string]: Message } = {};\n\n  /**\n   * A subject to subscribe to in order to get notified about messages send to this window\n   */\n  private messageSubject: Subject<Message> = new Subject<Message>();\n\n  /**\n   * A subject to subscribe to in order to get notified about all known windows\n   */\n  private windowSubject: Subject<KnownAppWindow[]> = new BehaviorSubject<KnownAppWindow[]>(this.knownWindows);\n\n  private static generateId(): string {\n    return new Date().getTime().toString(36).substr(-4) + Math.random().toString(36).substr(2, 9);\n  }\n\n  private tryMatchWindowKey(source: string): string {\n    const nameRegex = new RegExp(\n      // Escape any potential regex-specific chars in the keyPrefix which may be changed by the dev\n      this.config.keyPrefix.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&') + 'w_([a-z0-9]+)'\n    );\n    const match = source.match(nameRegex);\n    if (match !== null) {\n      return match[1];\n    }\n\n    return null;\n  }\n\n  private generatePayloadKey({messageId}: Message): string {\n    return this.config.keyPrefix + 'payload_' + messageId;\n  }\n\n  private generateWindowKey(windowId: string): string {\n    return this.config.keyPrefix + 'w_' + windowId;\n  }\n\n  private isWindowKey(key: string): boolean {\n    return key.indexOf(this.config.keyPrefix + 'w_') === 0;\n  }\n\n  constructor(@Inject(NGXMW_CONFIG) customConfig: MultiWindowConfig, @Optional() private location: Location,\n              private storageService: StorageService, private windowRef: WindowRef) {\n    this.config = {...defaultMultiWindowConfig, ...customConfig};\n\n    let windowId: string;\n\n    if (this.location) {\n      // Try to extract the new window name from the location path\n      windowId = this.tryMatchWindowKey(this.location.path(true));\n    }\n    // Only check the name save strategy if no id has been extracted from the path already\n    if (!windowId && this.config.windowSaveStrategy !== WindowSaveStrategy.NONE) {\n      // There might be window data stored in the window.name property, try restoring it\n      const storedWindowData = this.windowRef.nativeWindow.name;\n\n      if (this.config.windowSaveStrategy === WindowSaveStrategy.SAVE_BACKUP) {\n        // There should be a JSON string in the window.name, try parsing it and set the values\n        try {\n          const storedJsonData = JSON.parse(storedWindowData);\n          windowId = storedJsonData.ngxmw_id;\n          this.windowRef.nativeWindow.name = storedJsonData.backup;\n        } catch (ex) { // Swallow JSON parsing exceptions, as we can't handle them anyway\n        }\n      } else {\n        windowId = this.tryMatchWindowKey(storedWindowData);\n        if (this.config.windowSaveStrategy === WindowSaveStrategy.SAVE_WHEN_EMPTY) {\n          this.windowRef.nativeWindow.name = '';\n        }\n      }\n    }\n    this.init(windowId);\n    this.start();\n  }\n\n  get name(): string {\n    return this.myWindow.name;\n  }\n\n  set name(value: string) {\n    this.myWindow.name = value;\n  }\n\n  get id(): string {\n    return this.myWindow.id;\n  }\n\n  /**\n   * An observable to subscribe to. It emits all messages the current window receives.\n   * After a message has been emitted by this observable it is marked as read, so the sending window\n   * gets informed about successful delivery.\n   */\n  public onMessage(): Observable<Message> {\n    return this.messageSubject.asObservable();\n  }\n\n  /**\n   * An observable to subscribe to. It emits the array of known windows\n   * whenever it is read again from the localstorage.\n   *\n   * This Observable emits the last list of known windows on subscription\n   * (refer to rxjs BehaviorSubject).\n   *\n   * Use {@link getKnownWindows} to get the current list of\n   * known windows or if you only need a snapshot of that list.\n   *\n   * @see {@link MultiWindowConfig#newWindowScan}\n   * @returns\n   */\n  public onWindows(): Observable<KnownAppWindow[]> {\n    return this.windowSubject.asObservable();\n  }\n\n  /**\n   * Get the latest list of known windows.\n   *\n   * Use {@link onWindows} to get an observable which emits\n   * whenever is updated.\n   */\n  public getKnownWindows() {\n    return this.knownWindows;\n  }\n\n  /**\n   * Start so that the current instance of the angular app/service/tab participates in the cross window communication.\n   * It starts the interval-based checking for messages and updating the heartbeat.\n   *\n   * Note: There should be no need to call this method in production apps. It will automatically be called internally\n   * during service construction (see {@link MultiWindowService} constructor)\n   */\n  public start(): void {\n    if (!this.heartbeatId) {\n      this.heartbeatId = setInterval(this.heartbeat, this.config.heartbeat);\n    }\n    if (!this.windowScanId) {\n      this.windowScanId = setInterval(this.scanForWindows, this.config.newWindowScan);\n    }\n  }\n\n  /**\n   * Stop the current instance of the angular app/service/tab from participating in the cross window communication.\n   * It stops the interval-based checking for messages and updating the heartbeat.\n   *\n   * Note: There should be no need to call this method in production apps.\n   */\n  public stop(): void {\n    if (this.heartbeatId) {\n      clearInterval(this.heartbeatId);\n      this.heartbeatId = null;\n    }\n    if (this.windowScanId) {\n      clearInterval(this.windowScanId);\n      this.windowScanId = null;\n    }\n  }\n\n  /**\n   * Remove the current window representation from the localstorage.\n   *\n   * Note: Unless you {@link stop}ped the service the window representation will be\n   * recreated after {@link MultiWindowConfig#heartbeat} milliseconds\n   */\n  public clear(): void {\n    this.storageService.removeLocalItem(this.generateWindowKey(this.myWindow.id));\n  }\n\n  /**\n   * Send a message to another window.\n   *\n   * @param recipientId The ID of the recipient window.\n   * @param event Custom identifier to distinguish certain events\n   * @param data Custom data to contain the data for the event\n   * @param payload Further data to be passed to the recipient window via a separate entry in the localstorage\n   * @returns An observable that emits the messageId once the message has been put into\n   * the current windows outbox. It completes on successful delivery and fails if the delivery times out.\n   */\n  public sendMessage(recipientId: string, event: string, data: any, payload?: any): Observable<string> {\n    const messageId = this.pushToOutbox({\n      recipientId,\n      type: MessageType.MESSAGE,\n      event,\n      data,\n      payload,\n    });\n    this.messageTracker[messageId] = new Subject<string>();\n\n    return this.messageTracker[messageId].asObservable();\n  }\n\n  /**\n   * Create a new window and get informed once it has been created.\n   *\n   * Note: The actual window \"creation\" of redirection needs to be performed by\n   * the library user. This method only returns helpful information on how to\n   * do that\n   *\n   * The returned object contains three properties:\n   *\n   * windowId: An id generated to be assigned to the newly created window\n   *\n   * urlString: This string must be included in the url the new window loads.\n   * It does not matter whether it is in the path, query or hash part\n   *\n   * created: An observable that will complete after new window was opened and was able\n   * to receive a message. If the window does not start consuming messages within\n   * {@link MultiWindowConfig#messageTimeout}, this observable will fail, although\n   * the window might become present after that. The Observable will never emit any elements.\n   */\n  public newWindow(): { windowId: string, urlString: string, created: Observable<string> } {\n    if (this.location === null) {\n      // Reading information from the URL is only possible with the Location provider. If\n      // this window does not have one, another one will have none as well and thus would\n      // not be able to read its new windowId from the url path\n      throw new Error('No Location Provider present');\n    }\n    const newWindowId = MultiWindowService.generateId();\n\n    const messageId = this.pushToOutbox({\n      recipientId: newWindowId,\n      type: MessageType.PING,\n      event: undefined,\n      data: undefined,\n      payload: undefined,\n    });\n\n    this.messageTracker[messageId] = new Subject<string>();\n\n    return {\n      windowId: newWindowId,\n      urlString: this.generateWindowKey(newWindowId),\n      created: this.messageTracker[messageId].pipe(ignoreElements()),\n    };\n  }\n\n  public saveWindow(): void {\n    if (this.config.windowSaveStrategy !== WindowSaveStrategy.NONE) {\n      const windowId = this.generateWindowKey(this.id);\n      if ((this.config.windowSaveStrategy === WindowSaveStrategy.SAVE_WHEN_EMPTY && !this.windowRef.nativeWindow.name)\n        || this.config.windowSaveStrategy === WindowSaveStrategy.SAVE_FORCE) {\n        this.windowRef.nativeWindow.name = windowId;\n      } else if (this.config.windowSaveStrategy === WindowSaveStrategy.SAVE_BACKUP) {\n        this.windowRef.nativeWindow.name = JSON.stringify({ngxmw_id: windowId, backup: this.windowRef.nativeWindow.name});\n      }\n    }\n  }\n\n  private init(windowId?: string): void {\n    const windowKey = windowId\n      ? this.generateWindowKey(windowId)\n      : this.storageService.getWindowName();\n    let windowData: WindowData | null = null;\n    if (windowKey && this.isWindowKey(windowKey)) {\n      windowData = this.storageService.getLocalObject<WindowData>(windowKey);\n    }\n\n    if (windowData !== null) {\n      // Restore window information from storage\n      this.myWindow = {\n        id: windowData.id,\n        name: windowData.name,\n        heartbeat: windowData.heartbeat,\n      };\n    } else {\n      const myWindowId = windowId || MultiWindowService.generateId();\n      this.myWindow = {\n        id: myWindowId,\n        name: 'AppWindow ' + myWindowId,\n        heartbeat: -1,\n      };\n    }\n\n    this.storageService.setWindowName(windowKey);\n\n    // Scan for already existing windows\n    this.scanForWindows();\n\n    // Trigger heartbeat for the first time\n    this.heartbeat();\n  }\n\n  private pushToOutbox({recipientId, type, event, data, payload}: MessageTemplate,\n                       messageId: string = MultiWindowService.generateId()): string {\n    if (recipientId === this.id) {\n      throw new Error('Cannot send messages to self');\n    }\n    this.outboxCache[messageId] = {\n      messageId,\n      recipientId,\n      senderId: this.myWindow.id,\n      sendTime: new Date().getTime(),\n      type,\n      event,\n      data,\n      payload,\n      send: false,\n    };\n\n    return messageId;\n  }\n\n  private heartbeat = () => {\n    const now = new Date().getTime();\n    // Check whether there are new messages for the current window in the other window's outboxes\n\n    // Store the ids of all messages we receive in this iteration\n    const receivedMessages: string[] = [];\n\n    this.knownWindows.forEach(windowData => {\n      // Load the window from the localstorage\n      const appWindow = this.storageService.getLocalObject<AppWindow>(this.generateWindowKey(windowData.id));\n\n      if (appWindow === null) {\n        // No window found, it possibly got closed/removed since our last scanForWindow\n        return;\n      }\n\n      if (appWindow.id === this.myWindow.id) {\n        // Ignore messages from myself (not done using Array.filter to reduce array iterations)\n        // but check for proper last heartbeat time\n        if (this.myWindow.heartbeat !== -1 && this.myWindow.heartbeat !== appWindow.heartbeat) {\n          // The heartbeat value in the localstorage is a different one than the one we wrote into localstorage\n          // during our last heartbeat. There are probably two app windows\n          // using the same window id => change the current windows id\n          this.myWindow.id = MultiWindowService.generateId();\n          // eslint-disable-next-line no-console\n          console.warn('Window ' + appWindow.id + '  detected that there is probably another instance with' +\n            ' this id, changed id to ' + this.myWindow.id);\n          this.storageService.setWindowName(this.generateWindowKey(this.myWindow.id));\n        }\n\n        return;\n      }\n\n      if (now - appWindow.heartbeat > this.config.windowTimeout) {\n        // The window seems to be dead, remove the entry from the localstorage\n        this.storageService.removeLocalItem(this.generateWindowKey(appWindow.id));\n      }\n\n      // Update the windows name and heartbeat value in the list of known windows (that's what we iterate over)\n      windowData.name = appWindow.name;\n      windowData.heartbeat = appWindow.heartbeat;\n\n      if (appWindow.messages && appWindow.messages.length > 0) {\n        // This other window has messages, so iterate over the messages the other window has\n        appWindow.messages.forEach(message => {\n          if (message.recipientId !== this.myWindow.id) {\n            // The message is not targeted to the current window\n            return;\n          }\n\n          if (message.type === MessageType.MESSAGE_RECEIVED) {\n            // It's a message to inform the current window that a previously sent message from the\n            // current window has been processed by the recipient window\n\n            // Trigger the observable to complete and then remove it\n            if (this.messageTracker[message.messageId]) {\n              this.messageTracker[message.messageId].complete();\n            }\n            delete this.messageTracker[message.messageId];\n\n            // Remove the message from the outbox, as the transfer is complete\n            delete this.outboxCache[message.messageId];\n          } else {\n            receivedMessages.push(message.messageId);\n            // Check whether we already processed that message. If that's the case we've got a 'message_received'\n            // confirmation in our own outbox.\n\n            if (!(this.outboxCache[message.messageId] &&\n                this.outboxCache[message.messageId].type === MessageType.MESSAGE_RECEIVED)) {\n              // We did not process that message\n\n              // Create a new message for the message sender in the current window's\n              // outbox that the message has been processed (reuse the message id for that)\n              this.pushToOutbox({\n                recipientId: message.senderId,\n                type: MessageType.MESSAGE_RECEIVED,\n                event: undefined,\n              }, message.messageId);\n\n              // Process it locally, unless it's just a PING message\n              if (message.type !== MessageType.PING) {\n                if (message.payload === true) {\n                  // The message has a separate payload\n                  const payloadKey = this.generatePayloadKey(message);\n                  message.payload = this.storageService.getLocalObject<any>(payloadKey);\n                  this.storageService.removeLocalItem(payloadKey);\n                }\n                this.messageSubject.next(message);\n              }\n            }\n          }\n        });\n      }\n    });\n\n    // Iterate over the outbox to clean it up, process timeouts and payloads\n    Object.keys(this.outboxCache).forEach(messageId => {\n      const message = this.outboxCache[messageId];\n      if (message.type === MessageType.MESSAGE_RECEIVED && !receivedMessages.some(msgId => msgId === messageId)) {\n        // It's a message confirmation and we did not receive the 'original' method for that confirmation\n        // => the sender has received our confirmation and removed the message from it's outbox, thus we can\n        //     safely remove the message confirmation as well\n        delete this.outboxCache[messageId];\n      } else if (message.type !== MessageType.MESSAGE_RECEIVED && now - message.sendTime > this.config.messageTimeout) {\n        // Delivering the message has failed, as the target window did not pick it up in time\n        // The type of message doesn't matter for that\n        delete this.outboxCache[messageId];\n        if (this.messageTracker[messageId]) {\n          this.messageTracker[messageId].error('Timeout');\n        }\n        delete this.messageTracker[messageId];\n      } else if (message.type === MessageType.MESSAGE && message.send === false) {\n        if (message.payload !== undefined && message.payload !== true) {\n          // Message has a payload that has not been moved yet, so move that in a separate localstorage key\n          this.storageService.setLocalObject(this.generatePayloadKey(message), message.payload);\n          message.payload = true;\n        }\n        this.messageTracker[message.messageId].next(message.messageId);\n        // Set property to undefined, as we do not need to encode \"send:true\" in the localstorage json multiple times\n        message.send = undefined;\n      }\n    });\n\n    this.storageService.setLocalObject(this.generateWindowKey(this.myWindow.id), {\n      heartbeat: now,\n      id: this.myWindow.id,\n      name: this.myWindow.name,\n      messages: Object.keys(this.outboxCache).map(key => this.outboxCache[key]),\n    });\n\n    if (this.myWindow.heartbeat === -1) {\n      // This was the first heartbeat run for the local window, so rescan for known windows to get\n      // the current (new) window in the list\n      this.scanForWindows();\n    }\n\n    // Store the new heartbeat value in the local windowData copy\n    this.myWindow.heartbeat = now;\n  }\n\n  private scanForWindows = () => {\n    this.knownWindows = this.storageService.getLocalObjects<WindowData>(\n      this.storageService.getLocalItemKeys().filter((key) => this.isWindowKey(key)))\n      .map(({id, name, heartbeat}: WindowData) => {\n        return {\n          id,\n          name,\n          heartbeat,\n          stalled: new Date().getTime() - heartbeat > this.config.heartbeat * 2,\n          self: this.myWindow.id === id,\n        };\n      });\n    this.windowSubject.next(this.knownWindows);\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { ModuleWithProviders, NgModule } from '@angular/core';\n\nimport { MultiWindowService } from './providers/multi-window.service';\nimport { StorageService } from './providers/storage.service';\nimport { NGXMW_CONFIG } from './providers/config.provider';\nimport { MultiWindowConfig } from './types/multi-window.config';\nimport { WindowRef } from './providers/window.provider';\n\n@NgModule({\n  imports: [CommonModule],\n  providers: [\n    StorageService,\n    MultiWindowService,\n    WindowRef,\n    {provide: NGXMW_CONFIG, useValue: {}},\n  ],\n})\nexport class MultiWindowModule {\n  static forRoot(config?: MultiWindowConfig): ModuleWithProviders<MultiWindowModule> {\n    return {\n      ngModule: MultiWindowModule,\n      providers: [MultiWindowService, {provide: NGXMW_CONFIG, useValue: config}],\n    };\n  }\n}\n","/*\n * Public API Surface of ngx-multi-window\n */\n\nexport * from './lib/multi-window.module';\n\nexport * from './lib/providers/config.provider';\nexport * from './lib/providers/multi-window.service';\nexport * from './lib/providers/storage.service';\nexport * from './lib/providers/window.provider';\n\nexport * from './lib/types/message.type';\nexport * from './lib/types/multi-window.config';\nexport * from './lib/types/window-save-strategy.enum';\nexport * from './lib/types/window.type';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2.StorageService","i3.WindowRef"],"mappings":"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"}