-
Notifications
You must be signed in to change notification settings - Fork 945
Feat(Firestore) JSON serialization of types to improve SSR support. #8926
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
…ure branch (#8872) Merge the initial bundler implementation into the Firestore Result Serialization feature branch. Implementation includes the ability to invoke `toJSON()` on `QuerySnapshot` and `DocumentSnapshot` instances.
…8896) Pull request to add onSnapshot listeners support for bundles to the Firestore SSR serialization feature branch. This change adds a series of onSnapshot overloads that match the existing onSnapshot variants (observer, individual callback functions, etc) but accepts a bundle instead of a QuerySnapshot or a DocumentSnapshot. The toJSON methods of `QuerySnapshot` and `DocumentSnapshot` have also been updated to explicitly name the fields in the object return type. Fixed an issue in the bundle builder where the bundleName for `DocumentSnapshots` didn't match the `ResourcePath` of the document, which is needed when reconstituting the `DocumentReference` in `onSnapshot`. Finally, I cleaned up the text wrapping for the `onSnapshot` reference doc comments so they take up fewer lines of source code.
|
Size Report 1Affected Products
Test Logs |
Size Analysis Report 1This report is too large (1,176,362 characters) to be displayed here in a GitHub comment. Please use the below link to see the full report on Google Cloud Storage.Test Logs |
commit 05338d8 Author: DellaBitta <drsanta@google.com> Date: Thu Apr 24 15:58:18 2025 -0400 test fixes commit 28c6da9 Author: DellaBitta <drsanta@google.com> Date: Thu Apr 24 15:39:22 2025 -0400 update vector_value commit 0aa81ce Author: DellaBitta <drsanta@google.com> Date: Thu Apr 24 15:39:11 2025 -0400 update reference commit e20bac9 Author: DellaBitta <drsanta@google.com> Date: Thu Apr 24 15:24:50 2025 -0400 update timestamp commit 05b29c4 Author: DellaBitta <drsanta@google.com> Date: Thu Apr 24 15:24:39 2025 -0400 update geopoint commit 4cf66f2 Author: DellaBitta <drsanta@google.com> Date: Thu Apr 24 15:16:15 2025 -0400 convert DocumentReference to new JSON validator. commit 00a2423 Author: DellaBitta <drsanta@google.com> Date: Thu Apr 24 13:44:27 2025 -0400 format fix. commit 09eb5cf Author: DellaBitta <drsanta@google.com> Date: Thu Apr 24 13:43:13 2025 -0400 Bytes prototype. commit b753f49 Author: DellaBitta <drsanta@google.com> Date: Thu Apr 24 13:26:41 2025 -0400 Linter doesn't like it, but API extractor does commit 775cc69 Author: DellaBitta <drsanta@google.com> Date: Thu Apr 17 13:13:52 2025 -0400 lower case types commit 188c86f Author: DellaBitta <drsanta@google.com> Date: Thu Apr 17 10:41:58 2025 -0400 DocumentReference unit and integration tests commit 44d8045 Author: DellaBitta <drsanta@google.com> Date: Wed Apr 16 20:39:55 2025 -0400 map Timestamp fields to DbTimestamp fields commit f305182 Author: DellaBitta <drsanta@google.com> Date: Wed Apr 16 15:54:23 2025 -0400 DocumentReference impl commit 05a49aa Author: DellaBitta <drsanta@google.com> Date: Wed Apr 16 11:14:00 2025 -0400 Timestamp, GeoPoint, VectorValue commit 1652e8b Author: DellaBitta <drsanta@google.com> Date: Tue Apr 15 17:33:51 2025 -0400 format commit 8a081e1 Author: DellaBitta <drsanta@google.com> Date: Tue Apr 15 17:26:09 2025 -0400 Bytes and VectorValue to/from JSON commit 2a07791 Author: DellaBitta <drsanta@google.com> Date: Tue Apr 15 14:07:25 2025 -0400 Bytes
Add a methods to parse bundles synchronously to extract single `DocumentSnapshots` or `QuerySnapshots` containing documents. Hook the new bundle parser up the `documentSnapshotFromJSON` and `querySnapshotFromJSON`. ### Testing Local testing with Next.js app. Added unit tests and integration tests. ### API Changes go/fs-js-json-serialization
To reduce bundle size on clients, the `toJSON` methods of `DocumentSnapshot` and `QuerySnapshot` will not create bundles. ### Testing Updated the integration and unit tests to test `fromJSON` functionality in node environments only. I did attempt to create pre-packaged bundles so that we can test in browser still, but unforunately the bundle includes the project name, and the project that we test against varies depending on the profile of tests that were running (prod, local, etc). If these don't match then an error is thrown. ### API Changes N/A
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Deferring to Firestore team for Firestore complexities but LG from my end minus some nits.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM. I left a few questions, but nothing that should block, unless you want it to
* NOTE: Although an `onCompletion` callback can be provided, it will never be called because the | ||
* snapshot stream is never-ending. | ||
* | ||
* @param firestore - The {@link Firestore} instance to enable persistence for. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this comment is wrong.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
not related to enabling persistence
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done. Changed it to:
* @param firestore - The {@link Firestore} instance to enable the listener for.
* NOTE: Although an `onCompletion` callback can be provided, it will never be called because the | ||
* snapshot stream is never-ending. | ||
* | ||
* @param firestore - The {@link Firestore} instance to enable persistence for. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
same
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
throw new FirestoreError( | ||
Code.FAILED_PRECONDITION, | ||
'QuerySnapshot.toJSON() attempted to serialize a document with pending writes. ' + | ||
'Await waitForPendingWrites() before invoking toJSON().' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm wondering if we should put this statement in the TSDoc for this method. Might be a nice to have.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
); | ||
} | ||
|
||
// Create an internal Query object from the named query in the budnle. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
typo in bundle
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed, thanks!
return new Timestamp(json.seconds, json.nanoseconds); | ||
} | ||
throw new FirestoreError( | ||
Code.INTERNAL, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Did this switch from InvalidArgument to Internal? Should it be InvalidArgument?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm probably not remembering correctly.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Updated it to InvalidParameter
for all new fromJSON
implementations.
|
||
/** | ||
* Validates the JSON object based on the provided schema, and narrows the type to the provided | ||
* JSON schaem. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
typo
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed.
Discussion
Support the ability to resume
onSnapshot
listeners in the CSR phase based on serializedDataSnapshot
s andQuerySnapshot
s built in the SSR phase. Allow Firestore result types to be serialized withtoJSON
and then deserialized withfromJSON
methods on the objects.DocumentSnapshot
andQuerySnapshot
deserialization methods will be standalone, tree-shakable functionsdataSnapshotFromJSON
andquerySnapshotFromJSON
.Testing
Integration Tests.
Unit Tests.
Locally tested with Next.JS.
Will add to our Next.js End to End test suite when the change has been staged.
API Changes
Approved go/fs-js-json-serialization.