@@ -30,14 +30,14 @@ import {
3030 updateEmulatorBanner
3131} from '@firebase/util' ;
3232
33- import { Cache as DataConnectCache } from '../cache/Cache' ;
33+ import { CacheSettings , DataConnectCache , InMemoryCacheProvider } from '../cache/Cache' ;
3434import { AppCheckTokenProvider } from '../core/AppCheckTokenProvider' ;
3535import { Code , DataConnectError } from '../core/error' ;
3636import {
3737 AuthTokenProvider ,
3838 FirebaseAuthProvider
3939} from '../core/FirebaseAuthProvider' ;
40- import { QueryManager } from '../core/QueryManager' ;
40+ import { QueryManager } from '../core/query/ QueryManager' ;
4141import { logDebug , logError } from '../logger' ;
4242import {
4343 CallerSdkType ,
@@ -46,8 +46,11 @@ import {
4646 TransportClass
4747} from '../network' ;
4848import { RESTTransport } from '../network/transport/rest' ;
49+ import { PROD_HOST } from '../util/url' ;
4950
5051import { MutationManager } from './Mutation' ;
52+ import { IndexedDBCacheProvider } from '../cache/IndexedDBCacheProvider' ;
53+ import { CacheProvider } from '../cache/CacheProvider' ;
5154
5255/**
5356 * Connector Config for calling Data Connect backend.
@@ -86,7 +89,7 @@ export function parseOptions(fullHost: string): TransportOptions {
8689/**
8790 * DataConnectOptions including project id
8891 */
89- export interface DataConnectOptions extends ConnectorConfig , DataConnectInitOptions {
92+ export interface DataConnectOptions extends ConnectorConfig , DataConnectSettings {
9093 projectId : string ;
9194}
9295
@@ -122,7 +125,6 @@ export class DataConnect {
122125 this . _transportOptions = parseOptions ( host ) ;
123126 }
124127 }
125- this . cache = new DataConnectCache ( this . dataConnectOptions . cacheSettings ) ;
126128 }
127129 // @internal
128130 _useGeneratedSdk ( ) : void {
@@ -168,16 +170,23 @@ export class DataConnect {
168170 this . app . options ,
169171 this . _authProvider
170172 ) ;
171- this . cache . setAuthProvider ( this . _authTokenProvider ) ;
173+
174+
172175 }
176+ const connectorConfig : ConnectorConfig = {
177+ connector : this . dataConnectOptions . connector ,
178+ service : this . dataConnectOptions . service ,
179+ location : this . dataConnectOptions . location
180+ } ;
181+ this . cache = new DataConnectCache ( this . _authTokenProvider , this . app . options . projectId , connectorConfig , this . _transportOptions . host || PROD_HOST , this . dataConnectOptions . cacheSettings ) ;
182+ this . cache . setAuthProvider ( this . _authTokenProvider ) ;
173183 if ( this . _appCheckProvider ) {
174184 this . _appCheckTokenProvider = new AppCheckTokenProvider (
175185 this . app ,
176186 this . _appCheckProvider
177187 ) ;
178188 }
179189
180- this . _initialized = true ;
181190 this . _transport = new this . _transportClass (
182191 this . dataConnectOptions ,
183192 this . app . options . apiKey ,
@@ -195,8 +204,10 @@ export class DataConnect {
195204 this . _transportOptions . sslEnabled
196205 ) ;
197206 }
207+
198208 this . _queryManager = new QueryManager ( this . _transport , this . cache , this ) ;
199209 this . _mutationManager = new MutationManager ( this . _transport ) ;
210+ this . _initialized = true ;
200211 }
201212
202213 // @internal
@@ -255,26 +266,36 @@ export function connectDataConnectEmulator(
255266 dc . enableEmulator ( { host, port, sslEnabled } ) ;
256267}
257268
258- // TODO: Can we do something to make sure that this is more tree-shakable?
259- export enum Storage {
260- memory ,
261- persistent
269+ export type CacheProviderImpl = PublicIndexedDbProvider | PublicEphemeralDbProvider ;
270+
271+ class PublicIndexedDbProvider {
272+
273+ /**
274+ * @internal
275+ */
276+ initializeProvider ( cacheId : string ) : CacheProvider {
277+ return new IndexedDBCacheProvider ( cacheId ) ;
278+ }
262279}
263280
264- export interface CacheSettings {
265- storage : Storage ;
266- maxSizeBytes : number ;
281+ class PublicEphemeralDbProvider {
282+ /**
283+ * @internal
284+ */
285+ initializeProvider ( cacheId : string ) : CacheProvider {
286+ return new InMemoryCacheProvider ( cacheId ) ;
287+ }
267288}
268289
269- export interface DataConnectInitOptions {
270- cacheSettings ?: CacheSettings ;
290+ export interface DataConnectSettings {
291+ cacheSettings ?: CacheProviderImpl ;
271292}
272293
273294/**
274295 * Initialize DataConnect instance
275296 * @param options ConnectorConfig
276297 */
277- export function getDataConnect ( options : ConnectorConfig , extraOptions ?: DataConnectInitOptions ) : DataConnect ;
298+ export function getDataConnect ( options : ConnectorConfig , settings ?: DataConnectSettings ) : DataConnect ;
278299export function getDataConnect ( options : ConnectorConfig ) : DataConnect ;
279300/**
280301 * Initialize DataConnect instance
@@ -294,36 +315,39 @@ export function getDataConnect(
294315export function getDataConnect (
295316 app : FirebaseApp ,
296317 connectorConfig : ConnectorConfig ,
297- extraOptions : DataConnectInitOptions
318+ settings : DataConnectSettings
298319) : DataConnect ;
299320
300321export function getDataConnect (
301322 appOrConnectorConfig : FirebaseApp | ConnectorConfig ,
302- optionsOrConnectorConfig ?: ConnectorConfig | DataConnectInitOptions ,
303- extraOptions ?: DataConnectInitOptions
323+ settingsOrConnectorConfig ?: ConnectorConfig | DataConnectSettings ,
324+ settings ?: DataConnectSettings
304325) : DataConnect {
305326 let app : FirebaseApp ;
306327 let connectorConfig : ConnectorConfig ;
307- let options : DataConnectInitOptions ;
328+ let realSettings : DataConnectSettings ;
308329 if ( 'location' in appOrConnectorConfig ) {
309330 connectorConfig = appOrConnectorConfig ;
310331 app = getApp ( ) ;
311- options = optionsOrConnectorConfig as DataConnectInitOptions ;
332+ realSettings = settingsOrConnectorConfig as DataConnectSettings ;
312333 } else {
313334 app = appOrConnectorConfig ;
314- connectorConfig = optionsOrConnectorConfig as ConnectorConfig ;
315- options = extraOptions as DataConnectInitOptions ;
335+ connectorConfig = settingsOrConnectorConfig as ConnectorConfig ;
336+ realSettings = settings as DataConnectSettings ;
316337 }
317338
318- const dcOptions = {
319- ...options ,
320- connectorConfig
321- } ;
339+
322340
323341 if ( ! app || Object . keys ( app ) . length === 0 ) {
324342 app = getApp ( ) ;
325343 }
344+ const dcOptions : DataConnectOptions = {
345+ ...realSettings ,
346+ ...connectorConfig ,
347+ projectId : app . options . projectId
348+ } ;
326349 const provider = _getProvider ( app , 'data-connect' ) ;
350+ // TODO: Deal with the parsing of these options properly.
327351 const identifier = JSON . stringify ( dcOptions ) ;
328352 if ( provider . isInitialized ( identifier ) ) {
329353 const dcInstance = provider . getImmediate ( { identifier } ) ;
0 commit comments