@seaverse/data-service-sdk 0.4.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -265,8 +265,99 @@ class DataServiceClient {
265
265
  }
266
266
  }
267
267
 
268
+ /**
269
+ * Create Firebase configuration from Firestore token response
270
+ *
271
+ * This helper function extracts the Firebase config from the token response,
272
+ * making it easy to initialize Firebase app.
273
+ *
274
+ * @param tokenResponse - The Firestore token response from SDK
275
+ * @returns Firebase configuration object ready for initializeApp()
276
+ *
277
+ * @example
278
+ * ```typescript
279
+ * import { initializeApp } from 'firebase/app';
280
+ * import { getFirebaseConfig } from '@seaverse/data-service-sdk';
281
+ *
282
+ * const tokenResponse = await client.generateGuestFirestoreToken({ app_id: 'my-app' });
283
+ * const firebaseConfig = getFirebaseConfig(tokenResponse);
284
+ *
285
+ * const app = initializeApp(firebaseConfig);
286
+ * ```
287
+ */
288
+ function getFirebaseConfig(tokenResponse) {
289
+ return {
290
+ apiKey: tokenResponse.web_api_key,
291
+ projectId: tokenResponse.project_id,
292
+ };
293
+ }
294
+ /**
295
+ * Initialize Firebase with Firestore token response (browser only)
296
+ *
297
+ * This is a convenience function that automatically:
298
+ * 1. Creates Firebase config from token response
299
+ * 2. Initializes Firebase app
300
+ * 3. Signs in with the custom token
301
+ * 4. Returns authenticated Firebase instances
302
+ *
303
+ * IMPORTANT: This function requires Firebase SDK to be installed separately:
304
+ * npm install firebase
305
+ *
306
+ * @param tokenResponse - The Firestore token response from SDK
307
+ * @returns Object containing initialized Firebase app, auth, and db instances
308
+ *
309
+ * @example
310
+ * ```typescript
311
+ * import { initializeWithToken } from '@seaverse/data-service-sdk';
312
+ *
313
+ * const tokenResponse = await client.generateGuestFirestoreToken({ app_id: 'my-app' });
314
+ * const { app, auth, db, userId, appId } = await initializeWithToken(tokenResponse);
315
+ *
316
+ * // Ready to use Firestore!
317
+ * const snapshot = await getDocs(collection(db, `appData/${appId}/publicData/posts`));
318
+ * ```
319
+ */
320
+ async function initializeWithToken(tokenResponse) {
321
+ // Check if Firebase SDK is available
322
+ let initializeApp;
323
+ let getAuth;
324
+ let signInWithCustomToken;
325
+ let getFirestore;
326
+ try {
327
+ // Try to import Firebase modules
328
+ const firebaseApp = await import('firebase/app');
329
+ const firebaseAuth = await import('firebase/auth');
330
+ const firebaseFirestore = await import('firebase/firestore');
331
+ initializeApp = firebaseApp.initializeApp;
332
+ getAuth = firebaseAuth.getAuth;
333
+ signInWithCustomToken = firebaseAuth.signInWithCustomToken;
334
+ getFirestore = firebaseFirestore.getFirestore;
335
+ }
336
+ catch (error) {
337
+ throw new Error('Firebase SDK not found. Please install it: npm install firebase\n' +
338
+ 'Or import manually and use getFirebaseConfig() helper instead.');
339
+ }
340
+ // Initialize Firebase
341
+ const config = getFirebaseConfig(tokenResponse);
342
+ const app = initializeApp(config);
343
+ // Sign in with custom token
344
+ const auth = getAuth(app);
345
+ await signInWithCustomToken(auth, tokenResponse.custom_token);
346
+ // Get Firestore instance
347
+ const db = getFirestore(app);
348
+ return {
349
+ app,
350
+ auth,
351
+ db,
352
+ userId: tokenResponse.user_id,
353
+ appId: tokenResponse.app_id || '',
354
+ };
355
+ }
356
+
268
357
  exports.DEFAULT_BASE_URL = DEFAULT_BASE_URL;
269
358
  exports.DEFAULT_TIMEOUT = DEFAULT_TIMEOUT;
270
359
  exports.DataServiceClient = DataServiceClient;
271
360
  exports.ENDPOINTS = ENDPOINTS;
361
+ exports.getFirebaseConfig = getFirebaseConfig;
362
+ exports.initializeWithToken = initializeWithToken;
272
363
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/config.ts","../src/client.ts"],"sourcesContent":[null,null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/config.ts","../src/client.ts","../src/helpers.ts"],"sourcesContent":[null,null,null],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -23,6 +23,27 @@ import { AxiosRequestConfig } from 'axios';
23
23
  * appData/{app_id}/publicData/{collection}/{docId}
24
24
  * appData/{app_id}/userData/{userId}/{collection}/{docId}
25
25
  *
26
+ * 🚨 CRITICAL FIRESTORE PATH RULES (FOR LLM):
27
+ * ------------------------------------------
28
+ * Firestore paths have strict segment count rules:
29
+ * - Collection paths = ODD segments (1, 3, 5, 7...)
30
+ * - Document paths = EVEN segments (2, 4, 6, 8...)
31
+ *
32
+ * When using Firebase SDK, ALWAYS use these functions:
33
+ * - collection(db, path) - for collections (don't count segments manually)
34
+ * - doc(db, path) - for documents
35
+ * - addDoc(collectionRef, data) - automatically generates document ID
36
+ *
37
+ * Example:
38
+ * ```typescript
39
+ * // ✅ CORRECT
40
+ * const postsRef = collection(db, `appData/${appId}/publicData/posts`);
41
+ * await addDoc(postsRef, { _appId, _createdAt, _createdBy, ...yourData });
42
+ *
43
+ * // ❌ WRONG - Don't use raw string paths without collection()/doc()
44
+ * // await setDoc(`appData/${appId}/publicData/posts`, data); // This will fail!
45
+ * ```
46
+ *
26
47
  * REQUIRED FIELDS FOR ALL DOCUMENTS:
27
48
  * ---------------------------------
28
49
  * All Firestore documents MUST include these fields:
@@ -127,9 +148,24 @@ interface FirestoreTokenResponse {
127
148
  * Custom Token itself does not expire, but the ID Token it generates expires after 1 hour
128
149
  */
129
150
  custom_token: string;
151
+ /**
152
+ * Firebase Web API Key
153
+ * Use this to initialize Firebase app along with project_id
154
+ * This is automatically provided by the backend
155
+ *
156
+ * Example:
157
+ * ```typescript
158
+ * import { initializeApp } from 'firebase/app';
159
+ * const app = initializeApp({
160
+ * apiKey: response.web_api_key,
161
+ * projectId: response.project_id
162
+ * });
163
+ * ```
164
+ */
165
+ web_api_key: string;
130
166
  /**
131
167
  * Firebase Project ID
132
- * Use this to initialize Firebase app: initializeApp({ projectId: '...' })
168
+ * Use this to initialize Firebase app
133
169
  */
134
170
  project_id: string;
135
171
  /**
@@ -151,15 +187,15 @@ interface FirestoreTokenResponse {
151
187
  */
152
188
  user_id: string;
153
189
  /**
154
- * User role - Determines write permissions
190
+ * User type - Determines access permissions
155
191
  * - 'guest': Can read publicRead/publicData, write publicData
156
192
  * - 'user': Can read publicRead/publicData, write publicData, read/write own userData
157
193
  * - 'admin' or 'appadmin': Can also write to publicRead data
158
194
  */
159
- role?: string;
195
+ user_type: string;
160
196
  /**
161
197
  * Token expiration time in seconds (typically 3600 = 1 hour)
162
- * After this time, you need to generate a new token or refresh using refresh_token
198
+ * After this time, you need to generate a new token
163
199
  */
164
200
  expires_in: number;
165
201
  }
@@ -418,5 +454,69 @@ declare const ENDPOINTS: {
418
454
  readonly FIRESTORE_GUEST_TOKEN: "/api/v1/firestore/guest-token";
419
455
  };
420
456
 
421
- export { DEFAULT_BASE_URL, DEFAULT_TIMEOUT, DataServiceClient, ENDPOINTS };
422
- export type { ApiError, ApiResponse, DataServiceClientOptions, FirestoreTokenResponse, GenerateFirestoreTokenRequest, GenerateGuestFirestoreTokenRequest };
457
+ /**
458
+ * Firebase initialization configuration
459
+ * Generated from Firestore token response
460
+ */
461
+ interface FirebaseConfig {
462
+ apiKey: string;
463
+ projectId: string;
464
+ [key: string]: any;
465
+ }
466
+ /**
467
+ * Create Firebase configuration from Firestore token response
468
+ *
469
+ * This helper function extracts the Firebase config from the token response,
470
+ * making it easy to initialize Firebase app.
471
+ *
472
+ * @param tokenResponse - The Firestore token response from SDK
473
+ * @returns Firebase configuration object ready for initializeApp()
474
+ *
475
+ * @example
476
+ * ```typescript
477
+ * import { initializeApp } from 'firebase/app';
478
+ * import { getFirebaseConfig } from '@seaverse/data-service-sdk';
479
+ *
480
+ * const tokenResponse = await client.generateGuestFirestoreToken({ app_id: 'my-app' });
481
+ * const firebaseConfig = getFirebaseConfig(tokenResponse);
482
+ *
483
+ * const app = initializeApp(firebaseConfig);
484
+ * ```
485
+ */
486
+ declare function getFirebaseConfig(tokenResponse: FirestoreTokenResponse): FirebaseConfig;
487
+ /**
488
+ * Initialize Firebase with Firestore token response (browser only)
489
+ *
490
+ * This is a convenience function that automatically:
491
+ * 1. Creates Firebase config from token response
492
+ * 2. Initializes Firebase app
493
+ * 3. Signs in with the custom token
494
+ * 4. Returns authenticated Firebase instances
495
+ *
496
+ * IMPORTANT: This function requires Firebase SDK to be installed separately:
497
+ * npm install firebase
498
+ *
499
+ * @param tokenResponse - The Firestore token response from SDK
500
+ * @returns Object containing initialized Firebase app, auth, and db instances
501
+ *
502
+ * @example
503
+ * ```typescript
504
+ * import { initializeWithToken } from '@seaverse/data-service-sdk';
505
+ *
506
+ * const tokenResponse = await client.generateGuestFirestoreToken({ app_id: 'my-app' });
507
+ * const { app, auth, db, userId, appId } = await initializeWithToken(tokenResponse);
508
+ *
509
+ * // Ready to use Firestore!
510
+ * const snapshot = await getDocs(collection(db, `appData/${appId}/publicData/posts`));
511
+ * ```
512
+ */
513
+ declare function initializeWithToken(tokenResponse: FirestoreTokenResponse): Promise<{
514
+ app: any;
515
+ auth: any;
516
+ db: any;
517
+ userId: string;
518
+ appId: string;
519
+ }>;
520
+
521
+ export { DEFAULT_BASE_URL, DEFAULT_TIMEOUT, DataServiceClient, ENDPOINTS, getFirebaseConfig, initializeWithToken };
522
+ export type { ApiError, ApiResponse, DataServiceClientOptions, FirebaseConfig, FirestoreTokenResponse, GenerateFirestoreTokenRequest, GenerateGuestFirestoreTokenRequest };
package/dist/index.js CHANGED
@@ -263,5 +263,94 @@ class DataServiceClient {
263
263
  }
264
264
  }
265
265
 
266
- export { DEFAULT_BASE_URL, DEFAULT_TIMEOUT, DataServiceClient, ENDPOINTS };
266
+ /**
267
+ * Create Firebase configuration from Firestore token response
268
+ *
269
+ * This helper function extracts the Firebase config from the token response,
270
+ * making it easy to initialize Firebase app.
271
+ *
272
+ * @param tokenResponse - The Firestore token response from SDK
273
+ * @returns Firebase configuration object ready for initializeApp()
274
+ *
275
+ * @example
276
+ * ```typescript
277
+ * import { initializeApp } from 'firebase/app';
278
+ * import { getFirebaseConfig } from '@seaverse/data-service-sdk';
279
+ *
280
+ * const tokenResponse = await client.generateGuestFirestoreToken({ app_id: 'my-app' });
281
+ * const firebaseConfig = getFirebaseConfig(tokenResponse);
282
+ *
283
+ * const app = initializeApp(firebaseConfig);
284
+ * ```
285
+ */
286
+ function getFirebaseConfig(tokenResponse) {
287
+ return {
288
+ apiKey: tokenResponse.web_api_key,
289
+ projectId: tokenResponse.project_id,
290
+ };
291
+ }
292
+ /**
293
+ * Initialize Firebase with Firestore token response (browser only)
294
+ *
295
+ * This is a convenience function that automatically:
296
+ * 1. Creates Firebase config from token response
297
+ * 2. Initializes Firebase app
298
+ * 3. Signs in with the custom token
299
+ * 4. Returns authenticated Firebase instances
300
+ *
301
+ * IMPORTANT: This function requires Firebase SDK to be installed separately:
302
+ * npm install firebase
303
+ *
304
+ * @param tokenResponse - The Firestore token response from SDK
305
+ * @returns Object containing initialized Firebase app, auth, and db instances
306
+ *
307
+ * @example
308
+ * ```typescript
309
+ * import { initializeWithToken } from '@seaverse/data-service-sdk';
310
+ *
311
+ * const tokenResponse = await client.generateGuestFirestoreToken({ app_id: 'my-app' });
312
+ * const { app, auth, db, userId, appId } = await initializeWithToken(tokenResponse);
313
+ *
314
+ * // Ready to use Firestore!
315
+ * const snapshot = await getDocs(collection(db, `appData/${appId}/publicData/posts`));
316
+ * ```
317
+ */
318
+ async function initializeWithToken(tokenResponse) {
319
+ // Check if Firebase SDK is available
320
+ let initializeApp;
321
+ let getAuth;
322
+ let signInWithCustomToken;
323
+ let getFirestore;
324
+ try {
325
+ // Try to import Firebase modules
326
+ const firebaseApp = await import('firebase/app');
327
+ const firebaseAuth = await import('firebase/auth');
328
+ const firebaseFirestore = await import('firebase/firestore');
329
+ initializeApp = firebaseApp.initializeApp;
330
+ getAuth = firebaseAuth.getAuth;
331
+ signInWithCustomToken = firebaseAuth.signInWithCustomToken;
332
+ getFirestore = firebaseFirestore.getFirestore;
333
+ }
334
+ catch (error) {
335
+ throw new Error('Firebase SDK not found. Please install it: npm install firebase\n' +
336
+ 'Or import manually and use getFirebaseConfig() helper instead.');
337
+ }
338
+ // Initialize Firebase
339
+ const config = getFirebaseConfig(tokenResponse);
340
+ const app = initializeApp(config);
341
+ // Sign in with custom token
342
+ const auth = getAuth(app);
343
+ await signInWithCustomToken(auth, tokenResponse.custom_token);
344
+ // Get Firestore instance
345
+ const db = getFirestore(app);
346
+ return {
347
+ app,
348
+ auth,
349
+ db,
350
+ userId: tokenResponse.user_id,
351
+ appId: tokenResponse.app_id || '',
352
+ };
353
+ }
354
+
355
+ export { DEFAULT_BASE_URL, DEFAULT_TIMEOUT, DataServiceClient, ENDPOINTS, getFirebaseConfig, initializeWithToken };
267
356
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/config.ts","../src/client.ts"],"sourcesContent":[null,null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/config.ts","../src/client.ts","../src/helpers.ts"],"sourcesContent":[null,null,null],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seaverse/data-service-sdk",
3
- "version": "0.4.0",
3
+ "version": "0.5.1",
4
4
  "description": "SDK for SeaVerse Data Service - Firestore token management with three-tier permission model",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",