@stackframe/stack 2.6.17 → 2.6.20

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.
@@ -1,5 +1,7 @@
1
1
  // src/lib/cookie.ts
2
2
  import { cookies as rscCookies, headers as rscHeaders } from "@stackframe/stack-sc/force-react-server";
3
+ import { isBrowserLike } from "@stackframe/stack-shared/dist/utils/env";
4
+ import { StackAssertionError } from "@stackframe/stack-shared/dist/utils/errors";
3
5
  import Cookies from "js-cookie";
4
6
 
5
7
  // ../../node_modules/.pnpm/oauth4webapi@2.10.4/node_modules/oauth4webapi/build/index.js
@@ -130,81 +132,156 @@ var skipStateCheck = Symbol();
130
132
  var expectNoState = Symbol();
131
133
 
132
134
  // src/lib/cookie.ts
133
- function getCookie(name) {
134
- if (typeof window !== "undefined") {
135
- Cookies.set("stack-is-https", "true", { secure: true });
136
- return Cookies.get(name) ?? null;
137
- } else {
138
- try {
139
- rscCookies().set("stack-is-https", "true", { secure: true });
140
- } catch (e) {
141
- if (typeof e === "object" && e !== null && "message" in e && typeof e.message === "string" && e.message.includes("Cookies can only be modified in a Server Action or Route Handler")) {
142
- } else {
143
- throw e;
144
- }
145
- }
146
- return rscCookies().get(name)?.value ?? null;
135
+ function ensureClient() {
136
+ if (!isBrowserLike()) {
137
+ throw new Error("cookieClient functions can only be called in a browser environment, yet window is undefined");
147
138
  }
148
139
  }
149
- function setOrDeleteCookie(name, value, options = {}) {
150
- if (value === null) {
151
- deleteCookie(name);
140
+ async function createCookieHelper() {
141
+ if (isBrowserLike()) {
142
+ return createBrowserCookieHelper();
152
143
  } else {
153
- setCookie(name, value, options);
144
+ return createNextCookieHelper(
145
+ await rscCookies(),
146
+ await rscHeaders()
147
+ );
154
148
  }
155
149
  }
156
- function deleteCookie(name) {
157
- if (typeof window !== "undefined") {
158
- Cookies.remove(name);
150
+ function createBrowserCookieHelper() {
151
+ return {
152
+ get: getCookieClient,
153
+ set: setCookieClient,
154
+ setOrDelete: setOrDeleteCookieClient,
155
+ delete: deleteCookieClient
156
+ };
157
+ }
158
+ function handleCookieError(e, options) {
159
+ if (e instanceof Error && e.message.includes("Cookies can only be modified in")) {
160
+ if (options.noOpIfServerComponent) {
161
+ } else {
162
+ throw new StackAssertionError("Attempted to set cookie in server component. Pass { noOpIfServerComponent: true } in the options of Stack's cookie functions if this is intentional and you want to ignore this error. Read more: https://nextjs.org/docs/app/api-reference/functions/cookies#options");
163
+ }
159
164
  } else {
160
- rscCookies().delete(name);
165
+ throw e;
161
166
  }
162
167
  }
163
- function setCookie(name, value, options = {}) {
164
- if (typeof window !== "undefined") {
165
- Cookies.set(name, value, {
166
- secure: window.location.protocol === "https:",
167
- expires: options.maxAge === void 0 ? void 0 : new Date(Date.now() + options.maxAge * 1e3),
168
- sameSite: "Strict"
169
- });
170
- } else {
171
- let isSecureCookie = !!rscCookies().get("stack-is-https");
172
- if (rscHeaders().get("x-forwarded-proto") === "https") {
173
- isSecureCookie = true;
168
+ function createNextCookieHelper(rscCookiesAwaited, rscHeadersAwaited) {
169
+ const cookieHelper = {
170
+ get: (name) => {
171
+ try {
172
+ rscCookiesAwaited.set("stack-is-https", "true", { secure: true });
173
+ } catch (e) {
174
+ if (typeof e === "object" && e !== null && "message" in e && typeof e.message === "string" && e.message.includes("Cookies can only be modified in a Server Action or Route Handler")) {
175
+ } else {
176
+ throw e;
177
+ }
178
+ }
179
+ return rscCookiesAwaited.get(name)?.value ?? null;
180
+ },
181
+ set: (name, value, options) => {
182
+ let isSecureCookie = !!rscCookiesAwaited.get("stack-is-https");
183
+ if (rscHeadersAwaited.get("x-forwarded-proto") === "https") {
184
+ isSecureCookie = true;
185
+ }
186
+ try {
187
+ rscCookiesAwaited.set(name, value, {
188
+ secure: isSecureCookie,
189
+ maxAge: options.maxAge
190
+ });
191
+ } catch (e) {
192
+ handleCookieError(e, options);
193
+ }
194
+ },
195
+ setOrDelete(name, value, options = {}) {
196
+ if (value === null) {
197
+ this.delete(name, options);
198
+ } else {
199
+ this.set(name, value, options);
200
+ }
201
+ },
202
+ delete(name, options = {}) {
203
+ try {
204
+ rscCookiesAwaited.delete(name);
205
+ } catch (e) {
206
+ handleCookieError(e, options);
207
+ }
174
208
  }
175
- rscCookies().set(name, value, {
176
- secure: isSecureCookie,
177
- maxAge: options.maxAge
178
- });
209
+ };
210
+ return cookieHelper;
211
+ }
212
+ function getCookieClient(name) {
213
+ ensureClient();
214
+ Cookies.set("stack-is-https", "true", { secure: true });
215
+ return Cookies.get(name) ?? null;
216
+ }
217
+ async function getCookie(name) {
218
+ const cookieHelper = await createCookieHelper();
219
+ return cookieHelper.get(name);
220
+ }
221
+ function setOrDeleteCookieClient(name, value, options = {}) {
222
+ ensureClient();
223
+ if (value === null) {
224
+ deleteCookieClient(name, options);
225
+ } else {
226
+ setCookieClient(name, value, options);
179
227
  }
180
228
  }
229
+ async function setOrDeleteCookie(name, value, options = {}) {
230
+ const cookieHelper = await createCookieHelper();
231
+ cookieHelper.setOrDelete(name, value, options);
232
+ }
233
+ function deleteCookieClient(name, options = {}) {
234
+ ensureClient();
235
+ Cookies.remove(name);
236
+ }
237
+ async function deleteCookie(name, options = {}) {
238
+ const cookieHelper = await createCookieHelper();
239
+ cookieHelper.delete(name, options);
240
+ }
241
+ function setCookieClient(name, value, options = {}) {
242
+ ensureClient();
243
+ Cookies.set(name, value, {
244
+ expires: options.maxAge === void 0 ? void 0 : new Date(Date.now() + options.maxAge * 1e3)
245
+ });
246
+ }
247
+ async function setCookie(name, value, options = {}) {
248
+ const cookieHelper = await createCookieHelper();
249
+ cookieHelper.set(name, value, options);
250
+ }
181
251
  async function saveVerifierAndState() {
182
252
  const codeVerifier = generateRandomCodeVerifier();
183
253
  const codeChallenge = await calculatePKCECodeChallenge(codeVerifier);
184
254
  const state = generateRandomState();
185
- setCookie("stack-oauth-outer-" + state, codeVerifier, { maxAge: 60 * 60 });
255
+ await setCookie("stack-oauth-outer-" + state, codeVerifier, { maxAge: 60 * 60 });
186
256
  return {
187
257
  codeChallenge,
188
258
  state
189
259
  };
190
260
  }
191
261
  function consumeVerifierAndStateCookie(state) {
262
+ ensureClient();
192
263
  const cookieName = "stack-oauth-outer-" + state;
193
- const codeVerifier = getCookie(cookieName);
264
+ const codeVerifier = getCookieClient(cookieName);
194
265
  if (!codeVerifier) {
195
266
  return null;
196
267
  }
197
- deleteCookie(cookieName);
268
+ deleteCookieClient(cookieName);
198
269
  return {
199
270
  codeVerifier
200
271
  };
201
272
  }
202
273
  export {
203
274
  consumeVerifierAndStateCookie,
275
+ createBrowserCookieHelper,
276
+ createCookieHelper,
204
277
  deleteCookie,
278
+ deleteCookieClient,
205
279
  getCookie,
280
+ getCookieClient,
206
281
  saveVerifierAndState,
207
282
  setCookie,
208
- setOrDeleteCookie
283
+ setCookieClient,
284
+ setOrDeleteCookie,
285
+ setOrDeleteCookieClient
209
286
  };
210
287
  //# sourceMappingURL=cookie.js.map