UNPKG

@rxap/firebase

Version:

This package provides Angular modules and services to integrate with Firebase, including App Check, Messaging, and Storage. It offers providers for configuring Firebase options and emulators, as well as an HTTP interceptor for App Check. The package also

412 lines (346 loc) 15.3 kB
<!doctype html> <html class="no-js" lang=""> <head> <meta charset="utf-8"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <title>angular-firebase</title> <meta name="description" content=""> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="icon" type="image/x-icon" href="../images/favicon.ico"> <link rel="stylesheet" href="../styles/style.css"> <link rel="stylesheet" href="../styles/dark.css"> </head> <body> <script> // Blocking script to avoid flickering dark mode // Dark mode toggle button var useDark = window.matchMedia('(prefers-color-scheme: dark)'); var darkModeState = useDark.matches; var $darkModeToggleSwitchers = document.querySelectorAll('.dark-mode-switch input'); var $darkModeToggles = document.querySelectorAll('.dark-mode-switch'); var darkModeStateLocal = localStorage.getItem('compodoc_darkmode-state'); function checkToggle(check) { for (var i = 0; i < $darkModeToggleSwitchers.length; i++) { $darkModeToggleSwitchers[i].checked = check; } } function toggleDarkMode(state) { if (window.localStorage) { localStorage.setItem('compodoc_darkmode-state', state); } checkToggle(state); const hasClass = document.body.classList.contains('dark'); if (state) { for (var i = 0; i < $darkModeToggles.length; i++) { $darkModeToggles[i].classList.add('dark'); } if (!hasClass) { document.body.classList.add('dark'); } } else { for (var i = 0; i < $darkModeToggles.length; i++) { $darkModeToggles[i].classList.remove('dark'); } if (hasClass) { document.body.classList.remove('dark'); } } } useDark.addEventListener('change', function (evt) { toggleDarkMode(evt.matches); }); if (darkModeStateLocal) { darkModeState = darkModeStateLocal === 'true'; } toggleDarkMode(darkModeState); </script> <div class="navbar navbar-default navbar-fixed-top d-md-none p-0"> <div class="d-flex"> <a href="../" class="navbar-brand">angular-firebase</a> <button type="button" class="btn btn-default btn-menu ion-ios-menu" id="btn-menu"></button> </div> </div> <div class="xs-menu menu" id="mobile-menu"> <div id="book-search-input" role="search"><input type="text" placeholder="Type to search"></div> <compodoc-menu></compodoc-menu> </div> <div class="container-fluid main"> <div class="row main"> <div class="d-none d-md-block menu"> <compodoc-menu mode="normal"></compodoc-menu> </div> <!-- START CONTENT --> <div class="content module"> <div class="content-data"> <ol class="breadcrumb"> <li class="breadcrumb-item">Modules</li> <li class="breadcrumb-item" >RxapAngularFireAppCheckModule</li> </ol> <div class="text-center module-graph-container"> <div id="module-graph-svg"> <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!-- Generated by graphviz version 2.47.0 (20210316.0004) --> <!-- Title: dependencies Pages: 1 --> <svg width="504pt" height="211pt" viewBox="0.00 0.00 504.00 211.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 207)"> <title>dependencies</title> <polygon fill="white" stroke="transparent" points="-4,4 -4,-207 500,-207 500,4 -4,4"/> <text text-anchor="start" x="227.01" y="-42.4" font-family="Times-12" font-weight="bold" font-size="14.00">Legend</text> <polygon fill="#ffffb3" stroke="transparent" points="14,-10 14,-30 34,-30 34,-10 14,-10"/> <text text-anchor="start" x="37.63" y="-15.4" font-family="Times-12" font-size="14.00"> &#160;Declarations</text> <polygon fill="#8dd3c7" stroke="transparent" points="127,-10 127,-30 147,-30 147,-10 127,-10"/> <text text-anchor="start" x="150.73" y="-15.4" font-family="Times-12" font-size="14.00"> &#160;Module</text> <polygon fill="#80b1d3" stroke="transparent" points="213,-10 213,-30 233,-30 233,-10 213,-10"/> <text text-anchor="start" x="236.78" y="-15.4" font-family="Times-12" font-size="14.00"> &#160;Bootstrap</text> <polygon fill="#fdb462" stroke="transparent" points="310,-10 310,-30 330,-30 330,-10 310,-10"/> <text text-anchor="start" x="333.67" y="-15.4" font-family="Times-12" font-size="14.00"> &#160;Providers</text> <polygon fill="#fb8072" stroke="transparent" points="406,-10 406,-30 426,-30 426,-10 406,-10"/> <text text-anchor="start" x="429.73" y="-15.4" font-family="Times-12" font-size="14.00"> &#160;Exports</text> <g id="clust1" class="cluster"> <title>cluster_RxapAngularFireAppCheckModule</title> <polygon fill="none" stroke="black" stroke-dasharray="1,5" points="131,-70 131,-195 365,-195 365,-70 131,-70"/> </g> <g id="clust6" class="cluster"> <title>cluster_RxapAngularFireAppCheckModule_providers</title> <polygon fill="none" stroke="black" points="159,-78 159,-130 337,-130 337,-78 159,-78"/> </g> <!-- AppCheckService --> <g id="node1" class="node"> <title>AppCheckService</title> <ellipse fill="#fdb462" stroke="black" cx="248" cy="-104" rx="81.08" ry="18"/> <text text-anchor="middle" x="248" y="-99.8" font-family="Times,serif" font-size="14.00">AppCheckService</text> </g> <!-- RxapAngularFireAppCheckModule --> <g id="node2" class="node"> <title>RxapAngularFireAppCheckModule</title> <polygon fill="#8dd3c7" stroke="black" points="356.89,-187 353.89,-191 332.89,-191 329.89,-187 139.11,-187 139.11,-151 356.89,-151 356.89,-187"/> <text text-anchor="middle" x="248" y="-164.8" font-family="Times,serif" font-size="14.00">RxapAngularFireAppCheckModule</text> </g> <!-- AppCheckService&#45;&gt;RxapAngularFireAppCheckModule --> <g id="edge1" class="edge"> <title>AppCheckService&#45;&gt;RxapAngularFireAppCheckModule</title> <path fill="none" stroke="black" d="M248,-122.11C248,-122.11 248,-140.99 248,-140.99"/> <polygon fill="black" stroke="black" points="244.5,-140.99 248,-150.99 251.5,-140.99 244.5,-140.99"/> </g> </g> </svg> </div> <i id="fullscreen" class="icon ion-ios-resize module-graph-fullscreen-btn" aria-hidden="true"></i> <div class="btn-group size-buttons"> <button id="zoom-in" class="btn btn-default btn-sm">Zoom in</button> <button id="reset" class="btn btn-default btn-sm">Reset</button> <button id="zoom-out" class="btn btn-default btn-sm">Zoom out</button> </div> </div> <script src="../js/libs/svg-pan-zoom.min.js"></script> <script src="../js/svg-pan-zoom.controls.js"></script> <ul class="nav nav-tabs" role="tablist"> <li class="nav-item"> <a href="#info" class="nav-link" class="nav-link active" role="tab" id="info-tab" data-bs-toggle="tab" data-link="info">Info</a> </li> <li class="nav-item"> <a href="#source" class="nav-link" role="tab" id="source-tab" data-bs-toggle="tab" data-link="source">Source</a> </li> </ul> <div class="tab-content"> <div class="tab-pane fade active in" id="info"> <p class="comment"> <h3>File</h3> </p> <p class="comment"> <code>src/lib/app-check.ts</code> </p> <div class="container-fluid module"> <div class="row"> <div class="col-sm-3"> <h3>Providers<a href="https://angular.io/api/core/NgModule#providers" target="_blank" rel="noopener noreferrer" title="Official documentation about module providers"><span class="icon ion-ios-information-circle-outline"></a></h3> <ul class="list-group"> <li class="list-group-item"> <a href="../injectables/AppCheckService.html">AppCheckService</a> </li> </ul> </div> </div> </div> </div> <div class="tab-pane fade tab-source-code" id="source"> <pre class="line-numbers compodoc-sourcecode"><code class="language-typescript">import { Inject, Injectable, isDevMode, NgModule, NgZone, Optional, } from &#x27;@angular/core&#x27;; import { ConfigService } from &#x27;@rxap/config&#x27;; import { EMPTY, Observable, } from &#x27;rxjs&#x27;; import { shareReplay } from &#x27;rxjs/operators&#x27;; import { FIREBASE_APP_NAME, FIREBASE_OPTIONS, ɵfirebaseAppFactory, } from &#x27;@angular/fire/compat&#x27;; import { FirebaseOptions } from &#x27;firebase/app&#x27;; import { AppCheck, AppCheckTokenResult, getToken, onTokenChanged, setTokenAutoRefreshEnabled, } from &#x27;@angular/fire/app-check&#x27;; import { APP_CHECK_ENABLED, APP_CHECK_IS_TOKEN_AUTO_REFRESH_ENABLED, APP_CHECK_SITE_KEY, } from &#x27;./tokens&#x27;; @Injectable() export class AppCheckService { public readonly onTokenChanged$: Observable&lt;AppCheckTokenResult&gt; &#x3D; EMPTY; private readonly _appCheck: AppCheck | null &#x3D; null; constructor( @Inject(FIREBASE_OPTIONS) options: FirebaseOptions, @Optional() @Inject(FIREBASE_APP_NAME) nameOrConfig: string, @Inject(NgZone) zone: NgZone, private readonly config: ConfigService, @Optional() @Inject(APP_CHECK_ENABLED) private readonly enabled: boolean | null, @Optional() @Inject(APP_CHECK_SITE_KEY) siteKey: string | null, @Optional() @Inject(APP_CHECK_IS_TOKEN_AUTO_REFRESH_ENABLED) isTokenAutoRefreshEnabled: boolean | null, ) { if (this.enabled) { if (siteKey) { const app: any &#x3D; ɵfirebaseAppFactory(options, zone, nameOrConfig); const appCheck &#x3D; this._appCheck &#x3D; app.appCheck(); appCheck.activate( siteKey, isTokenAutoRefreshEnabled ?? undefined, ); this.onTokenChanged$ &#x3D; (new Observable&lt;AppCheckTokenResult&gt;(subscriber &#x3D;&gt; { onTokenChanged( appCheck, tokenResult &#x3D;&gt; subscriber.next(tokenResult), error &#x3D;&gt; subscriber.error(error), () &#x3D;&gt; subscriber.complete(), ); })).pipe( shareReplay(1), ); } else { if (isDevMode()) { console.error(&#x27;The app check site key is not provided&#x27;); } } } else { if (isDevMode()) { console.warn(&#x27;App check is disabled&#x27;); } } } public getToken(forceRefresh?: boolean): Promise&lt;string&gt; { if (this._appCheck) { return getToken(this._appCheck, forceRefresh).then(result &#x3D;&gt; result.token) ?? Promise.reject(new Error(&#x27;firebase app check is not initialized&#x27;)); } return Promise.reject(new Error(&#x27;firebase app check is not initialized&#x27;)); } public setTokenAutoRefreshEnabled(isTokenAutoRefreshEnabled: boolean): void { if (this._appCheck) { setTokenAutoRefreshEnabled(this._appCheck, isTokenAutoRefreshEnabled); } } } @NgModule({ providers: [ AppCheckService ], }) export class RxapAngularFireAppCheckModule { constructor( @Inject(AppCheckService) public readonly appCheck: AppCheckService, ) { } } </code></pre> </div> </div> </div><div class="search-results"> <div class="has-results"> <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1> <ul class="search-results-list"></ul> </div> <div class="no-results"> <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1> </div> </div> </div> <!-- END CONTENT --> </div> </div> <label class="dark-mode-switch"> <input type="checkbox"> <span class="slider"> <svg class="slider-icon" viewBox="0 0 24 24" fill="none" height="20" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" width="20" xmlns="http://www.w3.org/2000/svg"> <path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"></path> </svg> </span> </label> <script> var COMPODOC_CURRENT_PAGE_DEPTH = 1; var COMPODOC_CURRENT_PAGE_CONTEXT = 'module'; var COMPODOC_CURRENT_PAGE_URL = 'RxapAngularFireAppCheckModule.html'; var MAX_SEARCH_RESULTS = 15; </script> <script> $darkModeToggleSwitchers = document.querySelectorAll('.dark-mode-switch input'); checkToggle(darkModeState); if ($darkModeToggleSwitchers.length > 0) { for (var i = 0; i < $darkModeToggleSwitchers.length; i++) { $darkModeToggleSwitchers[i].addEventListener('change', function (event) { darkModeState = !darkModeState; toggleDarkMode(darkModeState); }); } } </script> <script src="../js/libs/custom-elements.min.js"></script> <script src="../js/libs/lit-html.js"></script> <script src="../js/menu-wc.js" defer></script> <script nomodule src="../js/menu-wc_es5.js" defer></script> <script src="../js/libs/bootstrap-native.js"></script> <script src="../js/libs/es6-shim.min.js"></script> <script src="../js/libs/EventDispatcher.js"></script> <script src="../js/libs/promise.min.js"></script> <script src="../js/libs/zepto.min.js"></script> <script src="../js/compodoc.js"></script> <script src="../js/tabs.js"></script> <script src="../js/menu.js"></script> <script src="../js/libs/clipboard.min.js"></script> <script src="../js/libs/prism.js"></script> <script src="../js/sourceCode.js"></script> <script src="../js/search/search.js"></script> <script src="../js/search/lunr.min.js"></script> <script src="../js/search/search-lunr.js"></script> <script src="../js/search/search_index.js"></script> <script src="../js/lazy-load-graphs.js"></script> </body> </html>