@hexclave/shared 1.0.9 → 1.0.11
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/dist/ai/unified-prompts/reminders.js +1 -0
- package/dist/ai/unified-prompts/reminders.js.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
- package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +10 -2
- package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
- package/dist/config/schema.d.ts +175 -175
- package/dist/config-rendering.d.ts.map +1 -1
- package/dist/config-rendering.js +7 -2
- package/dist/config-rendering.js.map +1 -1
- package/dist/esm/ai/unified-prompts/reminders.js +1 -0
- package/dist/esm/ai/unified-prompts/reminders.js.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +10 -2
- package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
- package/dist/esm/config/schema.d.ts +175 -175
- package/dist/esm/config-rendering.d.ts.map +1 -1
- package/dist/esm/config-rendering.js +7 -2
- package/dist/esm/config-rendering.js.map +1 -1
- package/dist/esm/hexclave-config-file.d.ts.map +1 -1
- package/dist/esm/hexclave-config-file.js +2 -1
- package/dist/esm/hexclave-config-file.js.map +1 -1
- package/dist/esm/interface/admin-interface.d.ts +9 -1
- package/dist/esm/interface/admin-interface.d.ts.map +1 -1
- package/dist/esm/interface/admin-interface.js +32 -2
- package/dist/esm/interface/admin-interface.js.map +1 -1
- package/dist/esm/interface/admin-metrics.d.ts +123 -7
- package/dist/esm/interface/admin-metrics.d.ts.map +1 -1
- package/dist/esm/interface/admin-metrics.js +21 -2
- package/dist/esm/interface/admin-metrics.js.map +1 -1
- package/dist/esm/interface/conversations.d.ts +27 -27
- package/dist/esm/interface/crud/current-user.d.ts +6 -6
- package/dist/esm/interface/crud/email-outbox.d.ts +228 -228
- package/dist/esm/interface/crud/invoices.d.ts +2 -2
- package/dist/esm/interface/crud/project-api-keys.d.ts +2 -2
- package/dist/esm/interface/crud/projects.d.ts +99 -99
- package/dist/esm/interface/crud/team-member-profiles.d.ts +16 -16
- package/dist/esm/interface/crud/users.d.ts +2 -2
- package/dist/esm/schema-fields.d.ts.map +1 -1
- package/dist/esm/schema-fields.js +1 -1
- package/dist/esm/schema-fields.js.map +1 -1
- package/dist/esm/sessions.d.ts +10 -0
- package/dist/esm/sessions.d.ts.map +1 -1
- package/dist/esm/sessions.js +20 -2
- package/dist/esm/sessions.js.map +1 -1
- package/dist/esm/sessions.test.d.ts +1 -0
- package/dist/esm/sessions.test.js +178 -0
- package/dist/esm/sessions.test.js.map +1 -0
- package/dist/hexclave-config-file.d.ts.map +1 -1
- package/dist/hexclave-config-file.js +2 -1
- package/dist/hexclave-config-file.js.map +1 -1
- package/dist/interface/admin-interface.d.ts +9 -1
- package/dist/interface/admin-interface.d.ts.map +1 -1
- package/dist/interface/admin-interface.js +32 -2
- package/dist/interface/admin-interface.js.map +1 -1
- package/dist/interface/admin-metrics.d.ts +123 -7
- package/dist/interface/admin-metrics.d.ts.map +1 -1
- package/dist/interface/admin-metrics.js +22 -1
- package/dist/interface/admin-metrics.js.map +1 -1
- package/dist/interface/conversations.d.ts +27 -27
- package/dist/interface/crud/current-user.d.ts +6 -6
- package/dist/interface/crud/email-outbox.d.ts +228 -228
- package/dist/interface/crud/invoices.d.ts +2 -2
- package/dist/interface/crud/project-api-keys.d.ts +2 -2
- package/dist/interface/crud/projects.d.ts +99 -99
- package/dist/interface/crud/team-member-profiles.d.ts +16 -16
- package/dist/interface/crud/users.d.ts +2 -2
- package/dist/schema-fields.d.ts.map +1 -1
- package/dist/schema-fields.js +1 -1
- package/dist/schema-fields.js.map +1 -1
- package/dist/sessions.d.ts +10 -0
- package/dist/sessions.d.ts.map +1 -1
- package/dist/sessions.js +20 -2
- package/dist/sessions.js.map +1 -1
- package/dist/sessions.test.d.ts +1 -0
- package/dist/sessions.test.js +178 -0
- package/dist/sessions.test.js.map +1 -0
- package/package.json +1 -1
- package/src/ai/unified-prompts/reminders.ts +1 -0
- package/src/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.ts +10 -2
- package/src/config-rendering.ts +11 -2
- package/src/hexclave-config-file.ts +7 -1
- package/src/interface/admin-interface.ts +49 -2
- package/src/interface/admin-metrics.ts +33 -2
- package/src/schema-fields.ts +4 -1
- package/src/sessions.test.ts +147 -0
- package/src/sessions.ts +26 -0
package/src/sessions.ts
CHANGED
|
@@ -124,6 +124,14 @@ export class InternalSession {
|
|
|
124
124
|
if (ofTokens.refreshToken) {
|
|
125
125
|
return `refresh-${ofTokens.refreshToken}`;
|
|
126
126
|
} else if (ofTokens.accessToken) {
|
|
127
|
+
// Access-only sessions (no refresh token) are keyed by the underlying session's `refresh_token_id`, not the
|
|
128
|
+
// access token string: access tokens get re-minted frequently, and keying by the raw token would spawn a new
|
|
129
|
+
// session (and cold-invalidate every session-scoped cache) on each refresh. Falls back to the raw token if
|
|
130
|
+
// the JWT can't be decoded.
|
|
131
|
+
const refreshTokenId = decodeAccessTokenIfValid(ofTokens.accessToken)?.refresh_token_id;
|
|
132
|
+
if (refreshTokenId) {
|
|
133
|
+
return `access-session-${refreshTokenId}`;
|
|
134
|
+
}
|
|
127
135
|
return `access-${ofTokens.accessToken}`;
|
|
128
136
|
} else {
|
|
129
137
|
return "not-logged-in";
|
|
@@ -210,6 +218,24 @@ export class InternalSession {
|
|
|
210
218
|
return accessToken ? { accessToken, refreshToken: this._refreshToken } : null;
|
|
211
219
|
}
|
|
212
220
|
|
|
221
|
+
/**
|
|
222
|
+
* Installs a freshly obtained token pair's access token into this session in place, keeping the session object
|
|
223
|
+
* (and therefore every session-scoped cache) stable instead of constructing a new InternalSession. No-op if the
|
|
224
|
+
* session is invalid, the access token can't be decoded, it's unchanged, or the pair doesn't map to this session
|
|
225
|
+
* (so a foreign token can never be written into this object's cache); never clears an existing token.
|
|
226
|
+
*/
|
|
227
|
+
updateAccessToken(tokens: { accessToken: string | null, refreshToken: string | null }) {
|
|
228
|
+
if (this._knownToBeInvalid.get()) return;
|
|
229
|
+
if (!tokens.accessToken) return;
|
|
230
|
+
const newAccessToken = AccessToken.createIfValid(tokens.accessToken);
|
|
231
|
+
if (!newAccessToken) return;
|
|
232
|
+
// Self-enforce the "a session never changes which session it belongs to" invariant: only install a token pair
|
|
233
|
+
// that maps to this same session key (validated against the incoming pair, not this session's existing tokens).
|
|
234
|
+
if (InternalSession.calculateSessionKey(tokens) !== this.sessionKey) return;
|
|
235
|
+
if (this._accessToken.get()?.token === newAccessToken.token) return;
|
|
236
|
+
this._accessToken.set(newAccessToken);
|
|
237
|
+
}
|
|
238
|
+
|
|
213
239
|
/**
|
|
214
240
|
* Manually mark the access token as expired, even if the date on its payload may still be valid.
|
|
215
241
|
*
|