Skip to content

Commit 740a83f

Browse files
committed
Provide installations package via getProvider
1 parent f2995a6 commit 740a83f

File tree

5 files changed

+37
-18
lines changed

5 files changed

+37
-18
lines changed

packages/telemetry/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@
7171
"peerDependencies": {
7272
"@firebase/app": "0.x",
7373
"@firebase/app-types": "0.x",
74-
"@firebase/installations": "0.x",
7574
"@types/react": "17.x || 18.x || 19.x",
7675
"react": "17.x || 18.x || 19.x"
7776
},
@@ -91,6 +90,7 @@
9190
},
9291
"dependencies": {
9392
"@firebase/component": "0.7.0",
93+
"@firebase/installations": "0.6.19",
9494
"@opentelemetry/api": "1.9.0",
9595
"@opentelemetry/api-logs": "0.203.0",
9696
"@opentelemetry/exporter-logs-otlp-http": "0.203.0",

packages/telemetry/src/api.test.ts

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,12 @@ import { FirebaseAppCheckInternal } from '@firebase/app-check-interop-types';
3737
import { captureError, flush, getTelemetry } from './api';
3838
import { TelemetryService } from './service';
3939
import { registerTelemetry } from './register';
40+
import { _FirebaseInstallationsInternal } from '@firebase/installations';
4041

4142
const PROJECT_ID = 'my-project';
4243
const APP_ID = 'my-appid';
44+
const API_KEY = 'my-api-key';
45+
const FID = 'fid-1234';
4346

4447
const emittedLogs: LogRecord[] = [];
4548

@@ -68,7 +71,7 @@ const fakeTelemetry: Telemetry = {
6871
}
6972
},
7073
loggerProvider: fakeLoggerProvider,
71-
fid: 'fid-1234'
74+
fid: FID
7275
};
7376

7477
describe('Top level API', () => {
@@ -124,7 +127,7 @@ describe('Top level API', () => {
124127
expect(log.severityNumber).to.equal(SeverityNumber.ERROR);
125128
expect(log.body).to.equal('This is a test error');
126129
expect(log.attributes).to.deep.equal({
127-
'user.id': 'fid-1234',
130+
'user.id': FID,
128131
'error.type': 'TestError',
129132
'error.stack': '...stack trace...'
130133
});
@@ -141,7 +144,7 @@ describe('Top level API', () => {
141144
expect(log.severityNumber).to.equal(SeverityNumber.ERROR);
142145
expect(log.body).to.equal('error with no stack');
143146
expect(log.attributes).to.deep.equal({
144-
'user.id': 'fid-1234',
147+
'user.id': FID,
145148
'error.type': 'Error',
146149
'error.stack': 'No stack trace available'
147150
});
@@ -192,7 +195,7 @@ describe('Top level API', () => {
192195
await provider.shutdown();
193196

194197
expect(emittedLogs[0].attributes).to.deep.equal({
195-
'user.id': 'fid-1234',
198+
'user.id': FID,
196199
'error.type': 'TestError',
197200
'error.stack': '...stack trace...',
198201
'logging.googleapis.com/trace': `projects/${PROJECT_ID}/traces/my-trace`,
@@ -217,7 +220,7 @@ describe('Top level API', () => {
217220
expect(emittedLogs.length).to.equal(1);
218221
const log = emittedLogs[0];
219222
expect(log.attributes).to.deep.equal({
220-
'user.id': 'fid-1234',
223+
'user.id': FID,
221224
'error.type': 'TestError',
222225
'error.stack': '...stack trace...',
223226
strAttr: 'string attribute',
@@ -250,10 +253,10 @@ function getFakeApp(): FirebaseApp {
250253
new Component(
251254
'installations-internal',
252255
() => ({
253-
getId: () => Promise.resolve('fid-1234'),
254-
getToken: () => Promise.resolve('token-5678')
255-
}),
256-
ComponentType.PRIVATE
256+
getId: async () => 'FID',
257+
getToken: async () => 'authToken'
258+
}) as _FirebaseInstallationsInternal,
259+
ComponentType.PUBLIC
257260
)
258261
);
259262
_registerComponent(
@@ -265,7 +268,11 @@ function getFakeApp(): FirebaseApp {
265268
ComponentType.PUBLIC
266269
)
267270
);
268-
const app = initializeApp({});
271+
const app = initializeApp({
272+
projectId: PROJECT_ID,
273+
appId: APP_ID,
274+
apiKey: API_KEY
275+
});
269276
_addOrOverwriteComponent(
270277
app,
271278
//@ts-ignore

packages/telemetry/src/register.node.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ import { TELEMETRY_TYPE } from './constants';
2121
import { name, version } from '../package.json';
2222
import { TelemetryService } from './service';
2323
import { createLoggerProvider } from './logging/logger-provider';
24+
// This needs to be in the same file that calls `getProvider()` on the component
25+
// or it will get tree-shaken out.
26+
import '@firebase/installations';
2427

2528
export function registerTelemetry(): void {
2629
_registerComponent(
@@ -36,9 +39,10 @@ export function registerTelemetry(): void {
3639

3740
// getImmediate for FirebaseApp will always succeed
3841
const app = container.getProvider('app').getImmediate();
42+
const installationsProvider = container.getProvider('installations-internal').getImmediate();
3943
const loggerProvider = createLoggerProvider(app, endpointUrl);
4044

41-
return new TelemetryService(app, loggerProvider);
45+
return new TelemetryService(app, installationsProvider, loggerProvider);
4246
},
4347
ComponentType.PUBLIC
4448
).setMultipleInstances(true)

packages/telemetry/src/register.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ import { name, version } from '../package.json';
2222
import { TelemetryService } from './service';
2323
import { createLoggerProvider } from './logging/logger-provider';
2424
import { AppCheckProvider } from './logging/appcheck-provider';
25+
// This needs to be in the same file that calls `getProvider()` on the component
26+
// or it will get tree-shaken out.
27+
import '@firebase/installations';
2528

2629
export function registerTelemetry(): void {
2730
_registerComponent(
@@ -38,14 +41,15 @@ export function registerTelemetry(): void {
3841
// getImmediate for FirebaseApp will always succeed
3942
const app = container.getProvider('app').getImmediate();
4043
const appCheckProvider = container.getProvider('app-check-internal');
44+
const installationsProvider = container.getProvider('installations-internal').getImmediate();
4145
const dynamicHeaderProviders = [new AppCheckProvider(appCheckProvider)];
4246
const loggerProvider = createLoggerProvider(
4347
app,
4448
endpointUrl,
4549
dynamicHeaderProviders
4650
);
4751

48-
return new TelemetryService(app, loggerProvider);
52+
return new TelemetryService(app, installationsProvider, loggerProvider);
4953
},
5054
ComponentType.PUBLIC
5155
).setMultipleInstances(true)

packages/telemetry/src/service.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,22 @@
1818
import { _FirebaseService, FirebaseApp } from '@firebase/app';
1919
import { Telemetry } from './public-types';
2020
import { LoggerProvider } from '@opentelemetry/sdk-logs';
21-
import { getInstallations, getId } from '@firebase/installations';
21+
import { _FirebaseInstallationsInternal } from '@firebase/installations';
2222

2323
export class TelemetryService implements Telemetry, _FirebaseService {
2424
fid?: string;
2525

26-
constructor(public app: FirebaseApp, public loggerProvider: LoggerProvider) {
27-
this._getFid().catch(err => console.error('Failed to get FID for telemetry:', err));
26+
constructor(public app: FirebaseApp, public installationsProvider: _FirebaseInstallationsInternal, public loggerProvider: LoggerProvider) {
27+
void this._getFid();
2828
}
2929

3030
private async _getFid(): Promise<void> {
31-
const installations = getInstallations(this.app);
32-
this.fid = await getId(installations);
31+
try {
32+
const fid = await this.installationsProvider.getId();
33+
this.fid = fid;
34+
} catch (err) {
35+
console.error('Failed to get FID for telemetry:', err);
36+
}
3337
}
3438

3539
_delete(): Promise<void> {

0 commit comments

Comments
 (0)