https://github.com/angular/angular
Raw File
Tip revision: 4cfb06086b70234c8da9720c3b71868fe4548dc8 authored by Jessica Janiuk on 14 November 2022, 19:57:50 UTC
release: cut the v15.0.0-rc.4 release
Tip revision: 4cfb060
storage.service.ts
import { InjectionToken, StaticProvider } from '@angular/core';
import { WindowToken } from './window';

export const LocalStorage = new InjectionToken<Storage>('LocalStorage');
export const SessionStorage = new InjectionToken<Storage>('SessionStorage');

export const STORAGE_PROVIDERS: StaticProvider[] = [
  { provide: LocalStorage, useFactory: (win: Window) => getStorage(win, 'localStorage'), deps: [WindowToken] },
  { provide: SessionStorage, useFactory: (win: Window) => getStorage(win, 'sessionStorage'), deps: [WindowToken] },
];

export class NoopStorage implements Storage {
  length = 0;
  clear() {}
  getItem() { return null; }
  key() { return null; }
  removeItem() {}
  setItem() {}
}

function getStorage(win: Window, storageType: 'localStorage' | 'sessionStorage'): Storage {
  // When cookies are disabled in the browser, even trying to access `window[storageType]` throws an
  // error. If so, return a no-op storage.
  try {
    return win[storageType];
  } catch {
    return new NoopStorage();
  }
}
back to top