Skip to content

Commit b079c53

Browse files
committed
Renamed files
1 parent e476774 commit b079c53

File tree

8 files changed

+109
-83
lines changed

8 files changed

+109
-83
lines changed

packages/data-connect/src/api/DataConnect.ts

Lines changed: 48 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@ import {
3131
} from '@firebase/util';
3232

3333
import { Cache as DataConnectCache } from '../cache/Cache';
34-
import { CacheProvider } from '../cache/CacheProvider';
35-
import { IndexedDBCacheProvider } from '../cache/IndexedDBCacheProvider';
3634
import { AppCheckTokenProvider } from '../core/AppCheckTokenProvider';
3735
import { Code, DataConnectError } from '../core/error';
3836
import {
@@ -88,7 +86,7 @@ export function parseOptions(fullHost: string): TransportOptions {
8886
/**
8987
* DataConnectOptions including project id
9088
*/
91-
export interface DataConnectOptions extends ConnectorConfig {
89+
export interface DataConnectOptions extends ConnectorConfig, DataConnectInitOptions {
9290
projectId: string;
9391
}
9492

@@ -124,7 +122,7 @@ export class DataConnect {
124122
this._transportOptions = parseOptions(host);
125123
}
126124
}
127-
this.cache = new DataConnectCache();
125+
this.cache = new DataConnectCache(this.dataConnectOptions.cacheSettings);
128126
}
129127
// @internal
130128
_useGeneratedSdk(): void {
@@ -257,48 +255,71 @@ export function connectDataConnectEmulator(
257255
dc.enableEmulator({ host, port, sslEnabled });
258256
}
259257

260-
export interface DataConnectConfigureOptions {
261-
cacheProvider: CacheProvider
258+
// TODO: Can we do something to make sure that this is more tree-shakable?
259+
export enum Storage {
260+
memory,
261+
persistent
262+
}
263+
264+
export interface CacheSettings {
265+
storage: Storage;
266+
maxSizeBytes: number;
267+
}
268+
269+
export interface DataConnectInitOptions {
270+
cacheSettings?: CacheSettings;
262271
}
263272

264273
/**
265274
* Initialize DataConnect instance
266275
* @param options ConnectorConfig
267276
*/
277+
export function getDataConnect(options: ConnectorConfig, extraOptions?: DataConnectInitOptions): DataConnect;
268278
export function getDataConnect(options: ConnectorConfig): DataConnect;
269-
/**
279+
/**
270280
* Initialize DataConnect instance
271281
* @param app FirebaseApp to initialize to.
272-
* @param options ConnectorConfig
282+
* @param connectorConfig ConnectorConfig
283+
*/
284+
export function getDataConnect(
285+
app: FirebaseApp,
286+
connectorConfig: ConnectorConfig,
287+
): DataConnect;
288+
289+
/**
290+
* Initialize DataConnect instance
291+
* @param app FirebaseApp to initialize to.
292+
* @param connectorConfig ConnectorConfig
273293
*/
274294
export function getDataConnect(
275295
app: FirebaseApp,
276-
options: ConnectorConfig,
277-
additionalOptions?: DataConnectConfigureOptions
296+
connectorConfig: ConnectorConfig,
297+
extraOptions: DataConnectInitOptions
278298
): DataConnect;
299+
279300
export function getDataConnect(
280-
appOrOptions: FirebaseApp | ConnectorConfig,
281-
optionalOptionsOrCacheOptions?: ConnectorConfig | DataConnectConfigureOptions,
282-
additionalOptionsOrCacheOptions?: DataConnectConfigureOptions
301+
appOrConnectorConfig: FirebaseApp | ConnectorConfig,
302+
optionsOrConnectorConfig?: ConnectorConfig | DataConnectInitOptions,
303+
extraOptions?: DataConnectInitOptions
283304
): DataConnect {
284305
let app: FirebaseApp;
285-
let dcOptions: ConnectorConfig;
286-
let cacheOptions: DataConnectConfigureOptions;
287-
if ('location' in appOrOptions) {
288-
dcOptions = appOrOptions;
306+
let connectorConfig: ConnectorConfig;
307+
let options: DataConnectInitOptions;
308+
if ('location' in appOrConnectorConfig) {
309+
connectorConfig = appOrConnectorConfig;
289310
app = getApp();
290-
cacheOptions = optionalOptionsOrCacheOptions as DataConnectConfigureOptions;
311+
options = optionsOrConnectorConfig as DataConnectInitOptions;
291312
} else {
292-
dcOptions = optionalOptionsOrCacheOptions as ConnectorConfig;
293-
cacheOptions = additionalOptionsOrCacheOptions as DataConnectConfigureOptions;
294-
app = appOrOptions;
295-
}
296-
// TODO: initialize data connect with this.
297-
if(!cacheOptions) {
298-
// TODO: Make this a class that gets passed in.
299-
cacheOptions.cacheProvider = new IndexedDBCacheProvider();
313+
app = appOrConnectorConfig;
314+
connectorConfig = optionsOrConnectorConfig as ConnectorConfig;
315+
options = extraOptions as DataConnectInitOptions;
300316
}
301317

318+
const dcOptions = {
319+
...options,
320+
connectorConfig
321+
};
322+
302323
if (!app || Object.keys(app).length === 0) {
303324
app = getApp();
304325
}
@@ -313,7 +334,7 @@ export function getDataConnect(
313334
return dcInstance;
314335
}
315336
}
316-
validateDCOptions(dcOptions);
337+
validateDCOptions(connectorConfig);
317338

318339
logDebug('Creating new DataConnect instance');
319340
// Initialize with options.

packages/data-connect/src/cache/Cache.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
import { isIndexedDBAvailable } from '@firebase/util';
22

3+
import { CacheSettings, Storage } from '../api';
34
import { DataConnectError } from '../core/error';
45
import { type AuthTokenProvider } from '../core/FirebaseAuthProvider';
6+
import { logDebug } from '../logger';
57

6-
import { BackingDataObject } from './BackingDataObject';
78
import { CacheProvider } from './CacheProvider';
9+
import { EntityDataObject } from './EntityDataObject';
810
import { ImpactedQueryRefsAccumulator } from './ImpactedQueryRefsAccumulator';
911
import { IndexedDBCacheProvider } from './IndexedDBCacheProvider';
1012
import { ResultTree } from './ResultTree';
1113
import { ResultTreeProcessor } from './ResultTreeProcessor';
1214

13-
1415
export interface ServerValues {
1516
ttl: number;
1617
}
@@ -29,13 +30,17 @@ export class Cache {
2930
this.initializeNewProviders();
3031
}
3132
initializeNewProviders(): void {
32-
if (!isIndexedDBAvailable()) {
33+
if(this.cacheSettings) {
34+
this.cacheProvider = this.cacheSettings.storage === Storage.persistent ? new IndexedDBCacheProvider() : new EphemeralCacheProvider();
35+
} else if (!isIndexedDBAvailable()) {
36+
logDebug('IndexedDB is not available. Using In-Memory Cache Provider instead.');
3337
this.cacheProvider = new EphemeralCacheProvider();
3438
} else {
39+
logDebug('Initializing IndexedDB Cache Provider.');
3540
this.cacheProvider = new IndexedDBCacheProvider();
3641
}
3742
}
38-
constructor() {
43+
constructor(private cacheSettings?: CacheSettings) {
3944
this.initializeNewProviders();
4045
}
4146
containsResultTree(queryId: string): boolean {
@@ -74,7 +79,7 @@ export class Cache {
7479
}
7580

7681
class EphemeralCacheProvider implements CacheProvider {
77-
private bdos = new Map<string, BackingDataObject>();
82+
private bdos = new Map<string, EntityDataObject>();
7883
private resultTrees = new Map<string, ResultTree>();
7984

8085
setResultTree(queryId: string, rt: ResultTree): void {
@@ -87,12 +92,12 @@ class EphemeralCacheProvider implements CacheProvider {
8792
createGlobalId(): string {
8893
return crypto.randomUUID();
8994
}
90-
updateBackingData(backingData: BackingDataObject): void {
95+
updateBackingData(backingData: EntityDataObject): void {
9196
this.bdos.set(backingData.globalID, backingData);
9297
}
93-
getBdo(globalId: string): BackingDataObject {
98+
getBdo(globalId: string): EntityDataObject {
9499
if (!this.bdos.has(globalId)) {
95-
this.bdos.set(globalId, new BackingDataObject(globalId));
100+
this.bdos.set(globalId, new EntityDataObject(globalId));
96101
}
97102
// Because of the above, we can guarantee that there will be a BDO at the globalId.
98103
return this.bdos.get(globalId)!;

packages/data-connect/src/cache/CacheProvider.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { BackingDataObject } from "./BackingDataObject";
1+
import { EntityDataObject } from "./EntityDataObject";
22
import { ResultTree } from "./ResultTree";
33

44
export interface CacheProvider {
5-
getBdo(globalId: string): BackingDataObject;
6-
updateBackingData(backingData: BackingDataObject): void;
5+
getBdo(globalId: string): EntityDataObject;
6+
updateBackingData(backingData: EntityDataObject): void;
77
createGlobalId(): string;
88
getResultTree(queryId: string): ResultTree | undefined;
99
setResultTree(queryId: string, resultTree: ResultTree): void;

packages/data-connect/src/cache/BackingDataObject.ts renamed to packages/data-connect/src/cache/EntityDataObject.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,16 @@ export interface BackingDataObjectJson {
66
globalID: string;
77
}
88

9-
export class BackingDataObject {
9+
export class EntityDataObject {
1010
toStorableJson(): BackingDataObjectJson {
1111
return {
1212
globalID: this.globalID,
1313
map: this.map,
1414
queriesReferenced: this.queriesReferenced
1515
};
1616
}
17-
static fromStorableJson(json: BackingDataObjectJson): BackingDataObject {
18-
const bdo = new BackingDataObject(json.globalID);
17+
static fromStorableJson(json: BackingDataObjectJson): EntityDataObject {
18+
const bdo = new EntityDataObject(json.globalID);
1919
bdo.map = new Map<string, FDCScalarValue>(json.map);
2020
bdo.queriesReferenced = json.queriesReferenced;
2121
return bdo;

packages/data-connect/src/cache/StubDataObject.ts renamed to packages/data-connect/src/cache/EntityNode.ts

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
import { DataConnectError } from '../api';
22

3-
import { BackingDataObject, BackingDataObjectJson, FDCScalarValue } from './BackingDataObject';
43
import { CacheProvider } from './CacheProvider';
4+
import { EntityDataObject, BackingDataObjectJson, FDCScalarValue } from './EntityDataObject';
55
import { ImpactedQueryRefsAccumulator } from './ImpactedQueryRefsAccumulator';
66

77
export const GLOBAL_ID_KEY = 'cacheId';
8-
export class StubDataObject {
9-
backingData?: BackingDataObject;
8+
export class EntityNode {
9+
entityData?: EntityDataObject;
1010
scalars: { [key: string]: FDCScalarValue } = {};
11-
references: { [key: string]: StubDataObject } = {};
11+
references: { [key: string]: EntityNode } = {};
1212
objectLists: {
13-
[key: string]: StubDataObject[];
13+
[key: string]: EntityNode[];
1414
} = {};
1515
globalId?: string;
1616
impactedQueryRefs = new Set<string>();
@@ -24,7 +24,7 @@ export class StubDataObject {
2424
if (typeof values !== 'object' || Array.isArray(values)) {
2525
throw new DataConnectError(
2626
'invalid-argument',
27-
'StubDataObject initialized with non-object value'
27+
'EntityNode initialized with non-object value'
2828
);
2929
}
3030
if (values === null) {
@@ -36,7 +36,7 @@ export class StubDataObject {
3636
typeof values[GLOBAL_ID_KEY] === 'string'
3737
) {
3838
this.globalId = values[GLOBAL_ID_KEY];
39-
this.backingData = cacheProvider.getBdo(this.globalId);
39+
this.entityData = cacheProvider.getBdo(this.globalId);
4040
}
4141
for (const key in values) {
4242
if (values.hasOwnProperty(key)) {
@@ -45,14 +45,14 @@ export class StubDataObject {
4545
}
4646
if (typeof values[key] === 'object') {
4747
if (Array.isArray(values[key])) {
48-
const objArray: StubDataObject[] = [];
48+
const objArray: EntityNode[] = [];
4949
const scalarArray: Array<NonNullable<FDCScalarValue>> = [];
5050
for (const value of values[key]) {
5151
if (typeof value === 'object') {
5252
if (Array.isArray(value)) {
5353
// TODO: What if it's an array of arrays?
5454
} else {
55-
objArray.push(new StubDataObject(value, cacheProvider, this.acc));
55+
objArray.push(new EntityNode(value, cacheProvider, this.acc));
5656
}
5757
} else {
5858
scalarArray.push(value);
@@ -65,8 +65,8 @@ export class StubDataObject {
6565
);
6666
}
6767
if (scalarArray.length > 0) {
68-
if (this.backingData) {
69-
const impactedRefs = this.backingData.updateServerValue(key, scalarArray);
68+
if (this.entityData) {
69+
const impactedRefs = this.entityData.updateServerValue(key, scalarArray);
7070
this.acc.add(impactedRefs);
7171
} else {
7272
this.scalars[key] = scalarArray;
@@ -81,17 +81,17 @@ export class StubDataObject {
8181
this.scalars[key] = null;
8282
continue;
8383
}
84-
const stubDataObject = new StubDataObject(
84+
const stubDataObject = new EntityNode(
8585
values[key],
8686
cacheProvider,
8787
this.acc
8888
);
8989
this.references[key] = stubDataObject;
9090
}
9191
} else {
92-
if (this.backingData) {
92+
if (this.entityData) {
9393
// TODO: Track only the fields we need for the BDO
94-
const impactedRefs = this.backingData.updateServerValue(
94+
const impactedRefs = this.entityData.updateServerValue(
9595
key,
9696
values[key]
9797
);
@@ -102,15 +102,15 @@ export class StubDataObject {
102102
}
103103
}
104104
}
105-
if (this.backingData) {
106-
cacheProvider.updateBackingData(this.backingData);
105+
if (this.entityData) {
106+
cacheProvider.updateBackingData(this.entityData);
107107
}
108108
}
109109
toJson(): object {
110110
const resultObject: object = {};
111-
for (const key in this.backingData) {
112-
if (this.backingData.hasOwnProperty(key)) {
113-
resultObject[key] = this.backingData[key];
111+
for (const key in this.entityData) {
112+
if (this.entityData.hasOwnProperty(key)) {
113+
resultObject[key] = this.entityData[key];
114114
}
115115
}
116116
// Scalars should never have stubdataobjects
@@ -133,23 +133,23 @@ export class StubDataObject {
133133
}
134134
return resultObject;
135135
}
136-
static parseMap(map: {[key: string]: StubDataObject | StubDataObject[] | FDCScalarValue}, isSdo = false): typeof map {
136+
static parseMap(map: {[key: string]: EntityNode | EntityNode[] | FDCScalarValue}, isSdo = false): typeof map {
137137
const newMap: typeof map = {};
138138
for (const key in map) {
139139
if(map.hasOwnProperty(key)) {
140140
if(Array.isArray(map[key])) {
141-
newMap[key] = map[key].map(value => isSdo ? StubDataObject.fromStorableJson(value) : value);
141+
newMap[key] = map[key].map(value => isSdo ? EntityNode.fromStorableJson(value) : value);
142142
} else {
143-
newMap[key] = isSdo ? StubDataObject.fromStorableJson(map[key] as StubDataObjectJson) : map[key];
143+
newMap[key] = isSdo ? EntityNode.fromStorableJson(map[key] as StubDataObjectJson) : map[key];
144144
}
145145
}
146146
}
147147
return newMap;
148148
}
149-
static fromStorableJson(obj: StubDataObjectJson): StubDataObject {
150-
const sdo = new StubDataObject();
149+
static fromStorableJson(obj: StubDataObjectJson): EntityNode {
150+
const sdo = new EntityNode();
151151
if(obj.backingData) {
152-
sdo.backingData = BackingDataObject.fromStorableJson(obj.backingData);
152+
sdo.entityData = EntityDataObject.fromStorableJson(obj.backingData);
153153
}
154154
sdo.acc = new ImpactedQueryRefsAccumulator();
155155
sdo.globalId = obj.globalID;
@@ -159,7 +159,7 @@ export class StubDataObject {
159159
sdo.objectLists = this.parseMap(obj.objectLists, true) as typeof sdo.objectLists;
160160
return sdo;
161161
}
162-
getStorableMap(map: {[key: string]: StubDataObject | StubDataObject[]}): {[key: string]: StubDataObjectJson | StubDataObjectJson[]} {
162+
getStorableMap(map: {[key: string]: EntityNode | EntityNode[]}): {[key: string]: StubDataObjectJson | StubDataObjectJson[]} {
163163
const newMap: {[key: string]: StubDataObjectJson | StubDataObjectJson[]} = {};
164164
for (const key in map) {
165165
if(map.hasOwnProperty(key)) {
@@ -179,8 +179,8 @@ export class StubDataObject {
179179
references: this.getStorableMap(this.references) as StubDataObjectJson['references'],
180180
objectLists: this.getStorableMap(this.objectLists) as StubDataObjectJson['objectLists']
181181
};
182-
if(this.backingData) {
183-
obj.backingData = this.backingData.toStorableJson();
182+
if(this.entityData) {
183+
obj.backingData = this.entityData.toStorableJson();
184184
}
185185
return obj;
186186
}

0 commit comments

Comments
 (0)