Advertisement
harmonyV

FirestoreSessionStore

Jun 5th, 2025
25
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. export class FirestoreSessionStore<S extends MyState = MyState> implements SessionStore<S> {
  2.   private sessionsCollection: CollectionReference;
  3.   private collectionPath: string = '/genkit_sessions';
  4.  
  5.   constructor(firestoreDb: Firestore) {
  6.     this.sessionsCollection = firestoreDb.collection(this.collectionPath);
  7.   }
  8.  
  9.   async get(sessionId: string): Promise<SessionData<S> | undefined> {
  10.     try {
  11.       const docRef = this.sessionsCollection.doc(sessionId);
  12.       const docSnap = await docRef.get();
  13.  
  14.       if (!docSnap.exists) {
  15.         return undefined;
  16.       }
  17.  
  18.       // Data from Firestore directly matches FirestoreSessionDoc structure
  19.       const firestoreDoc = docSnap.data() as FirestoreSessionDoc<S>;
  20.  
  21.       // Reconstruct SessionData. state.formattedRecipe is already an object.
  22.       const sessionData: SessionData<S> = {
  23.         id: firestoreDoc.id,
  24.       };
  25.  
  26.       if (firestoreDoc.state !== undefined) {
  27.         // No special conversion needed for state.formattedRecipe
  28.         sessionData.state = firestoreDoc.state;
  29.       }
  30.  
  31.       if (firestoreDoc.threads !== undefined) {
  32.         sessionData.threads = firestoreDoc.threads;
  33.       }
  34.  
  35.       return sessionData;
  36.     } catch (error: any) {
  37.       if (error.code === "5" || error.code === "404") {
  38.         console.error(`Error fetching session '${sessionId}' from Firestore:`, error.code);
  39.         return undefined;
  40.       } else {
  41.         throw new Error(String(error));
  42.       }
  43.     }
  44.   }
  45.  
  46.   async save(sessionId: string, sessionData: SessionData<S>): Promise<void> {
  47.     try {
  48.       const docRef = this.sessionsCollection.doc(sessionId);
  49.  
  50.       // Data to save. state.formattedRecipe is already an object.
  51.       const dataToSave: FirestoreSessionDoc<S> = {
  52.         id: sessionId, // or sessionData.id
  53.         updatedAt: FieldValue.serverTimestamp(),
  54.       };
  55.  
  56.       if (sessionData.state !== undefined) {
  57.         // No special conversion needed for state.formattedRecipe
  58.         dataToSave.state = sessionData.state;
  59.       }
  60.       if (sessionData.threads !== undefined) {
  61.         dataToSave.threads = sessionData.threads;
  62.       }
  63.  
  64.       await docRef.set(dataToSave);
  65.  
  66.     } catch (error: any) {
  67.       console.error(`Error saving session '${sessionId}' to Firestore:`, error.code);
  68.       if (error.code === "5" || error.code === "404") {
  69.         return undefined;
  70.       } else {
  71.         throw new Error(String(error));
  72.       }
  73.     }
  74.   }
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement