Skip to content

feat: full rewrite using getAll and setAll cookie methods#1

Merged
hf merged 1 commit into
mainfrom
hf/rewrite
Jun 12, 2024
Merged

feat: full rewrite using getAll and setAll cookie methods#1
hf merged 1 commit into
mainfrom
hf/rewrite

Conversation

@hf

@hf hf commented May 24, 2024

Copy link
Copy Markdown
Collaborator

Re-implements the createServerClient and createBrowserClient to solve a few important problems that were not solved with the implementation previously:

Cookie encoding
Cookies can't contain just any characters -- they're a limited set of US ASCII and " is not allowed. Internally the Supabase client uses JSON to encode the session, so this must not be mapped directly to cookies. In this implementation, cookies are encoded as Base64 URL and the leading chunk contains the base64- prefix.

Cookie chunk management
There are a few state transitions when storage needs to be chunked into multiple cookies which were not handled well. This is the reason why a change of API is necessary from get, set and remove cookie access methods to getAll and setAll. The library must be able to see all of the cookies and manage deleting unnecessary chunks when that is required.

Server-side developer ergonomics
In some SSR frameworks (notably middleware in NextJS) it can be very tricky to set cookies on objects correctly. createServerClient only calls the setAll cookie access method only once and only when necessary. This reduces the number of bugs developers can introduce themselves when using the server client.

For more details check the docs/design.md document which contains a lot of details that can't easily be covered in the PR description.

@hf hf force-pushed the hf/rewrite branch 2 times, most recently from e2beb93 to d317d4b Compare May 24, 2024 15:58
Comment thread src/cookies.ts
Comment thread src/cookies.spec.ts
Comment thread src/createBrowserClient.ts Outdated
Comment thread src/createBrowserClient.ts Outdated
Comment thread src/createServerClient.ts
@hf hf force-pushed the hf/rewrite branch 3 times, most recently from f535af2 to 3deeda2 Compare May 25, 2024 10:35
@hf

hf commented May 27, 2024

Copy link
Copy Markdown
Collaborator Author

Moved around the types and TSDoc to make sure it shows up crossed out in VS Code:

image

@hf

hf commented May 27, 2024

Copy link
Copy Markdown
Collaborator Author

Obviously it is not crossed out when using it correctly:
image

@hf hf force-pushed the hf/rewrite branch 9 times, most recently from b1d9623 to 887b42f Compare May 28, 2024 17:45
Comment thread src/createServerClient.spec.ts Outdated
Comment thread src/createServerClient.ts
Comment thread src/utils/chunker.ts
Comment thread docs/design.md
Comment thread docs/design.md Outdated
@hf hf force-pushed the hf/rewrite branch 6 times, most recently from 52d29c4 to 5ef5db3 Compare June 5, 2024 10:56
@hf hf marked this pull request as ready for review June 5, 2024 11:26
Comment thread src/cookies.ts
Comment thread src/cookies.ts
Comment thread src/cookies.ts
Comment thread src/cookies.ts
@hf hf force-pushed the hf/rewrite branch 3 times, most recently from cce4a90 to 48b0968 Compare June 12, 2024 12:19
@hf

hf commented Jun 12, 2024

Copy link
Copy Markdown
Collaborator Author

@hf would be great if we can also clean up the unused imports in each file

Which ones? TypeScript / eslint usually yell about that.

@hf hf merged commit b6ae192 into main Jun 12, 2024
@hf hf deleted the hf/rewrite branch June 12, 2024 12:40
hf pushed a commit that referenced this pull request Jun 24, 2024
🤖 I have created a release *beep* *boop*
---


## [0.4.0](v0.3.0...v0.4.0)
(2024-06-24)


### Features

* full rewrite using `getAll` and `setAll` cookie methods
([#1](#1))
([b6ae192](b6ae192))


### Bug Fixes

* allow use of `createBrowserClient` without `window` present
([#20](#20))
([27d868d](27d868d))
* deprecate `parse`, `serialize` exports for more useful functions
([#14](#14))
([0b5f881](0b5f881))
* fix `createBrowserClient` deprecation tsdoc
([#17](#17))
([1df70ad](1df70ad))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
mandarini pushed a commit that referenced this pull request Jun 9, 2026
🤖 I have created a release *beep* *boop*
---


## [0.12.0](v0.11.0...v0.12.0)
(2026-06-09)


### Features

* adds `cookies.encode` option allowing minimal cookie sizes
([#126](#126))
([cf38b22](cf38b22))
* bump `cookie` to 1.0.2
([#113](#113))
([b4a77b4](b4a77b4))
* **cookies:** add clearAuthCookiesAtScopes migration helper
([#240](#240))
([4e47249](4e47249))
* full rewrite using `getAll` and `setAll` cookie methods
([#1](#1))
([b6ae192](b6ae192))
* improve cookie chunk handling via base64url+length encoding
([#90](#90))
([6deb687](6deb687))
* pass cache headers to setAll to prevent CDN caching of auth responses
([#176](#176))
([14962d2](14962d2))
* publish SSR under deprecated auth-helpers package names
([#127](#127))
([e8b6102](e8b6102))
* release workflow RC versioning and publish reliability
([#164](#164))
([81e68f4](81e68f4))
* update CI so it runs on release as well
([#33](#33))
([4517996](4517996))
* update supabase-js to latest
([#133](#133))
([d65044d](d65044d))
* update supabase-js to latest
([#145](#145))
([08bf7d6](08bf7d6))
* upgrade cookie dependency and cleanup imports
([#77](#77))
([9524528](9524528))


### Bug Fixes

* add @types/cookies to dependencies
([#63](#63))
([47e5f16](47e5f16))
* add `create*Client` string in `x-client-info`
([#85](#85))
([f271acc](f271acc))
* allow cookies encode without getAll/setAll on browser client
([#213](#213))
([89f3f28](89f3f28)),
closes [#170](#170)
* allow use of `createBrowserClient` without `window` present
([#20](#20))
([27d868d](27d868d))
* **auth:** respect user-provided auth options in createBrowserClient
([#167](#167))
([5f04837](5f04837))
* check chunkedCookie is string in server client
([#57](#57))
([549fe62](549fe62))
* **ci:** remove packageManager field
([#197](#197))
([6bf0226](6bf0226))
* cookies console warnings
([#136](#136))
([64ff6b3](64ff6b3))
* deprecate `parse`, `serialize` exports for more useful functions
([#14](#14))
([0b5f881](0b5f881))
* enable tree-shaking for browser bundles
([#216](#216))
([f009d71](f009d71))
* fix `createBrowserClient` deprecation tsdoc
([#17](#17))
([1df70ad](1df70ad))
* force release ([#98](#98))
([66710e8](66710e8))
* re-apply update CI so it runs on release as well
([#49](#49))
([51d5a43](51d5a43))
* **release:** pin npm to 11.5.2 so OIDC trusted publisher works
([#249](#249))
([4af89f7](4af89f7))
* remove optional dependencies
([#41](#41))
([a48fe6f](a48fe6f))
* remove usage of internal type params
([#123](#123))
([8f3e89e](8f3e89e))
* revert "update CI so it runs on release as well"
([#44](#44))
([9d0e859](9d0e859))
* **revert:** "feat: improve cookie chunk handling via base64url+length
encoding ([#90](#90))"
([#100](#100))
([2ea8e23](2ea8e23))
* set `max-age` default cookie option to 400 days
([#54](#54))
([f4ed2e0](f4ed2e0))
* set cookies for password recovery event
([#32](#32))
([7dc1837](7dc1837))
* set cookies when mfa challenge is verified
([#27](#27))
([c217f53](c217f53))
* **tsconfig:** set explicit rootDir to silence TS6059 in consumer IDEs
([#211](#211))
([a77ee8a](a77ee8a)),
closes [#209](#209)
* update conventional commits ci to use main instead of master
([#31](#31))
([bebce89](bebce89))
* update README session docs
([#159](#159))
([b859905](b859905))
* update type, remove unused imports, define AuthEvent type
([#47](#47))
([4f4a375](4f4a375))
* use skipAutoInitialize to prevent SSR token refresh race condition
([#131](#131))
([0b7be28](0b7be28))
* validate base64-prefixed chunked cookies decode to valid JSON
([#210](#210))
([302cc0e](302cc0e))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: supabase-releaser[bot] <223506987+supabase-releaser[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants