@devcoffee/nuxt-core 1.3.0 → 1.4.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.4.0
4
+
5
+ [compare changes](https://github.com/coolkg1412/devcoffee-nuxt-core/compare/v1.3.0...v1.4.0)
6
+
7
+ ### 🚀 Enhancements
8
+
9
+ - Implement writeSessionCookie function and integrate it into NuxtForwardRequestHandler and authts plugin ([e761f6c](https://github.com/coolkg1412/devcoffee-nuxt-core/commit/e761f6c))
10
+
11
+ ### 🩹 Fixes
12
+
13
+ - Drop return from proxyRequest in NuxtForwardRequestHandler to prevent ERR_HTTP_HEADERS_SENT ([fd3b91c](https://github.com/coolkg1412/devcoffee-nuxt-core/commit/fd3b91c))
14
+ - Prevent sending headers after response has been finalized in beforeResponse hook ([444a012](https://github.com/coolkg1412/devcoffee-nuxt-core/commit/444a012))
15
+ - Update version to 1.3.2 in package.json and package-lock.json ([e6ab449](https://github.com/coolkg1412/devcoffee-nuxt-core/commit/e6ab449))
16
+
17
+ ### 💅 Refactors
18
+
19
+ - Remove redundant signSessionId checks from authts.sec03.test.ts ([18686f4](https://github.com/coolkg1412/devcoffee-nuxt-core/commit/18686f4))
20
+
21
+ ### ❤️ Contributors
22
+
23
+ - Hieu Nguyen <hieu.nguyen@devcoffee.tech>
24
+
3
25
  ## v1.3.0
4
26
 
5
27
  [compare changes](https://github.com/coolkg1412/devcoffee-nuxt-core/compare/v1.2.5...v1.3.0)
package/dist/module.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nuxt-core",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "configKey": "nuxtCore",
5
5
  "compatibility": {
6
6
  "nuxt": "^4.0.0"
package/dist/module.mjs CHANGED
@@ -2,7 +2,7 @@ import { addCustomTab } from '@nuxt/devtools-kit';
2
2
  import { defineNuxtModule, useLogger, createResolver, addTemplate, addServerImports, addServerImportsDir, addServerPlugin, addImportsDir, addPlugin, addRouteMiddleware, addServerHandler } from '@nuxt/kit';
3
3
  import { deepMerge, pick } from '../dist/runtime/utils.js';
4
4
 
5
- const version = "1.3.0";
5
+ const version = "1.4.0";
6
6
 
7
7
  const defaultLocale = "vi-VN";
8
8
  const defaultLanguage = "vi";
@@ -1,4 +1,5 @@
1
1
  import type { SessionContext } from '@devcoffee/nuxt-core';
2
+ import type { CookieSerializeOptions, H3Event } from '#devcoffee-core/server/adapters/http';
2
3
  import type { ClientMetadata, ServerMetadata, TokenEndpointResponse } from '#devcoffee-core/server/adapters/oidc';
3
4
  /** Options used for session creation and validation. */
4
5
  type SessionCreateOptions = {
@@ -19,6 +20,28 @@ type SessionCreateOptions = {
19
20
  * @since 1.0.0
20
21
  */
21
22
  export declare function isSameOrigin(redirectUrl: string, requestUrl: URL): boolean;
23
+ /**
24
+ * Write the session cookie to the response.
25
+ *
26
+ * Shared by the `beforeResponse` Nitro hook (buffered responses) and the
27
+ * `proxyRequest` `onResponse` callback (streaming proxy responses). Calling
28
+ * it in both places ensures the cookie is always refreshed regardless of
29
+ * whether `headersSent` is true by the time `beforeResponse` fires.
30
+ *
31
+ * @param event - The H3 event for the current request.
32
+ * @param session - The resolved session context to encode into the cookie.
33
+ * @param sessionsConfig - Session cookie options from `nuxtCore.authts.sessions`.
34
+ * @since 1.3.3
35
+ */
36
+ export declare function writeSessionCookie(event: H3Event, session: SessionContext, sessionsConfig: {
37
+ cookieOpts: Omit<CookieSerializeOptions, 'sameSite'> & {
38
+ sameSite?: string | boolean;
39
+ };
40
+ secret?: string;
41
+ names: {
42
+ sessionId: string;
43
+ };
44
+ }): void;
22
45
  /**
23
46
  * Retrieve an existing session from storage.
24
47
  *
@@ -1,4 +1,4 @@
1
- import { createError } from "#devcoffee-core/server/adapters/http";
1
+ import { createError, setCookie } from "#devcoffee-core/server/adapters/http";
2
2
  import {
3
3
  allowInsecureRequests,
4
4
  authorizationCodeGrant as authorizationCodeGrantOidc,
@@ -22,7 +22,14 @@ import { deepMerge, omit } from "#devcoffee-core/server/adapters/utils";
22
22
  import useServerLogger from "#devcoffee-core/server/composables/useServerLogger";
23
23
  import { useRuntimeConfig } from "#imports";
24
24
  import { useStorage } from "nitropack/runtime";
25
- import { decryptTokenSet, encryptTokenSet, generateSessionId, isValidSessionId, verifySessionId } from "./crypto.js";
25
+ import {
26
+ decryptTokenSet,
27
+ encryptTokenSet,
28
+ generateSessionId,
29
+ isValidSessionId,
30
+ signSessionId,
31
+ verifySessionId
32
+ } from "./crypto.js";
26
33
  import { tryAcquireLock } from "./mutex.js";
27
34
  function getAnonymousUser(extras) {
28
35
  const anonymous = useRuntimeConfig().nuxtCore.authts.auth.anonymousUser;
@@ -56,6 +63,18 @@ export function isSameOrigin(redirectUrl, requestUrl) {
56
63
  return false;
57
64
  }
58
65
  }
66
+ export function writeSessionCookie(event, session, sessionsConfig) {
67
+ const {
68
+ cookieOpts,
69
+ secret = "",
70
+ names: { sessionId: cookieName }
71
+ } = sessionsConfig;
72
+ const cookieValue = secret ? signSessionId(session.id, secret) : session.id;
73
+ setCookie(event, cookieName, cookieValue, {
74
+ ...cookieOpts,
75
+ expires: new Date(session.expiresAt)
76
+ });
77
+ }
59
78
  export async function getSession(sessionId, opts) {
60
79
  const sessingKey = getSessionStorageKey(opts.storagePrefix, sessionId);
61
80
  if (!await hasSessionData(opts.storageName, sessingKey)) return null;
@@ -7,7 +7,7 @@ import {
7
7
  } from "#devcoffee-core/server/adapters/http";
8
8
  import { deepMerge } from "#devcoffee-core/server/adapters/utils";
9
9
  import useServerLogger from "#devcoffee-core/server/composables/useServerLogger";
10
- import { getOpenIdConfiguration } from "./helpers.js";
10
+ import { getOpenIdConfiguration, writeSessionCookie } from "./helpers.js";
11
11
  const defaultOpts = {
12
12
  logLevel: 2,
13
13
  proxyPrefix: ""
@@ -51,6 +51,15 @@ export default function NuxtForwardRequestHandler(opts) {
51
51
  };
52
52
  logger.info(`from '${event.path}' to '${defaultForwardInit.forwardUrl}' - auth stt='${session?.auth?.status}'`);
53
53
  const { forwardUrl, ...proxyOption } = await onBeforeRequest?.(defaultForwardInit, params) || defaultForwardInit;
54
- return await proxyRequest(event, forwardUrl, proxyOption);
54
+ const { sessions } = useRuntimeConfig(event).nuxtCore.authts;
55
+ await proxyRequest(event, forwardUrl, {
56
+ ...proxyOption,
57
+ onResponse(proxyEvent, _upstreamResponse) {
58
+ const session2 = proxyEvent.context.session;
59
+ if (session2) {
60
+ writeSessionCookie(proxyEvent, session2, sessions);
61
+ }
62
+ }
63
+ });
55
64
  });
56
65
  }
@@ -1,7 +1,11 @@
1
- import { defineNitroPlugin, getCookie, setCookie, useRuntimeConfig } from "#devcoffee-core/server/adapters/http";
1
+ import { defineNitroPlugin, getCookie, useRuntimeConfig } from "#devcoffee-core/server/adapters/http";
2
2
  import useServerLogger from "#devcoffee-core/server/composables/useServerLogger";
3
- import { signSessionId } from "#devcoffee-core/server/core/crypto";
4
- import { refreshTokenIfNeeded, updateSession, validateSession } from "#devcoffee-core/server/core/helpers";
3
+ import {
4
+ refreshTokenIfNeeded,
5
+ updateSession,
6
+ validateSession,
7
+ writeSessionCookie
8
+ } from "#devcoffee-core/server/core/helpers";
5
9
  import { useNitroApp, useStorage } from "nitropack/runtime";
6
10
  export default defineNitroPlugin((nitroApp) => {
7
11
  nitroApp.hooks.hook("request", async (event) => {
@@ -65,18 +69,10 @@ export default defineNitroPlugin((nitroApp) => {
65
69
  event.context.session = session;
66
70
  });
67
71
  nitroApp.hooks.hook("beforeResponse", async (event) => {
68
- const {
69
- cookieOpts,
70
- secret = "",
71
- names: { sessionId: cookieName }
72
- } = useRuntimeConfig(event).nuxtCore.authts.sessions;
72
+ if (event.node.res.headersSent) return;
73
73
  const session = event.context.session;
74
74
  if (session) {
75
- const cookieValue = secret ? signSessionId(session.id, secret) : session.id;
76
- setCookie(event, cookieName, cookieValue, {
77
- ...cookieOpts,
78
- expires: new Date(session.expiresAt)
79
- });
75
+ writeSessionCookie(event, session, useRuntimeConfig(event).nuxtCore.authts.sessions);
80
76
  }
81
77
  });
82
78
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devcoffee/nuxt-core",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },